๋ฐ์ดํฐ ์ฌ์ด์ธ์ค์ ํ์ฉ ์ฌ๋ก๋ ๋๋์ ๋ฐ์ดํฐ๊ฐ ์ถ์ ๋์๊ฑฐ๋ ์ถ์ ๋ ์ ์๋ ๊ฑฐ์ ๋ชจ๋ ์ฐ์
๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค.ย ์คํ๋ผ์ธ ๋งค์ฅ๊ณผ ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ๋ ๋ง์ผํ
์บ ํ์ธ์ ์ด๋๋ฆฐ ์ฌ๋๋ค์ด ์ค์ ๋ก ๊ณ ๊ฐ ๊ฒฝํ์ ํ๋ ๊ณณ์ด๋ฉฐ, ํน์ ๋ธ๋๋๋ ํ์ฌ์ ๊ท์คํ ๊ตฌ๋งค ๋ฐ์ดํฐ๊ฐ ์์ง๋๋ ์ฅ์์
๋๋ค. ์ฌ๊ธฐ์์ ์ฌ๋๋ค์ ํน์ ์ํ์ ์ ๋ง๋ก ์ด์ง, ๊ณํ์ ์๋ ๋ค๋ฅธ ๊ฒ์ ์ฌ๋ณผ์ง, ์ผ๋ง๋ฅผ ์ง๋ถํ ์ํฅ์ด ์๋์ง, ๋ค์ ์ด ๊ฐ๊ฒ๋ฅผ ์ฐพ์์ง, ๊ทธ๋ฆฌ๊ณ ์์ ์ ๊ณ ๊ฐ ๊ฒฝํ์ ๋ํด ์ด๋ค ํ๊ธฐ๋ฅผ ๋จ๊ธธ์ง๋ฅผ ์ต์ข
์ ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.ย
์ค์ ๋ก ๊ณ ๊ฐ ํ๊ธฐ๋ ์ ์ฒด ํ๋งค ๊ณผ์ ์์ ๋ฌด์์ ๋ฐ๊พธ๊ฑฐ๋ ๊ฐํํด์ผ ํ๋์ง ๋ถ์ํ๊ณ ์ดํดํ ์ ์๋ ํํํ ๋ฐ์ดํฐ ์์ฒ์
๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ฉด ๋น์ฉ ์ ๊ฐ, ์ด์ ํจ์จ ํฅ์, ๊ณ ๊ฐ ๊ฒฝํ ๊ฐ์ , ์๋ก์ด ๊ธฐํ ๋ฐ๊ตด, ๋น์ฆ๋์ค ์ฑ์ฅ, ๊ถ๊ทน์ ์ผ๋ก๋ ๋งค์ถ ์ฆ๋๊น์ง ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์ด์ ์ด ์์คํ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ด๋ป๊ฒ ๋ถ์ยท๋ชจ๋ธ๋งํด ์จ๊ฒจ์ง ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ณ , ๊ฐ ๊ฐ์ธ ๊ณ ๊ฐ์ ์ ๋ฐ์ ์ธ ๋ฉ์์ง๋ฅผ ํฌ์ฐฉํ ์ ์๋์ง ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์
์์์ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํ์ฉ ์ฌ๋ก: ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์ย
๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ํน์ ํ์ฌ์ ์ ํ์ด๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ณ ๊ฐ์ ๊ฐ์ ์ ์๋์ผ๋ก ์๋ณํ๋ ๊ณผ์ ์
๋๋ค. ๋ณดํต ์จ๋ผ์ธ ์ค๋ฌธ, ์์
๋ฏธ๋์ด, ์ง์ ํฐ์ผ, ํผ๋๋ฐฑ ์์, ์ํ ๋ฆฌ๋ทฐ, ํฌ๋ผ, ์ ํ ํตํ, ์ด๋ฉ์ผ, ์ฑ๋ด ๋ฑ์์ ์์ง๋ ๋น์ ํ ํ
์คํธ ๋ฐ์ดํฐ๊ฐ ๋์์
๋๋ค. ๋จธ์ ๋ฌ๋์์ ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ์์ฐ์ด ์ฒ๋ฆฌ(NLP)๋ฅผ ํตํด ์ํ๋๋ฉฐ, ํต๊ณ์ ยท์ธ์ดํ์ ๋ฐฉ๋ฒ์ ์ ์ฉํด ํ
์คํธ ๋ฐ์ดํฐ์์ ๊ธ์ , ๋ถ์ , ์ค๋ฆฝ ๊ฐ์ฑ์ ์ง์ ์ถ์ถํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋ ๊ฐ์ง ์งํ๋ฅผ ์ฐ์ถํฉ๋๋ค:
๊ทน์ฑ(Polarity): ๊ฐ์ฑ์ด ๊ธ์ ์ธ์ง ๋ถ์ ์ธ์ง๋ฅผ ๋ํ๋
๋๋ค.
๊ฐ๋(Magnitude): ํด๋น ๊ฐ์ฑ์ ๊ฐ๋๋ฅผ ๋ํ๋
๋๋ค.
๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ์คํ ๊ฐ๋ฅํ ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ณ , ๊ณ ๊ฐ์ ๋ถ๋ง์กฑํ๊ฒ ๋ง๋๋ ๋ฐ๋ณต์ ์ธ ์ค๋ ์ด์๋ฅผ ํ์
ยทํด๊ฒฐํ๋ฉฐ, ๊ธ์ ์ ๊ฐ์ ์ ์ด๋๋ ์ ํ/์๋น์ค ๊ธฐ๋ฅ์ ๊ฐํํ๊ณ , ์ ๋ฐ์ ์ผ๋ก ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ ๋ด๋ฆฌ๋๋ก ๋๋ ํ๋ ๋น์ฆ๋์ค์ ํต์ฌ ๋๊ตฌ์
๋๋ค. ์ข ๋ ์ธ๋ถํํ๋ฉด, ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ํตํด ๋ค์์ ํ ์ ์์ต๋๋ค:
๊ณ ๊ฐ ์๋น์ค๋ฅผ ๊ฐ์ ํด ๊ณ ๊ฐ ๊ฒฝํ์ ํฅ์ํ๊ณ ,
๊ณ ๊ฐ ์ถฉ์ฑ๋๋ฅผ ๋์ด๋ฉฐ,
์ดํ๋ฅ ์ ๋ฎ์ถ๊ณ ,
์ ํ๊ณผ ์๋น์ค๋ฅผ ์ ์์ ์
๊ทธ๋ ์ด๋ํ๊ณ ,
๋ง์ผํ
์บ ํ์ธ์ ์ต์ ํํ๊ณ ,
์๋ก์ด ํธ๋ ๋์ ์์ฅ์ ์์ธกํ๋ฉฐ,
์์ฌ ํํ์ ๋๊ฒ ์ ์งํ๊ณ ,
์์ต์ ์ฆ๋ํฉ๋๋ค.
๋ค๋ฅธ ํ
์คํธ ๋ถ์ ๊ณผ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ์ํํ๋ ๋์ ๋ช ๊ฐ์ง ํจ์ ์ ๋ง๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๋ฆฌ๋ทฐ์ ๋ด๊ธด ํ์๋ฅผ NLP ์๊ณ ๋ฆฌ์ฆ์ด ํฌ์ฐฉํ์ง ๋ชปํด ์๋ชป ๋ถ๋ฅํ ์ ์์ต๋๋ค. ๋ํ ๋งค์ฐ ํน์ดํ ์ฝ์ด๋ ๋๋ฌผ๊ฒ ์ฐ์ด๋ ์์ด๋ฅผ ํด์ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
๋ฐ์ดํฐ์
์ค๋น
IMDB ์ํ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์
์ ํ์ฉํด ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
import pandas as pd
movies = pd. read_csv( 'movies.csv' , index_col= 0 ) . reset_index( drop= True )
print ( f'Number of reviews: { movies. shape[ 0 ] : , } \n' )
print ( movies. head( ) ) ์ ๊ณต
Number of reviews: 7 , 501
review label
0 This short spoof can be found on Elite's Mille. . . 0
1 A singularly unfunny musical comedy that artif. . . 0
2 An excellent series, masterfully acted and dir . . . 1
3 The master of movie spectacle Cecil B. De Mill. . . 1
4 I was gifted with this movie as it had such a . . . 0 ์ ๊ณต
์ด์ ๋ ๊ฐ์
๋๋ค. ๊ฐ ๋ฆฌ๋ทฐ์ ํ
์คํธ๊ฐ ๋ด๊ธด ์ด๊ณผ ์ ์ฒด ๊ฐ์ฑ์ ํ๊ฐ๊ฐ์ด ๋ด๊ธด ์ด๋ก, ๊ธ์ (1) ๋๋ ๋ถ์ (0)์
๋๋ค.
๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ์ ๋น์จ์ ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค:
round ( movies[ 'label' ] . value_counts( ) * 100 / len ( movies[ 'label' ] ) ) . convert_dtypes( ) ์ ๊ณต
0 50
1 50
Name: label, dtype: Int64์ ๊ณต
๋ฐ๋ผ์ ๊ธ์ ๊ณผ ๋ถ์ ๋ฆฌ๋ทฐ์ ๋น์ค์ด ๊ฑฐ์ ๊ฐ์ต๋๋ค.
BOW ๋ฐฉ๋ฒ ์ ์ฉย
๋ค์ ๋จ๊ณ๋ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ์์นํ์ผ๋ก ๋ณํํ๋ ๊ฒ์
๋๋ค. ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์์นํ ํน์ฑ๋ง ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํนํ ๊ฐ ๋ฆฌ๋ทฐ์์ ๊ฐ ๋จ์ด๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง ์ธ๋ ํน์ฑ์ ๋ง๋ค ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋จ์ด ์ฃผ๋จธ๋(BOW, bag-of-words)๋ก, ๋ฌธ์์ ๋ฑ์ฅํ๋ ๋ชจ๋ ๋จ์ด์ ์ดํ์ง์ ๊ตฌ์ถํ๊ณ ๊ฐ ๋ฆฌ๋ทฐ์์ ๋จ์ด๋ณ ๋น๋๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฐ ๋จ์ด๋ง๋ค ํด๋น ๋น๋๋ฅผ ๋ด์ ์๋ก์ด ํน์ฑ์ด ๋ง๋ค์ด์ง๋๋ค.
์ฐ๋ฆฌ ๋ฐ์ดํฐ์
์ BOW ๋ฐฉ๋ฒ์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค:
from sklearn. feature_extraction. text import CountVectorizer
vect = CountVectorizer( max_features= 200 )
vect. fit( movies. review)
X_review = vect. transform( movies. review)
X_df = pd. DataFrame( X_review. toarray( ) , columns= vect. get_feature_names( ) )
movies_bow = pd. concat( [ movies[ 'label' ] , X_df] , axis= 1 )
print ( movies_bow. head( ) ) ์ ๊ณต
label 10 about acting action actors actually after again all . . . \
0 0 0 0 0 0 0 0 0 0 0 . . .
1 0 1 0 1 0 1 0 0 0 3 . . .
2 1 0 0 0 0 0 0 1 0 0 . . .
3 1 0 0 0 1 0 0 0 0 0 . . .
4 0 1 0 0 1 0 0 0 0 3 . . .
will with without work world would years you young your
0 0 1 0 0 0 1 0 0 0 0
1 2 7 1 0 0 2 0 3 0 2
2 0 2 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 0 1 1 0
4 0 2 0 1 0 0 0 0 0 0
[ 5 rows x 201 columns] ์ ๊ณต
์ ์ฝ๋์์๋ ์ ํ์ ๋งค๊ฐ๋ณ์์ธ max_features๋ฅผ ์ ์ฉํด ๊ฐ์ฅ ์์ฃผ ์ฐ์ด๋ 200๊ฐ ๋จ์ด๋ง ๊ณ ๋ คํ์ฌ ์ ์ฌ์ ๊ณผ์ ํฉ์ ํผํ์ต๋๋ค.
๊ฐ์ฑ ์์ธก์ ์ํ ์ง๋ํ์ต ๋ชจ๋ธ ์ฌ์ฉ
์ด์ ์ง๋ํ์ต ๋ชจ๋ธ์ ์ฌ์ฉํด ๊ฐ์ฑ์ ์์ธกํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฏธ ๋ ์ด๋ธ์ด ๋ถ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐํ์ผ๋ก ์ ๋ฆฌ๋ทฐ์ ๊ฐ์ฑ์ด ๊ธ์ ๋๋ ๋ถ์ ๋ฒ์ฃผ์ ์ํ๋์ง ์ถ์ ํ๋ ค ํ๋ฏ๋ก, ๋ค์ ํ ๋ฒ ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ก์ง์คํฑ ํ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๋ชจ๋ธ ์ ํ๋๋ฅผ ์ธก์ ํด ๋ณด๊ฒ ์ต๋๋ค:
Accuracy score: 0.754
Confusion matrix:
[ [ 37.62772101 13.23856064 ]
[ 11.32829853 37.80541981 ] ] ์ ๊ณต
๋ชจ๋ธ์ ์ ์ฒด ๋ฆฌ๋ทฐ ์ค ๊ธ์ ์ด์๋ ๊ฒ์ 11%๋ ๋ถ์ ์ผ๋ก, ๋ถ์ ์ด์๋ ๊ฒ์ 13%๋ ๊ธ์ ์ผ๋ก ํ์ํ์ต๋๋ค. ์ ํ๋๋ฅผ ๋์ด๊ธฐ ์ํ ๋ฐฉ์์ผ๋ก๋ ๋ถ์ฉ์ด(์: "about", "will", "you" ๋ฑ์ฒ๋ผ ๋๋ฌด ์์ฃผ ๋ฑ์ฅํด ์ ๋ณด๋์ด ๋ฎ์ ๋จ์ด)๋ฅผ ์ ์ธํ๊ฑฐ๋, ์ดํ์ง์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
BOW ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ฉด ๋ฐ์ดํฐํ๋ ์์ ์๋ฐฑ ํน์ ์์ฒ ๊ฐ์ ์ ํน์ฑ์ด ์๊ธธ ์ ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ถํ์ํ ํน์ฑ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฌด ๋ง์ ์ง๋์น๊ฒ ๋ณต์กํ๊ณ ๊ณผ์ ํฉ๋ ๋ชจ๋ธ์ด ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ทํ๋ก, ๋ชจ๋ธ์ ํจ์๋ฅผ ์ ํํฉ๋๋ค. ์ฌ๊ธฐ์ ์กฐ์ ํ ๋งค๊ฐ๋ณ์๋ C๋ก, ์ ๊ทํ์ ๊ฐ๋๋ฅผ ๋ํ๋
๋๋ค. ์ด ๋งค๊ฐ๋ณ์์ ๊ฐ 100๊ณผ 0.1์ ์ํํด ๋ณด๊ณ , ์ด๋ค ๊ฐ์ด ํ
์คํธ ๋ฐ์ดํฐ์์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค:
lr_1 = LogisticRegression( C= 100 )
lr_1. fit( X_train, y_train)
predictions_1 = lr_1. predict( X_test)
lr_2 = LogisticRegression( C= 0.1 )
lr_2. fit( X_train, y_train)
predictions_2 = lr_2. predict( X_test)
print ( f'Accuracy score, lr_1 model: { round ( accuracy_score( y_test, predictions_1) , 3 ) } \n'
f'Accuracy score, lr_2 model: { round ( accuracy_score( y_test, predictions_2) , 3 ) } \n\n'
f'Confusion matrix for lr_1 model, %:\n { confusion_matrix( y_test, predictions_1) / len ( y_test) * 100 } \n\n'
f'Confusion matrix for lr_2 model, %:\n { confusion_matrix( y_test, predictions_2) / len ( y_test) * 100 } ' ) ์ ๊ณต
Accuracy score, lr_1 model: 0.753
Accuracy score, lr_2 model: 0.756
Confusion matrix for lr_1 model, % :
[ [ 37.53887161 13.32741004 ]
[ 11.32829853 37.80541981 ] ]
Confusion matrix for lr_2 model, % :
[ [ 37.67214571 13.19413594 ]
[ 11.19502443 37.93869391 ] ] ์ ๊ณต
์ ํํ C ๊ฐ๋ค ์ฌ์ด์์ ๋ชจ๋ธ ์ ํ๋์ ์ฐจ์ด๋ ๋ฏธ๋ฏธํฉ๋๋ค. ๋ ๋ง์ ๊ฐ์ ์คํํ๋ฉด ์ฑ๋ฅ์ ๋ ๊ฐ์ ํ ์ ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐพ์ ์๋ ์๊ฒ ์ต๋๋ค. ๋ค๋ง ์ฌ๊ธฐ์๋ ์ ํน์ฑ์ด 200๊ฐ๋ฟ์ด๋ฏ๋ก ๋ชจ๋ธ์ด ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์์, ์ ๊ทํ ๋จ๊ณ๊ฐ ํ์์ ์ด์ง ์์ต๋๋ค.
predict ํจ์๋ฅผ ์ฌ์ฉํด 0 ๋๋ 1์ ๋ ์ด๋ธ์ ์์ธกํ๋ ๋์ , predict_proba๋ก ๊ฐ์ฑ์ ํ๋ฅ ์ ์์ธกํ ์๋ ์์ต๋๋ค. ์ด๋ ์์ธก ํ๋ฅ ์๋ ์ ํ๋๋ ํผ๋ ํ๋ ฌ์ ์ง์ ์ ์ฉํ ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ด๋ฐ ์งํ๋ ํด๋์ค์๋ง ์ ์ฉ๋๋ฏ๋ก, ํ๋ฅ ์ ๋ค์ ํด๋์ค ํํ๋ก ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 0.5 ์ด์์ธ ํ๋ฅ ์ ํด๋์ค 1, ๊ทธ ๋ฏธ๋ง์ ํด๋์ค 0์ผ๋ก ๋ณํ๋ฉ๋๋ค.
lr = LogisticRegression( )
lr. fit( X_train, y_train)
predictions_prob_0 = lr. predict_proba( X_test) [ : , 0 ]
predictions_prob_1 = lr. predict_proba( X_test) [ : , 1 ]
print ( f'First 10 predicted probabilities of class 0: { predictions_prob_0[ : 10 ] . round ( 3 ) } \n'
f'First 10 predicted probabilities of class 1: { predictions_prob_1[ : 10 ] . round ( 3 ) } ' ) ์ ๊ณต
First 10 predicted probabilities of class 0 : [ 0.246 0.143 0.123 0.708 0.001 0.828 0.204 0.531 0.121 0.515 ]
First 10 predicted probabilities of class 1 : [ 0.754 0.857 0.877 0.292 0.999 0.172 0.796 0.469 0.879 0.485 ] ์ ๊ณต
๊ฒฐ๋ก ย
๋ณด๋ค ์ธ๋ฐํ ๊ฐ์ฑ ๋ถ์์ ์ํด ๋ฐ์ดํฐ์
์ ์ ์ฉํ ์ ์๋ ๋ค๋ฅธ ์ ์ฉํ ์ ๊ทผ๋ฒ๋ ๋ง์ต๋๋ค:
๋ฌธ๋งฅ์ ๋ณด์กดํ๊ธฐ ์ํด ๊ฐ๋ณ ๋จ์ด ๋์ n๊ทธ๋จ(๋จ์ด์ ์กฐํฉ) ์ฌ์ฉ,
๋ถ์ฉ์ด ์ ์ธ,
์ํยทํํ ๋น๋ ๊ธฐ์ค์ผ๋ก ์ดํ์ง ํฌ๊ธฐ ์ ํ,
๊ฐ ๋ฆฌ๋ทฐ์ ๊ธธ์ด ๋๋ ๋ฌธ์ฅ๋ถํธ์ ๊ฐ์์ ๊ฐ์ ์์นํ ์ถ๊ฐ ํน์ฑ ์์ฑ(ํ์๋ ๋๋๋ก ๊ฐ์ฑ์ ๊ฐ๋์ ์๊ด ๊ด๊ณ๊ฐ ์์ ์ ์์),
์ซ์, ์ผ๋ถ ๋ฌธ์, ํน์ ๊ธธ์ด์ ๋จ์ด๋ฅผ ์ ์ธํ๊ฑฐ๋ ๋ ๋ณต์กํ ๋จ์ด ํจํด ๊ณ ๋ ค,
์ด๊ฐ ์ถ์ถ๊ณผ ํ์ ์ด ์ถ์ถ ์ ์ฉ, ์ฆ ๋จ์ด๋ฅผ ์ด๊ทผ์ผ๋ก ์ถ์,
BOW๋ณด๋ค ์ ๊ตํ ์ดํ์ง ์์ฑ ๋ฐฉ์ ์ฌ์ฉ. ์๋ฅผ ๋ค์ด TfIdf(์ญ๋ฌธ์ ๋น๋ ๊ฐ์ค์น)๋ ํน์ ๋จ์ด๊ฐ ๋ค๋ฅธ ๋ฆฌ๋ทฐ ๋๋น ํด๋น ๋ฆฌ๋ทฐ์์ ์ผ๋ง๋ ์์ฃผ ๋ฑ์ฅํ๋์ง๋ฅผ ๋ฐ์ํฉ๋๋ค.
TextBlob, SentiWordNet, VADER(Valence Aware Dictionary and Sentiment Reasoner) ๋ฑ ๊ฐ์ฑ ๋ถ์์ ์ํด ์ค๊ณ๋ ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ.
์ด๋ฌํ ๊ธฐ๋ฒ๊ณผ ๊ทธ ์ธ ์ ์ฉํ ๋ฐฉ๋ฒ์ ํตํด ํต์ฐฐ๋ ฅ ์๋ ๊ฐ์ฑ ๋ถ์์ ๋ ๊น์ด ํ๊ตฌํ๊ณ ์ถ๋ค๋ฉด Sentiment Analysis in Python ๊ณผ์ ์ ํ์ธํด ๋ณด์ธ์.
๋ฐ์ดํฐ ์ฌ์ด์ธ์ค์ ํ์ฉ ์ฌ๋ก๋ ๋๋์ ๋ฐ์ดํฐ๊ฐ ์ถ์ ๋์๊ฑฐ๋ ์ถ์ ๋ ์ ์๋ ๊ฑฐ์ ๋ชจ๋ ์ฐ์ ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค.ย ์คํ๋ผ์ธ ๋งค์ฅ๊ณผ ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ๋ ๋ง์ผํ ์บ ํ์ธ์ ์ด๋๋ฆฐ ์ฌ๋๋ค์ด ์ค์ ๋ก ๊ณ ๊ฐ ๊ฒฝํ์ ํ๋ ๊ณณ์ด๋ฉฐ, ํน์ ๋ธ๋๋๋ ํ์ฌ์ ๊ท์คํ ๊ตฌ๋งค ๋ฐ์ดํฐ๊ฐ ์์ง๋๋ ์ฅ์์ ๋๋ค. ์ฌ๊ธฐ์์ ์ฌ๋๋ค์ ํน์ ์ํ์ ์ ๋ง๋ก ์ด์ง, ๊ณํ์ ์๋ ๋ค๋ฅธ ๊ฒ์ ์ฌ๋ณผ์ง, ์ผ๋ง๋ฅผ ์ง๋ถํ ์ํฅ์ด ์๋์ง, ๋ค์ ์ด ๊ฐ๊ฒ๋ฅผ ์ฐพ์์ง, ๊ทธ๋ฆฌ๊ณ ์์ ์ ๊ณ ๊ฐ ๊ฒฝํ์ ๋ํด ์ด๋ค ํ๊ธฐ๋ฅผ ๋จ๊ธธ์ง๋ฅผ ์ต์ข ์ ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.ย
์ค์ ๋ก ๊ณ ๊ฐ ํ๊ธฐ๋ ์ ์ฒด ํ๋งค ๊ณผ์ ์์ ๋ฌด์์ ๋ฐ๊พธ๊ฑฐ๋ ๊ฐํํด์ผ ํ๋์ง ๋ถ์ํ๊ณ ์ดํดํ ์ ์๋ ํํํ ๋ฐ์ดํฐ ์์ฒ์ ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ฉด ๋น์ฉ ์ ๊ฐ, ์ด์ ํจ์จ ํฅ์, ๊ณ ๊ฐ ๊ฒฝํ ๊ฐ์ , ์๋ก์ด ๊ธฐํ ๋ฐ๊ตด, ๋น์ฆ๋์ค ์ฑ์ฅ, ๊ถ๊ทน์ ์ผ๋ก๋ ๋งค์ถ ์ฆ๋๊น์ง ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์ด์ ์ด ์์คํ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ด๋ป๊ฒ ๋ถ์ยท๋ชจ๋ธ๋งํด ์จ๊ฒจ์ง ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ณ , ๊ฐ ๊ฐ์ธ ๊ณ ๊ฐ์ ์ ๋ฐ์ ์ธ ๋ฉ์์ง๋ฅผ ํฌ์ฐฉํ ์ ์๋์ง ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ ์์์ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํ์ฉ ์ฌ๋ก: ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์ย
๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ํน์ ํ์ฌ์ ์ ํ์ด๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ณ ๊ฐ์ ๊ฐ์ ์ ์๋์ผ๋ก ์๋ณํ๋ ๊ณผ์ ์ ๋๋ค. ๋ณดํต ์จ๋ผ์ธ ์ค๋ฌธ, ์์ ๋ฏธ๋์ด, ์ง์ ํฐ์ผ, ํผ๋๋ฐฑ ์์, ์ํ ๋ฆฌ๋ทฐ, ํฌ๋ผ, ์ ํ ํตํ, ์ด๋ฉ์ผ, ์ฑ๋ด ๋ฑ์์ ์์ง๋ ๋น์ ํ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ๋์์ ๋๋ค. ๋จธ์ ๋ฌ๋์์ ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ์์ฐ์ด ์ฒ๋ฆฌ(NLP)๋ฅผ ํตํด ์ํ๋๋ฉฐ, ํต๊ณ์ ยท์ธ์ดํ์ ๋ฐฉ๋ฒ์ ์ ์ฉํด ํ ์คํธ ๋ฐ์ดํฐ์์ ๊ธ์ , ๋ถ์ , ์ค๋ฆฝ ๊ฐ์ฑ์ ์ง์ ์ถ์ถํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋ ๊ฐ์ง ์งํ๋ฅผ ์ฐ์ถํฉ๋๋ค:
๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ์คํ ๊ฐ๋ฅํ ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ณ , ๊ณ ๊ฐ์ ๋ถ๋ง์กฑํ๊ฒ ๋ง๋๋ ๋ฐ๋ณต์ ์ธ ์ค๋ ์ด์๋ฅผ ํ์ ยทํด๊ฒฐํ๋ฉฐ, ๊ธ์ ์ ๊ฐ์ ์ ์ด๋๋ ์ ํ/์๋น์ค ๊ธฐ๋ฅ์ ๊ฐํํ๊ณ , ์ ๋ฐ์ ์ผ๋ก ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ ๋ด๋ฆฌ๋๋ก ๋๋ ํ๋ ๋น์ฆ๋์ค์ ํต์ฌ ๋๊ตฌ์ ๋๋ค. ์ข ๋ ์ธ๋ถํํ๋ฉด, ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ํตํด ๋ค์์ ํ ์ ์์ต๋๋ค:
๋ค๋ฅธ ํ ์คํธ ๋ถ์ ๊ณผ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ ์ํํ๋ ๋์ ๋ช ๊ฐ์ง ํจ์ ์ ๋ง๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๋ฆฌ๋ทฐ์ ๋ด๊ธด ํ์๋ฅผ NLP ์๊ณ ๋ฆฌ์ฆ์ด ํฌ์ฐฉํ์ง ๋ชปํด ์๋ชป ๋ถ๋ฅํ ์ ์์ต๋๋ค. ๋ํ ๋งค์ฐ ํน์ดํ ์ฝ์ด๋ ๋๋ฌผ๊ฒ ์ฐ์ด๋ ์์ด๋ฅผ ํด์ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
๋ฐ์ดํฐ์ ์ค๋น
IMDB ์ํ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์ ์ ํ์ฉํด ๊ณ ๊ฐ ๊ฐ์ฑ ๋ถ์์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์ด์ ๋ ๊ฐ์ ๋๋ค. ๊ฐ ๋ฆฌ๋ทฐ์ ํ ์คํธ๊ฐ ๋ด๊ธด ์ด๊ณผ ์ ์ฒด ๊ฐ์ฑ์ ํ๊ฐ๊ฐ์ด ๋ด๊ธด ์ด๋ก, ๊ธ์ (1) ๋๋ ๋ถ์ (0)์ ๋๋ค.
๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ์ ๋น์จ์ ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค:
๋ฐ๋ผ์ ๊ธ์ ๊ณผ ๋ถ์ ๋ฆฌ๋ทฐ์ ๋น์ค์ด ๊ฑฐ์ ๊ฐ์ต๋๋ค.
BOW ๋ฐฉ๋ฒ ์ ์ฉย
๋ค์ ๋จ๊ณ๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์นํ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์์นํ ํน์ฑ๋ง ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํนํ ๊ฐ ๋ฆฌ๋ทฐ์์ ๊ฐ ๋จ์ด๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง ์ธ๋ ํน์ฑ์ ๋ง๋ค ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋จ์ด ์ฃผ๋จธ๋(BOW, bag-of-words)๋ก, ๋ฌธ์์ ๋ฑ์ฅํ๋ ๋ชจ๋ ๋จ์ด์ ์ดํ์ง์ ๊ตฌ์ถํ๊ณ ๊ฐ ๋ฆฌ๋ทฐ์์ ๋จ์ด๋ณ ๋น๋๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฐ ๋จ์ด๋ง๋ค ํด๋น ๋น๋๋ฅผ ๋ด์ ์๋ก์ด ํน์ฑ์ด ๋ง๋ค์ด์ง๋๋ค.
์ฐ๋ฆฌ ๋ฐ์ดํฐ์ ์ BOW ๋ฐฉ๋ฒ์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค:
์ ์ฝ๋์์๋ ์ ํ์ ๋งค๊ฐ๋ณ์์ธ max_features๋ฅผ ์ ์ฉํด ๊ฐ์ฅ ์์ฃผ ์ฐ์ด๋ 200๊ฐ ๋จ์ด๋ง ๊ณ ๋ คํ์ฌ ์ ์ฌ์ ๊ณผ์ ํฉ์ ํผํ์ต๋๋ค.
๊ฐ์ฑ ์์ธก์ ์ํ ์ง๋ํ์ต ๋ชจ๋ธ ์ฌ์ฉ
์ด์ ์ง๋ํ์ต ๋ชจ๋ธ์ ์ฌ์ฉํด ๊ฐ์ฑ์ ์์ธกํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฏธ ๋ ์ด๋ธ์ด ๋ถ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐํ์ผ๋ก ์ ๋ฆฌ๋ทฐ์ ๊ฐ์ฑ์ด ๊ธ์ ๋๋ ๋ถ์ ๋ฒ์ฃผ์ ์ํ๋์ง ์ถ์ ํ๋ ค ํ๋ฏ๋ก, ๋ค์ ํ ๋ฒ ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ก์ง์คํฑ ํ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๋ชจ๋ธ ์ ํ๋๋ฅผ ์ธก์ ํด ๋ณด๊ฒ ์ต๋๋ค:
๋ชจ๋ธ์ ์ ์ฒด ๋ฆฌ๋ทฐ ์ค ๊ธ์ ์ด์๋ ๊ฒ์ 11%๋ ๋ถ์ ์ผ๋ก, ๋ถ์ ์ด์๋ ๊ฒ์ 13%๋ ๊ธ์ ์ผ๋ก ํ์ํ์ต๋๋ค. ์ ํ๋๋ฅผ ๋์ด๊ธฐ ์ํ ๋ฐฉ์์ผ๋ก๋ ๋ถ์ฉ์ด(์: "about", "will", "you" ๋ฑ์ฒ๋ผ ๋๋ฌด ์์ฃผ ๋ฑ์ฅํด ์ ๋ณด๋์ด ๋ฎ์ ๋จ์ด)๋ฅผ ์ ์ธํ๊ฑฐ๋, ์ดํ์ง์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
BOW ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ฉด ๋ฐ์ดํฐํ๋ ์์ ์๋ฐฑ ํน์ ์์ฒ ๊ฐ์ ์ ํน์ฑ์ด ์๊ธธ ์ ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ถํ์ํ ํน์ฑ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฌด ๋ง์ ์ง๋์น๊ฒ ๋ณต์กํ๊ณ ๊ณผ์ ํฉ๋ ๋ชจ๋ธ์ด ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ทํ๋ก, ๋ชจ๋ธ์ ํจ์๋ฅผ ์ ํํฉ๋๋ค. ์ฌ๊ธฐ์ ์กฐ์ ํ ๋งค๊ฐ๋ณ์๋ C๋ก, ์ ๊ทํ์ ๊ฐ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๋งค๊ฐ๋ณ์์ ๊ฐ 100๊ณผ 0.1์ ์ํํด ๋ณด๊ณ , ์ด๋ค ๊ฐ์ด ํ ์คํธ ๋ฐ์ดํฐ์์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค:
์ ํํ C ๊ฐ๋ค ์ฌ์ด์์ ๋ชจ๋ธ ์ ํ๋์ ์ฐจ์ด๋ ๋ฏธ๋ฏธํฉ๋๋ค. ๋ ๋ง์ ๊ฐ์ ์คํํ๋ฉด ์ฑ๋ฅ์ ๋ ๊ฐ์ ํ ์ ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐพ์ ์๋ ์๊ฒ ์ต๋๋ค. ๋ค๋ง ์ฌ๊ธฐ์๋ ์ ํน์ฑ์ด 200๊ฐ๋ฟ์ด๋ฏ๋ก ๋ชจ๋ธ์ด ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์์, ์ ๊ทํ ๋จ๊ณ๊ฐ ํ์์ ์ด์ง ์์ต๋๋ค.
predict ํจ์๋ฅผ ์ฌ์ฉํด 0 ๋๋ 1์ ๋ ์ด๋ธ์ ์์ธกํ๋ ๋์ , predict_proba๋ก ๊ฐ์ฑ์ ํ๋ฅ ์ ์์ธกํ ์๋ ์์ต๋๋ค. ์ด๋ ์์ธก ํ๋ฅ ์๋ ์ ํ๋๋ ํผ๋ ํ๋ ฌ์ ์ง์ ์ ์ฉํ ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ด๋ฐ ์งํ๋ ํด๋์ค์๋ง ์ ์ฉ๋๋ฏ๋ก, ํ๋ฅ ์ ๋ค์ ํด๋์ค ํํ๋ก ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 0.5 ์ด์์ธ ํ๋ฅ ์ ํด๋์ค 1, ๊ทธ ๋ฏธ๋ง์ ํด๋์ค 0์ผ๋ก ๋ณํ๋ฉ๋๋ค.
๊ฒฐ๋ก ย
๋ณด๋ค ์ธ๋ฐํ ๊ฐ์ฑ ๋ถ์์ ์ํด ๋ฐ์ดํฐ์ ์ ์ ์ฉํ ์ ์๋ ๋ค๋ฅธ ์ ์ฉํ ์ ๊ทผ๋ฒ๋ ๋ง์ต๋๋ค:
์ด๋ฌํ ๊ธฐ๋ฒ๊ณผ ๊ทธ ์ธ ์ ์ฉํ ๋ฐฉ๋ฒ์ ํตํด ํต์ฐฐ๋ ฅ ์๋ ๊ฐ์ฑ ๋ถ์์ ๋ ๊น์ด ํ๊ตฌํ๊ณ ์ถ๋ค๋ฉด Sentiment Analysis in Python ๊ณผ์ ์ ํ์ธํด ๋ณด์ธ์.