konlpy 설치
- Konlpy(코엔엘파이): 한글 형태소 분석기
!pip install konlpy
from konlpy.tag import Okt # Open Korean Text: 트위터에서 만든 오픈소스 한국어 처리기
okt = Okt()
okt.morphs('한글 형태소 분석기') #morphs : 형태소 분석기
# 의미를 가지는 가장 작은 단위로 쪼갠다
['한글', '형태소', '분석', '기']
okt.nouns('한글 형태소 분석기') #nouns : 명사 추출
['한글', '형태소', '분석', '기']
okt.pos('한글 형태소 분석기') #pos : 매핑된 품사
[('한글', 'Noun'), ('형태소', 'Noun'), ('분석', 'Noun'), ('기', 'Noun')]
okt.tagset
{'Adjective': '형용사',
'Adverb': '부사',
'Alpha': '알파벳',
'Conjunction': '접속사',
'Determiner': '관형사',
'Eomi': '어미',
'Exclamation': '감탄사',
'Foreign': '외국어, 한자 및 기타기호',
'Hashtag': '트위터 해쉬태그',
'Josa': '조사',
'KoreanParticle': '(ex: ㅋㅋ)',
'Noun': '명사',
'Number': '숫자',
'PreEomi': '선어말어미',
'Punctuation': '구두점',
'ScreenName': '트위터 아이디',
'Suffix': '접미사',
'Unknown': '미등록어',
'Verb': '동사'}
from konlpy.tag import Kkma
kkma = Kkma()
kkma.morphs('한글 형태소 분석기')
['한글', '형태소', '분석기']
Konlpy 모델들의 속도차이


Countvectorizer에 연결해서 사용
from sklearn.feature_extraction.text import CountVectorizer
c = CountVectorizer()
c.fit(['나는 어제 밥을 먹었다.',
'어제 영화는 너무 재밌었다.']) #CountVectorizer로 fit하는 순간 vocabulary 생성
c.vocabulary_
{'나는': 0, '어제': 4, '밥을': 3, '먹었다': 2, '영화는': 5, '너무': 1, '재밌었다': 6}
def myTokenizer(text):
return kkma.nouns(text)
c2 = CountVectorizer(tokenizer=myTokenizer)
c2.fit(['나는 어제 밥을 먹었다.',
'어제 영화는 너무 재밌었다.'])
c2.vocabulary_
{'나': 0, '어제': 2, '밥': 1, '영화': 3}
네이버 한글 영화 리뷰 데이터 감성분석 실습
import pandas as pd
text_train = pd.read_csv('./data/ratings/ratings_train.txt', delimiter="\t")
text_test= pd.read_csv('./data/ratings/ratings_test.txt', delimiter="\t")
text_train
id document label
0 9976970 아 더빙.. 진짜 짜증나네요 목소리 0
1 3819312 흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나 1
2 10265843 너무재밓었다그래서보는것을추천한다 0
3 9045019 교도소 이야기구먼 ..솔직히 재미는 없다..평점 조정 0
4 6483659 사이몬페그의 익살스런 연기가 돋보였던 영화!스파이더맨에서 늙어보이기만 했던 커스틴 ... 1
... ... ... ...
149995 6222902 인간이 문제지.. 소는 뭔죄인가.. 0
149996 8549745 평점이 너무 낮아서... 1
149997 9311800 이게 뭐요? 한국인은 거들먹거리고 필리핀 혼혈은 착하다? 0
149998 2376369 청춘 영화의 최고봉.방황과 우울했던 날들의 자화상 1
149999 9619869 한국 영화 최초로 수간하는 내용이 담긴 영화 0
150000 rows × 3 columns
text_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150000 entries, 0 to 149999
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 150000 non-null int64
1 document 149995 non-null object
2 label 150000 non-null int64
dtypes: int64(2), object(1)
memory usage: 3.4+ MB
text_train.dropna(inplace =True)
text_test.dropna(inplace =True) # document 결측치5개있는거 나머지 5개씩 삭제
X_train = text_train['document']
y_train = text_train['label']
X_test = text_test['document']
y_test = text_test['label']
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
(149995,)
(149995,)
(49997,)
(49997,)
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
pipe_line = make_pipeline(CountVectorizer(),LogisticRegression())
pipe_line.fit(X_train,y_train)
pipe_line.score(X_test,y_test)
0.814428865731944
pipe_line.predict(['와 이 영화 너무 꿀잼',
'무슨 이런 영화를 돈주고 보나',
'주연 배우의 발연기가 돋보이는 영화!',
'돈 아까운 영화',
'영화를 보고 있는 시간이 아까웠다.',
'배우들의 연기가 만족스럽습니다.'])
array([1, 0, 0, 0, 0, 1], dtype=int64)
어떤 단어가 긍정/부정에 영향을 미칠까???
c_model = pipe_line.steps[0][1]
l_model = pipe_line.steps[1][1]
df = pd.DataFrame([
c_model.vocabulary_.keys(),
c_model.vocabulary_.values()
])
df.head()
0 1 2 3 4 5 6 7 8 9 ... 293356 293357 293358 293359 293360 293361 293362 293363 293364 293365
0 더빙 진짜 짜증나네요 목소리 포스터보고 초딩영화줄 오버연기조차 가볍지 않구나 너무재밓었다그래서보는것을추천한다 ... 높아서ㅋㅋ carl 세이건으로 디케이드 오즈인데 더블은 뭔죄인가 거들먹거리고 혼혈은 수간하는
1 71119 246232 248358 99567 273335 255126 190112 16352 167602 57394 ... 60705 8822 143023 80079 190555 71115 105744 24486 287413 146244
2 rows × 293366 columns
df=df.T.sort_values(by=1)
df
df['coef'] = l_model.coef_.reshape(-1) # 2차원을 1차원으로 reshape
df.sort_values(by='coef', inplace=True)
df
pos_neg_top30 = pd.concat([
df.head(30)[[0, 'coef']],
df.tail(30)[[0, 'coef']]
])
# df.head(30) 부정에 해당하는 30개
# df.tail(30) 긍정에 해당하는 30개
pos_neg_top30
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname='C:\Windows\Fonts\malgun.ttf').get_name()
rc('font', family = font_name) #한글 안깨지게
plt.figure(figsize=(20,5))
plt.bar(pos_neg_top30[0], pos_neg_top30['coef'])
plt.xticks(rotation =90) #x축 글자 안겹치게 회전
plt.show()
모델저장
import pickle # 파이썬에 등장하는 모든 클래스를 저장 가능
with open('k_m_s_m.pkl', 'wb') as f:
pickle.dump(pipe_line, f) # 저장 할때 dump사용
#저장한 모델 꺼내쓰기
with open('k_m_s_m.pkl', 'rb') as f: #'k_m_s_m.pkl'라는 파일을 'rb'하겠다 alias f로
model=pickle.load(f) # 불러 올때 load사용
model.predict(['짱이다'])
array([1], dtype=int64)
'빅데이터 서비스 교육 > 머신러닝' 카테고리의 다른 글
텍스트 마이닝 (0) | 2022.07.06 |
---|---|
앙상블 모델 (0) | 2022.07.05 |
Linear Model 실습 (0) | 2022.07.01 |
Linear Model (0) | 2022.06.29 |
예제 타이타닉 생존자 예측분석 (0) | 2022.06.24 |