ํ ์คํธ ๋ถ์์์ ์ ์ฒ๋ฆฌ๋ถํฐ BOW๊น์ง ๊ณต๋ถ๋ฅผ ํด๋ณด์๋๋ฐ์!
์ด์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค์ต์ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ฐ์ฑ๋ถ์์ด๋?
: ๋ฌธ์์ ์ฃผ๊ด์ ์ธ ๊ฐ์ฑ/์๊ฒฌ/๊ฐ์ /๊ธฐ๋ถ ๋ฑ์ ํ์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค. ๋ฌธ์์ ๊ธ์๊ฐ ๋ํ๋ด๋ ์ฌ๋ฌ ์ฃผ๊ด์ ์ธ ๋จ์ด์ ๋ฌธ๋งฅ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฑ ์์น๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ค. ๊ฐ์ฑ ์์น๋ฅผ ๊ธ์ /๋ถ์ ์ง์๋ก ๊ตฌ๋ถ์ง์ด ๊ฐ ์ง์๋ฅผ ํฉ์ฐํ์ฌ ๊ธ์ ๋๋ ๋ถ์ ๊ฐ์ฑ์ ๊ฒฐ์ ํ๋ค.
1. ์ง๋ํ์ต ๊ฐ์ฑ๋ถ์ : ํ์ต ๋ฐ์ดํฐ์ ํ๊น ๋ ์ด๋ธ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฑ ๋ถ์ ํ์ต์ ์ํํ ๋ค ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฑ ๋ถ์ ํ์ต์ ์ํํ ๋ค ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅด ๋ฐ์ดํฐ์ ๊ฐ์ฑ์ ์์ธกํ๋ ๋ฐฉ๋ฒ
2. ๋น์ง๋ํ์ต ๊ฐ์ฑ๋ถ์ : 'Lexicon'์ด๋ผ๋ ๊ฐ์ฑ ์ดํ์ฌ์ ์ ์ด์ฉ. ๊ฐ์ฑ ๋ถ์์ ์ํ ์ฉ์ด์ ๋ฌธ๋งฅ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ ํด ๋ฌธ์์ ๊ธ์ /๋ถ์ ์ ํ๋จ
์ค๋์ ๋จผ์ ์ง๋ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ๋ถ์ ์ค์ต์ ํด๋ณด๊ฒ ์ต๋๋ค.

์ง๋ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ๋ถ์ ์ค์ต - IMDB ์ํํ
https://www.kaggle.com/c/word2vec-nlp-tutorial/data
Bag of Words Meets Bags of Popcorn | Kaggle
www.kaggle.com
์บ๊ธ์ ์๋ IMDB ์ํํ์ ๊ธฐ๋ฐ์ผ๋ก ์ค์ต์ ์งํํด๋ณด๊ฒ ์ต๋๋ค!
์ฐ์ ์ ๋งํฌ์์ ๋ฐ์ดํฐ ์ ์ ๋ค์ด ๋ฐ์์ค๋ค.
์ค์ต
1. ๋ฐ์ดํฐ์ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ๋ฐ์ดํฐ ํ์ธ
import pandas as pd
review_df=pd.read_csv("labeledTrainData.tsv", header=0, sep="\t", quoting=3)
review_df.head()
print(review_df['review'][0])
~๋ก๋๋ ๋ฐ์ดํฐ ์ ์ ํผ์ฒ
- ID : ๋ฐ์ดํฐ id
- sentiment : ์ํํ์ sentiment ๊ฒฐ๊ณผ ๊ฐ( target label ). 1์ ๊ธ์ , 0์ ๋ถ์ ์ ํ๊ฐ๋ฅผ ์๋ฏธ
- rivies : ์ํํ์ ํ ์คํธ
2. ๋ฐ์ดํฐ ์ฌ์ ์ฒ๋ฆฌ htmlํ๊ทธ ์ ๊ฑฐ ๋ฏธ์น ์ซ์๋ฌธ์ ์ ๊ฑฐ
import re
review_df['review'] = review_df['review'].str.replace('<br />',' ')
review_df['review'] = review_df['review'].apply(lambda x : re.sub("[^a-zA-Z]"," ",x))
ํ ์คํธ ๊ฐ์ ํ์ธํ ๋ HTMLํ์์์ ์ถ์ถํด <br />ํ๊ทธ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ๋๋ ์ญ์ ํ๋ ๊ฒ์ด ์ข๋ค. ๋ฐ๋ผ์ replaceํจ์๋ฅผ ์ด์ฉํ์ฌ htmlํ๊ทธ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๋ฐ๊ฟ ์ฃผ์๋ค.
๋ํ ์์ด๊ฐ ์๋ ํน์ ๋ฌธ์ ๋ฑ์ ํผ์ฒ๋ก์จ์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณต๋ฐฑ์ผ๋ก ๋ณํํด์ฃผ์๋ค.
์ฌ๊ธฐ์ [^a-zA-Z]์ ์๋ฏธ๋ ์์ด ๋/์๋ฌธ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฐพ๋ ๊ฒ์ด๊ณ ํด๋น ์ด๋ฏธ์ง์์๋ ์์ด๊ฐ ์๋ ๋ฌธ์๋ฅผ ์ฐพ์ ๊ณต๋์ผ๋ก ๋ฐ๊ฟ!
3. ํ์ต/ํ ์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
from sklearn.model_selection import train_test_split
class_df = review_df['sentiment']
feature_df = review_df.drop(['id','sentiment'], axis = 1, inplace=False)
# train/test๋ถ๋ฆฌ
X_train, X_test, y_train, y_test = train_test_split(feature_df, class_df, test_size = 0.3, random_state = 156)
train_test_split ๋ชจ๋์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ ํ๋ จ๋ฐ์ดํฐ์ ํ ์คํธ๋ฐ์ดํฐ๋ก ๋ถํ ํด์ฃผ์๋ค.
4. ๋ชจ๋ธ์์ฑ
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score
BOW์ ํผ์ฒ ๋ฒกํฐํ ๋๊ฐ์ง ๋ฐฉ๋ฒ
1. ์นด์ดํธ ๊ธฐ๋ฐ ๋ฒกํฐํ : ๋น๋์๊ฐ ๋์ ๋จ์ด๋ฅผ ์ค์๋ ๋๊ฒ ์๊ฐ
2. TF-IDF ๊ธฐ๋ฐ ๋ฒกํฐํ : ๋น๋์๊ฐ ๋์ ๋จ์ด๋ฅผ ์ค์๋ ๋๊ฒ ์๊ฐํ์ง๋ง, ๋ชจ๋ ๋ฌธ์์ ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๋จ์ด์ ๋ํด์๋ ํจ๋ํฐ๋ฅผ ๋ถ๊ณผ.
~COUNT ๊ธฐ๋ฐ ๋ฒกํฐํ~
pipeline = Pipeline([
('cnt_vect', CountVectorizer(stop_words = 'english', ngram_range=(1,2))),
('lr_clf',LogisticRegression(C = 10))])
pipeline.fit(X_train['review'], y_train)
pred = pipeline.predict(X_test['review'])
pred_probs = pipeline.predict_proba(X_test['review'])[:,1]
print(accuracy_score(y_test, pred), roc_auc_score(y_test, pred_probs))
1. ์คํฑ์๋๋ english, ngram์ (1,2)๋ก ์ค์ ํด CountVectorization์ ์ํ
2. pipeline์ ํตํด fit, predict
3. ๋ฆฌ๋ทฐ ํ ์คํธ๋ฅผ ํผํฐ ๋ฒกํฐํํ ํ, ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ์์ธก ์ฑ๋ฅ์ ์ธก์
4. pipeline๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ํผ์ฒ ๋ฒกํฐํ์ ๋ก์ง์คํฑํ๊ท๋ชจ๋ธ์ ํ๋ฒ์ ์ํ
์์ธก์ ํ๋์ ROC๋ 0.89, 0.95๋ก ๋๊ฒ ์ธก์ ๋จ
~TFIDF ๊ธฐ๋ฐ ๋ฒกํฐํ~
pipeline = Pipeline([
('tfidf_vect',TfidfVectorizer(stop_words = 'english', ngram_range=(1,2)) ),
('lr_clf',LogisticRegression(C= 10))])
pipeline.fit(X_train['review'], y_train)
pred = pipeline.predict(X_test['review'])
pred_probas = pipeline.predict_proba(X_test['review'])[:,1]
print(accuracy_score(y_test, pred), roc_auc_score(y_test,pred_probas))
1. Count๊ธฐ๋ฐ ๋ฒกํฐํ์ ๋์ผํ ์กฐ๊ฑด์ผ๋ก Tfidf๋ฒกํฐ๋ฅผ ์ด์ฉํ ๋ชจ๋ธ ์์ฑ
2. ์์ธก์ ํ๋์ ROC ๋ชจ๋ ์กฐ๊ธ์ฉ ์ฆ๊ฐํจ
'๐ ๋จธ์ ๋ฌ๋ | ๋ฅ๋ฌ๋ > ํ ์คํธ ๋ถ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ ์คํธ ๋ถ์] 5. ํ ํฝ ๋ชจ๋ธ๋ง (Topic Modeling) (0) | 2022.03.01 |
---|---|
[ํ ์คํธ ๋ถ์] 4-2. ๋น์ง๋ ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ ๋ถ์ (0) | 2022.02.27 |
[ํ ์คํธ ๋ถ์] 3. Bag of Words (BOW) (0) | 2022.02.24 |
[ํ ์คํธ ๋ถ์] 2-3. ํ ์คํธ ์ ์ฒ๋ฆฌ - Stemming๊ณผ Lemmatization (0) | 2022.02.23 |
[ํ ์คํธ ๋ถ์] 2-2. ํ ์คํธ ์ ์ฒ๋ฆฌ - ๋ถ์ฉ์ด ์ ๊ฑฐ (0) | 2022.02.20 |