ํ๊ธ NLP ์ฒ๋ฆฌ์ ์ด๋ ค์
์์ด์ ๊ฒฝ์ฐ ๋์ด์ฐ๊ธฐ๋ฅผ ์๋ชปํ๋ฉด ์๋ชป๋ ๋จ์ด ๋๋ ์๋ ๋จ์ด๋ก ์ธ์๋ฉ๋๋ค. ํ์ง๋ง ํ๊ธ์ ๊ฒฝ์ฐ, '์๋ฒ์ง๊ฐ ๋ฐฉ์ ๋ค์ด๊ฐ์ ๋ค'๋ฅผ ์๋ชป ๋์ด์ฐ๊ธฐํ๋ฉด '์๋ฒ์ง ๊ฐ๋ฐฉ์ ๋ค์ด๊ฐ์ ๋ค'๊ฐ ๋์ด ์๋ฏธ๊ฐ ์๊ณก๋๊ฒ ๋ฉ๋๋ค.
๋ํ ์ฃผ์ด๋ ๋ชฉ์ ์ด๋ฅผ ์ํด ์ถ๊ฐ๋๋ ์กฐ์ฌ์ ๊ฒฝ์ฐ ์ ์ฒ๋ฆฌ๋ฅผ ํ ๋ ์ ๊ฑฐํ๊ธฐ๊ฐ ๊น๋ค๋กญ์ต๋๋ค.
'๋ํฌ ์ง์ ์ด๋ ์๋?'์์ '์ง์'์ '์'์ด ๋ปํ๋ ๊ฒ์ด ์กฐ์ฌ์ธ์ง ์๋๋ฉด ๊ธ์๋ํ ๋ ์์ธ์ง ๊ตฌ๋ถํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋์ด์ฐ๊ธฐ๊ฐ ์๋ชป๋ผ์ด '์ง ์'์ผ๋ก ์ด ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค..!
์ด๋ฌํ ๋ฌธ์ ๋ค ๋๋ฌธ์ ํ๊ธ ์ธ์ด ์ฒ๋ฆฌ๊ฐ ๋ผํด์ด ์ฒ๋ฆฌ๋ณด๋ค ์ด๋ ต๋ค๊ณ ํฉ๋๋ค.
์ค์ต
KoNLPy๋ ํ์ด์ฌ์ ๋ํ์ ์ธ ํ๊ธ ํํ์ ํจํค์ง์ ๋๋ค. KoNLPy๋ ์๋ฐ ํํ์ ๋ถ์ ์์ง์ ๋ํผํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Java์ค์น๊ฐ ์ ํ๋์ด์ผ ํฉ๋๋ค.
์ค์น๊ฐ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ธ์ด๋ ์ด ๊ธ์ ์ฐธ๊ณ ํ์ ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์๋ฐ๋ถํฐ ์ค์นํ์๋ฉด ์คํ๋์ค๊บผ์์..!
2021๋ 7์ ๊ธฐ์ค konlpy ์ค์น ๋ฐฉ๋ฒ
ํ์ด์ฌ์์ konlpy๋ฅผ ์ค์นํ๋ค ๊ณ ํต๋ฐ์ ๋ถ๋ค์ ์ํ์ฌ
velog.io
- Oktํจํค์ง ์ฌ์ฉ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด ๊ธ ์ฐธ๊ณ ..!
[์์ฐ์ด ์ฒ๋ฆฌ] konlpy ์ค์น ์ค๋ฅ, okt()์๋ฌ-already loaded in another classloader, SystemErro
์์ฐ์ด ์ฒ๋ฆฌ ์ค์ต์ ํ๊ธฐ ์ํด konlpy๋ฅผ ์ค์นํ๋ ์ค ์ ์ฐจ๋ก์ ์ค๋ฅ๋ฅผ ๋ง์ดํ์ต๋๋ค...๐ญ๐ญ ์ ๋ ํ๊ฒฝ๋ณ์๋ถํฐ pip, konlpy ํธ์ถ ๋ฑ ๋ชจ๋ ๋ถ๋ถ์์ ์๋ฌ๋ฅผ ๊ฒผ์๋๋ฐ์,,,,ใ ๊ด๋ จ ์ง์์ ๊ฑฐ์ ์์ง
byeon-sg.tistory.com
1. ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
train_df=pd.read_csv("ratings_train.txt", sep='\t')
train_df.head(3)
- ํ์ต ๋ฐ์ดํฐ ์ธํธ์ 0๊ณผ 1์ label๊ฐ ๋น์จ ์ดํด๋ณด๊ธฐ
(1์ด ๊ธ์ , 0์ด ๋ถ์ ๊ฐ์ฑ)
train_df['label'].value_counts()
2. ์ ์ฒ๋ฆฌ
train_df์ ๊ฒฝ์ฐ 'document'์ปฌ๋ผ์ null๊ฐ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ณต๋ฐฑ์ผ๋ก ๋ณํํด์ค๋ค.
๋ํ ๋ฌธ์๊ฐ ์๋ ์ซ์์ ๊ฒฝ์ฐ์๋ ๋ถ์์์ ๋จ์ด์ ์ธ ์๋ฏธ๋ก ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ํ์ด์ฌ ์ ๊ท ํํ์ ๋ชจ๋ re๋ฅผ ์ฌ์ฉํด ๊ณต๋ฐฑ์ผ๋ก ๋ณํํด์ค๋ค..!
import re
#train๋ฐ์ดํฐ->null์ ๊ณต๋ฐฑ์ผ๋ก ๋ณํ
train_df = train_df.fillna(' ')
#์ ๊ท ํํ์์ ์ด์ฉํ์ฌ ์ซ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๋ณ๊ฒฝ(์ ๊ท ํํ์์ผ๋ก \d ๋ ์ซ์๋ฅผ ์๋ฏธํจ)
train_df['document'] = train_df['document'].apply( lambda x : re.sub(r"\d+", " ", x) )
#test๋ฐ์ดํฐ ๋ก๋ฉ->null์ ๊ณต๋ฐฑ์ผ๋ก ๋ณํ
test_df = pd.read_csv('ratings_test.txt', sep='\t')
test_df = test_df.fillna(' ')
#์ซ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๋ณ๊ฒฝ
test_df['document'] = test_df['document'].apply( lambda x : re.sub(r"\d+", " ", x) )
3. ํ ํฐํ
ํ๊ธ ํํ์ ์์ง์ Okt(๊ตฌ Twitter)๋ฅผ ์ด์ฉํด ๊ฐ ๋ฌธ์ฅ์ ํ๊ธ ํํ์ ๋จ์ด๋ก ํ ํฐํํ ๋ค TfidfVectorizer๋ก TF-IDF ๋ฐฉ์์ผ๋ก ๋จ์ด๋ฅผ ๋ฒกํฐํ.
from konlpy.tag import Okt
okt = Okt()
def tw_tokenizer(text):
#์
๋ ฅ ์ธ์๋ก ๋ค์ด์จ text๋ฅผ ํํ์ ๋จ์ด๋ก ํ ํฐํ ํ์ฌ list ๊ฐ์ฒด ๋ณํ
tokens_ko = okt.morphs(text)
return tokens_ko
[ํ ์คํธ ๋ถ์] KoNLPy - Twitter ์ค๋ฅ ํด๊ฒฐ
์ฝ๋ from konlpy.tag import Twitter twitter=Twitter() ์ค๋ฅ UserWarning: "Twitter" has changed to "Okt" since KoNLPy v0.4.5. warn('"Twitter" has changed to "Okt" since KoNLPy v0.4.5.') ์์ ์ฝ๋๋ฅผ ์ค..
xod22.tistory.com
- tw_tokenizer() : Tfidfectorizer tokenizer ํ๋ผ๋ฏธํฐ๋ก ๋ฌธ์ฅ์ ํํ์ ๋จ์ด ํํ๋ก ๋ณํํ๋ ํจ์.
~๋ฒกํฐํ~
from sklearn.feature_extraction.text import TfidfVectorizer
#Okt ๊ฐ์ฒด์ morphs()๊ฐ์ฒด๋ฅผ ์ด์ฉํ tokenizer ์ฌ์ฉ
tfidf_vect = TfidfVectorizer(tokenizer= tw_tokenizer, ngram_range=(1,2), min_df=3, max_df=0.9)
tfidf_vect.fit(train_df['document'])
tfidf_matrix_train = tfidf_vect.transform(train_df['document'])
- min_df : ์ต์ ๋น๋๊ฐ์ ์ค์ ํด์ฃผ๋ ํ๋ผ๋ฏธํฐ
DF๋ ํน์ ๋จ์ด๊ฐ ๋ํ๋๋ '๋ฌธ์์ ์;๋ฅผ ์๋ฏธ, ๋จ์ด์ ์๊ฐ ์๋.
min_df๋ฅผ ์ค์ ํ์ฌ ํด๋น ๊ฐ๋ณด๋ค ์์ DF๋ฅผ ๊ฐ์ง ๋จ์ด๋ค์ ์ฌ์ (vocabulary_)์์ ์ ์ธํจ
- max_df : ์ต๋ ๋น๋๊ฐ์ ์ค์ ํด์ฃผ๋ ํ๋ผ๋ฏธํฐ
max_df๋ฅผ ์ค์ ํ์ฌ ํด๋น ๊ฐ๋ณด๋ค ์์ DF๋ฅผ ๊ฐ์ง ๋จ์ด๋ค์ ์ฌ์ (vocabulary_)์์ ์ ์ธํจ
float์ %, int๋ ๊ฐฏ์๋ฅผ ์๋ฏธํจ (ex - 0.80 = ๋ฌธ์์ 80%์ด์์ผ๋ก ๋ํ๋๋ ๋จ์ด ๋ฌด์, 10 = ๋ฌธ์์ 10๊ฐ ์ด์์ผ๋ก ๋ํ๋๋ ๋จ์ด ๋ฌด์)
- ngram_range : ๋จ์ด์ ๋ฌถ์์ ๋ฒ์ ์ค์ ํ๋ผ๋ฏธํฐ
ngram_range = (1, 1) : ๋จ์ด์ ๋ฌถ์์ 1๊ฐ๋ถํฐ 1๊ฐ๊น์ง ์ค์ (one, two, …)
ngram_range = (1, 2) : ๋จ์ด์ ๋ฌถ์์ 1๊ฐ๋ถํฐ 2๊ฐ๊น์ง ์ค์ (go back, good time, one, two, …)
5. ๋ก์ง์คํฑํ๊ท, GridSearchCV๋ฅผ ์ด์ฉํ ์ต์ ํ
-> ์ต์ ์ ํ๋ผ๋ฏธํฐ๊ฐ์ ์ฐพ์
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
#Logistic Regression ์ ์ด์ฉํ์ฌ ๊ฐ์ฑ ๋ถ์ Classification ์ํ
lg_clf = LogisticRegression(random_state=0)
#Parameter C ์ต์ ํ๋ฅผ ์ํด GridSearchCV๋ฅผ ์ด์ฉ
params = { 'C': [1 ,3.5, 4.5, 5.5, 10 ] }
grid_cv = GridSearchCV(lg_clf , param_grid=params , cv=3 ,scoring='accuracy', verbose=1 )
grid_cv.fit(tfidf_matrix_train , train_df['label'] )
print(grid_cv.best_params_ , round(grid_cv.best_score_,4))
~์ ํ๋~
from sklearn.metrics import accuracy_score
#ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํ TfidfVectorizer๋ฅผ ์ด์ฉํ์ฌ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ TF-IDF ๊ฐ์ผ๋ก Feature ๋ณํ
tfidf_matrix_test = tfidf_vect.transform(test_df['document'])
#classifier ๋ GridSearchCV์์ ์ต์ ํ๋ผ๋ฏธํฐ๋ก ํ์ต๋ classifier๋ฅผ ๊ทธ๋๋ก ์ด์ฉ
best_estimator = grid_cv.best_estimator_
preds = best_estimator.predict(tfidf_matrix_test)
print('Logistic Regression ์ ํ๋: ',accuracy_score(test_df['label'],preds))
6. ์ค์ ๋ฌธ์ฅ ํ ์คํธ
test_df['document'][100]
grid_cv.predict(tfidf_vect.transform([test_df['document'][100]]))
- Test 100๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๊ณ , ๊ฐ์ฑ๋ถ์์ ๊ฒฐ๊ณผ 0(๋ถ์ )์ผ๋ก ๋์ค๋๊ฒ์ ๋ณด๋, ๋์์ง์์๊ฒ ๊ฐ๋ค
- transform์ ํ ๋ ๋ฆฌ์คํธ๋ก ๊ฐ์ธ์ฃผ์ด์ผ ํ๋ค.
7. ๊ฐ์ฑ๋ถ๋ฅ ์ ์ฉ
text = '์์ํ๊ณ ํต์พํ ์ก์
์ต๊ณ ์์ด์'
if grid_cv.predict(tfidf_vect.transform([text])) == 0:
print(f'"{text}" -> ๋ถ์ ์ผ ๊ฐ๋ฅ์ฑ์ด {round(grid_cv.predict_proba(tfidf_vect.transform([text]))[0][0],2)}% ์
๋๋ค.')
else:
print(f'"{text}" -> ๊ธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด {round(grid_cv.predict_proba(tfidf_vect.transform([text]))[0][1],2)}% ์
๋๋ค.')
text = '์ฌํ ๋ณด์๋ ์ํ์ค์ ์ ์ผ ์ฌ๋ฏธ์๋ค์'
if grid_cv.predict(tfidf_vect.transform([text])) == 0:
print(f'"{text}" -> ๋ถ์ ์ผ ๊ฐ๋ฅ์ฑ์ด {round(grid_cv.predict_proba(tfidf_vect.transform([text]))[0][0],2)}% ์
๋๋ค.')
else:
print(f'"{text}" -> ๊ธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด {round(grid_cv.predict_proba(tfidf_vect.transform([text]))[0][1],2)}% ์
๋๋ค.')
'๐ ๋จธ์ ๋ฌ๋ | ๋ฅ๋ฌ๋ > ํ ์คํธ ๋ถ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ ์คํธ ๋ถ์] KoNLPy - Twitter ์ค๋ฅ ํด๊ฒฐ (0) | 2022.03.22 |
---|---|
[ํ ์คํธ ๋ถ์] 5. ํ ํฝ ๋ชจ๋ธ๋ง (Topic Modeling) (0) | 2022.03.01 |
[ํ ์คํธ ๋ถ์] 4-2. ๋น์ง๋ ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ ๋ถ์ (0) | 2022.02.27 |
[ํ ์คํธ ๋ถ์] 4-1. ์ง๋ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ ๋ถ์ - IMDB์ํํ (0) | 2022.02.26 |
[ํ ์คํธ ๋ถ์] 3. Bag of Words (BOW) (0) | 2022.02.24 |