๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

์˜์—…์—์„œ์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค: ๊ณ ๊ฐ ๊ฐ์„ฑ ๋ถ„์„

๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค๋ฅผ ํ™œ์šฉํ•ด ๊ณ ๊ฐ์˜ ๊ฐ์ •์„ ๋ถ„์„ํ•˜๊ณ  ์˜์—… ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์œ ์šฉํ•œ ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋„์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

๋ฌด๋ฃŒ ๊ณ„์ • ๋งŒ๋“ค๊ธฐ

์‹ค์Šต ๋ฌธ์ œํ•˜๊ณ  ํŠธ๋ž™ํ•˜์„ธ์š”.

Google๋กœ ๊ณ„์†ํ•˜๊ธฐ๊ณ„์† ์ง„ํ–‰ํ•˜์‹œ๋ฉด ๋‹ค์Œ ์‚ฌํ•ญ์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค: ์ด์šฉ์•ฝ๊ด€ ๋ฐ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๊ทธ๋ฆฌ๊ณ  ๊ท€ํ•˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฏธ๊ตญ์— ์ €์žฅ๋œ๋‹ค๋Š” ์ ์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ธ๊ณต์ง€๋Šฅ ๊ฐœ๋… ์ผ๋Ÿฌ์ŠคํŠธ

๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค์˜ ํ™œ์šฉ ์‚ฌ๋ก€๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ•์ ๋˜์—ˆ๊ฑฐ๋‚˜ ์ถ•์ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฐ์—…๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.ย  ์˜คํ”„๋ผ์ธ ๋งค์žฅ๊ณผ ์ „์ž์ƒ๊ฑฐ๋ž˜ ์›น์‚ฌ์ดํŠธ๋Š” ๋งˆ์ผ€ํŒ… ์บ ํŽ˜์ธ์— ์ด๋Œ๋ฆฐ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ๊ณ ๊ฐ ๊ฒฝํ—˜์„ ํ•˜๋Š” ๊ณณ์ด๋ฉฐ, ํŠน์ • ๋ธŒ๋žœ๋“œ๋‚˜ ํšŒ์‚ฌ์˜ ๊ท€์ค‘ํ•œ ๊ตฌ๋งค ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ง‘๋˜๋Š” ์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‚ฌ๋žŒ๋“ค์€ ํŠน์ • ์ƒํ’ˆ์„ ์ •๋ง๋กœ ์‚ด์ง€, ๊ณ„ํš์— ์—†๋˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ๋ณผ์ง€, ์–ผ๋งˆ๋ฅผ ์ง€๋ถˆํ•  ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€, ๋‹ค์‹œ ์ด ๊ฐ€๊ฒŒ๋ฅผ ์ฐพ์„์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ ์˜ ๊ณ ๊ฐ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์–ด๋–ค ํ›„๊ธฐ๋ฅผ ๋‚จ๊ธธ์ง€๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.ย 

์‹ค์ œ๋กœ ๊ณ ๊ฐ ํ›„๊ธฐ๋Š” ์ „์ฒด ํŒ๋งค ๊ณผ์ •์—์„œ ๋ฌด์—‡์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๊ฐ•ํ™”ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํƒ„ํƒ„ํ•œ ๋ฐ์ดํ„ฐ ์›์ฒœ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋น„์šฉ ์ ˆ๊ฐ, ์šด์˜ ํšจ์œจ ํ–ฅ์ƒ, ๊ณ ๊ฐ ๊ฒฝํ—˜ ๊ฐœ์„ , ์ƒˆ๋กœ์šด ๊ธฐํšŒ ๋ฐœ๊ตด, ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ์žฅ, ๊ถ๊ทน์ ์œผ๋กœ๋Š” ๋งค์ถœ ์ฆ๋Œ€๊นŒ์ง€ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ์†Œ์ค‘ํ•œ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ถ„์„ยท๋ชจ๋ธ๋งํ•ด ์ˆจ๊ฒจ์ง„ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๊ณ , ๊ฐ ๊ฐœ์ธ ๊ณ ๊ฐ์˜ ์ „๋ฐ˜์ ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜์—…์—์„œ์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค ํ™œ์šฉ ์‚ฌ๋ก€: ๊ณ ๊ฐ ๊ฐ์„ฑ ๋ถ„์„ย 

๊ณ ๊ฐ ๊ฐ์„ฑ ๋ถ„์„์€ ํŠน์ • ํšŒ์‚ฌ์˜ ์ œํ’ˆ์ด๋‚˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ๊ฐ์˜ ๊ฐ์ •์„ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์˜จ๋ผ์ธ ์„ค๋ฌธ, ์†Œ์…œ ๋ฏธ๋””์–ด, ์ง€์› ํ‹ฐ์ผ“, ํ”ผ๋“œ๋ฐฑ ์–‘์‹, ์ƒํ’ˆ ๋ฆฌ๋ทฐ, ํฌ๋Ÿผ, ์ „ํ™” ํ†ตํ™”, ์ด๋ฉ”์ผ, ์ฑ—๋ด‡ ๋“ฑ์—์„œ ์ˆ˜์ง‘๋œ ๋น„์ •ํ˜• ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ๋จธ์‹ ๋Ÿฌ๋‹์—์„œ ๊ณ ๊ฐ ๊ฐ์„ฑ ๋ถ„์„์€ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ(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

# Creating new features
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())

# Combining the new features with the label
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)

# Predicting the probability of the 0 class
predictions_prob_0 = lr.predict_proba(X_test)[:, 0]

# Predicting the probability of the 1 class
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 ๊ณผ์ •์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

์ฃผ์ œ