๐ ํ์ด์ฌ ๋จธ์ ๋ฌ๋ ์๋ฒฝ๊ฐ์ด๋ ๊ณต๋ถ ๋ด์ฉ ์ ๋ฆฌ
๐ ์ค์ต ์ฝ๋
https://colab.research.google.com/drive/1UzQNyu-rafb1SQEDcQCeCyYO54ECgULT?usp=sharing
1๏ธโฃ ํ ์คํธ ๋ถ์์ ์ดํด
๐ ๊ฐ์
๐ก NLP ์ ํ ์คํธ ๋ง์ด๋
โ NLP
- ์ธ๊ฐ์ ์ธ์ด๋ฅผ ์ดํดํ๊ณ ํด์ํ๋๋ฐ ์ค์ ์ ๋๊ณ ๋ฐ์
- ํ ์คํธ ๋ง์ด๋์ ํฅ์ํ๊ฒ ํ๋ ๊ธฐ๋ฐ ๊ธฐ์
- ๊ธฐ๊ณ๋ฒ์ญ, ์ง์์๋ต ์์คํ ๋ฑ
โ ํ ์คํธ ๋ง์ด๋
- ๋น์ ํ ํ ์คํธ์์ ์๋ฏธ์๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๊ฒ์ ์ค์
1. ํ ์คํธ ๋ถ๋ฅ : ๋ฌธ์๊ฐ ํน์ ๋ถ๋ฅ ๋๋ ์นดํ ๊ณ ๋ฆฌ์ ์ํ๋ ๊ฒ์ ์์ธกํ๋ ๊ธฐ๋ฒ
ex. ์ ๋ฌธ ๊ธฐ์ฌ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ, ์คํธ๋ฉ์ผ ๊ฒ์ถ๊ณผ ๊ฐ์ ์ง๋ํ์ต
2. ๊ฐ์ฑ๋ถ์ : ํ ์คํธ์์ ๋ํ๋๋ ๊ฐ์ /ํ๋จ/๊ธฐ๋ถ ๋ฑ ์ฃผ๊ด์ ์์๋ฅผ ๋ถ์
ex. ์ ํ ๋ฆฌ๋ทฐ ๋ถ์, ์๊ฒฌ๋ถ์ ๋ฑ ๋น์ง๋ ํ์ต & ์ง๋ํ์ต ์ ์ฉ
3. ํ ์คํธ ์์ฝ : ์ค์ํ ์ฃผ์ ๋ ์ค์ฌ ์ฌ์์ ์ถ์ถํ๋ ๊ธฐ๋ฒ
ex. ํ ํฝ ๋ชจ๋ธ๋ง
4. ํ ์คํธ ๊ตฐ์งํ์ ์ ์ฌ๋ ์ธก์ : ๋น์ทํ ์ ํ์ ๋ฌธ์์ ๋ํด ๊ตฐ์งํ/์ ์ฌ๋ ์ธก์ ์ํ
๐ก ํ ์คํธ ๋ถ์์ ์ดํด
โ ํผ์ฒ ์ถ์ถ (ํผ์ฒ ๋ฒกํฐํ)
- ํ ์คํธ๋ฅผ ๋จ์ด ๊ธฐ๋ฐ์ ๋ค์์ ํผ์ฒ๋ก ์ถ์ถํ๊ณ , ์ด ํผ์ฒ์ ๋จ์ด ๋น๋์์ ๊ฐ์ ์ซ์๊ฐ์ ๋ถ์ฌ ๐ ํ ์คํธ๋ ๋จ์ด์ ์กฐํฉ์ธ ๋ฒกํฐ๊ฐ์ผ๋ก ํํ
- ํ ์คํธ๋ฅผ ๋ฒกํฐ๊ฐ์ ๊ฐ์ง๋ ํผ์ฒ๋ก ๋ณํํ๋ ๊ฒ์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ ์ฉํ๊ธฐ ์ ์ ์ํํด์ผํ ๋งค์ฐ ์ค์ํ ์์์ด๋ค.
- ๋ํ์ ์ธ ํผ์ฒ ๋ฒกํฐํ ๋ณํ ๋ฐฉ๋ฒ : BoW, Word2Vec
โ ๋ถ์ ์ํ ํ๋ก์ธ์ค
1. ํ ์คํธ ์ฌ์ ์ค๋น์์ (์ ์ฒ๋ฆฌ)
- ๋/์๋ฌธ์ ๋ณ๊ฒฝ, ํน์๋ฌธ์ ์ญ์ ๋ฑ์ ํด๋ ์ง
- ๋จ์ด ๋ฑ์ ํ ํฐํ ์์
- ์๋ฏธ์๋ ๋จ์ด ์ ๊ฑฐ ์์
- ์ด๊ทผ ์ถ์ถ (Stemming, Lemmatization)
2. ํผ์ฒ ๋ฒกํฐํ/์ถ์ถ
- ๊ฐ๊ณต๋ ํ ์คํธ์์ ํผ์ฒ๋ฅผ ์ถ์ถํ๊ณ ๋ฒกํฐ ๊ฐ์ ํ ๋นํ๋ค.
- BoW ๐ Count ๊ธฐ๋ฐ, TF-IDF ๊ธฐ๋ฐ
- Word2vec
3. ML ๋ชจ๋ธ ์๋ฆฝ ๋ฐ ํ์ต/์์ธก/ํ๊ฐ
๐ก ๋ถ์ ํจํค์ง
โ NLTK
- ๋ํ์ ์ธ ํ์ด์ฌ NLP ํจํค์ง
- ๋ค์ํ ๋ฐ์ดํฐ์ธํธ์ ์๋ธ ๋ชจ๋์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ NLP ์ ๊ฑฐ์ ๋ชจ๋ ์์ญ์ ์ปค๋ฒํ๊ณ ์์
- ์ํ ์๋ ์ธก๋ฉด์์ ์์ฌ์ : ์ค์ ๋๋ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์์๋ ์ ๋๋ก ํ์ฉ๋์ง ๋ชปํจ
โ Gensim
- ํ ํฝ๋ชจ๋ธ๋ง ๋ถ์ผ์์ ๊ฐ์ฅ ๋๊ฐ์ ๋ํ๋ด๋ ํจํค์ง
- Word2Vec ๊ตฌํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ ์ ๊ณต
โ SpaCy
- ๋ฐ์ด๋ ์ํ ์ฑ๋ฅ, ์ต๊ทผ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ํจํค์ง
๐โ๏ธ ํ๊ตญ์ด ์์ฐ์ด ์ฒ๋ฆฌ : KoNLPy
2๏ธโฃ ํ ์คํธ ์ ์ฒ๋ฆฌ
๐ ๊ฐ์
๐ก ํด๋ ์ง
โ ๋ถํ์ํ ๋ฌธ์, ๊ธฐํธ๋ฑ์ ์ฌ์ ์ ์ ๊ฑฐํ๋ ์์
โ HTML, XML ํ๊ทธ๋ ํน์ ๊ธฐํธ ๋ฑ์ ์ฌ์ ์ ์ ๊ฑฐํ๋ค.
๐ก ์ ๊ทํํ์
๐ก ํ ์คํธ ํ ํฐํ
โ ๋ฌธ์ฅ ํ ํฐํ
- ๋ฌธ์ฅ์ ๋ง์นจํ๋ ๊ฐํ๋ฌธ์(\n) ๋ฑ ๋ฌธ์ฅ์ ๋ง์ง๋ง์ ๋ปํ๋ ๊ธฐํธ์ ๋ฐ๋ผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ํน์ ์ ๊ทํํ์์ ๋ฐ๋ฅธ ๋ฌธ์ฅ ํ ํฐํ๋ ๊ฐ๋ฅํ๋ค.
- sent_tokenize( ) ๊ฐ ๋ฐํํ๋ ๊ฒ์ ๊ฐ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฆฌ์คํธ ๊ฐ์ฒด์ด๋ค.
from nltk import sent_tokenize
import nltk
nltk.download('punkt') # ๋ง์นจํ, ๊ฐํ ๋ฌธ์ ๋ฑ์ ๋ฐ์ดํฐ ์ธํธ ๋ค์ด๋ก๋
text_sample = 'I ate an apple. \ I ate a banana. \ I worked at home.'
sentences = sent_tokenize(text = text_sample)
print(sentences)
### ๐ ๊ฒฐ๊ณผ ####
['I ate an apple.' , 'I ate a banana.', 'I worked at home.']
โ ๋จ์ด ํ ํฐํ
- ๋ฌธ์ฅ์ ๋จ์ด๋ก ํ ํฐํ
- word_tokenize( )
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๋ฐฑ, ์ฝค๋ง, ๋ง์นจํ, ๊ฐํ๋ฌธ์ ๋ฑ์ผ๋ก ๋จ์ด๋ฅผ ๋ถ๋ฆฌํ๋, ์ ๊ทํํ์์ ํตํด ํ ํฐํ๋ฅผ ์ํํ ์๋ ์๋ค.
- BoW ์ ๊ฐ์ด ๋จ์ด์ ์์๊ฐ ์ค์ํ์ง ์๋ค๋ฉด, ๋ฌธ์ฅ ํ ํฐํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ด ํ ํฐํ๋ง ์ฌ์ฉํด๋ ์ถฉ๋ถํ๋ค.
from nltk import word_tokenize
sentence = 'I ate the pizza.'
words = word_tokenize(sentence)
print(words)
## ๐ ๊ฒฐ๊ณผ ##
['I', 'ate', 'the', 'pizza']
๐ ์ผ๋ฐ์ ์ผ๋ก, ํ๋์ ๋ฌธ์์ ๋ํด ๋ฌธ์ฅ ํ ํฐํ๋ฅผ ์ ์ฉํ๊ณ , ๋ถ๋ฆฌ๋ ๊ฐ ๋ฌธ์ฅ์ ๋ํด ๋ค์ ๋จ์ด ํ ํฐํ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๐ ๋ฌธ์ฅ์ ๋จ์ด๋ณ๋ก ํ ํฐํํ ๊ฒฝ์ฐ, ๋ฌธ๋งฅ์ ์ธ ์๋ฏธ๊ฐ ๋ฌด์๋๋ค ๐ n-gram ์ ํตํด ํด๊ฒฐ์ ์๋
๐ n-gram : ์ฐ์๋ n ๊ฐ ๋จ์ด๋ฅผ ํ๋์ ํ ํฐํ ๋จ์๋ก ๋ถ๋ฆฌ
ex. ('I', 'ate'), ('ate', 'the'), ('the', 'pizza')
๐ก ๋ถ์ฉ์ด ์ ๊ฑฐ
โ Stop word
- ๋ถ์์ ํฐ ์๋ฏธ๊ฐ ์๋ ๋จ์ด
- is, the, a, will ๋ฑ ๋ฌธ๋งฅ์ ์ผ๋ก ํฐ ์๋ฏธ๊ฐ ์๋ ๋จ์ด๊ฐ ์ด์ ํด๋นํ๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋จ์ด๋ ๋ฌธ์ฅ ๋ด์ ๋น๋ฒํ๊ฒ ๋ฑ์ฅํ๋ฏ๋ก, ์คํ๋ ค ์ค์ํ ๋จ์ด๋ก ์ธ์ง๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์๋ฏธ์๋ ๋จ์ด๋ฅผ ์ฌ์ ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ์ธ์ด๋ณ๋ก ์ด๋ฌํ ๋ถ์ฉ์ด๋ค์ด ๋ชฉ๋กํ ๋์ด ์๋ค.
import nltk
nltk.download('stopwords')
stopwords = nltk.corpus.stopwords.words('english')
all_tokens = []
# ๐ ๋ถ์ฉ์ด ์ ๊ฑฐ for ๋ฌธ
for sentence in word_tokens:
filtered_words=[]
# ๊ฐ๋ณ ๋ฌธ์ฅ๋ณ๋ก โญtokenize๋ sentence listโญ ์ ๋ํด stop word ์ ๊ฑฐ Loop
for word in sentence:
#์๋ฌธ์๋ก ๋ชจ๋ ๋ณํํฉ๋๋ค.
word = word.lower()
# tokenize ๋ ๊ฐ๋ณ word๊ฐ stop words ๋ค์ ๋จ์ด์ ํฌํจ๋์ง ์์ผ๋ฉด word_tokens์ ์ถ๊ฐ
if word not in stopwords:
filtered_words.append(word)
all_tokens.append(filtered_words)
print(all_tokens)
๐ก ์ด๊ทผ ์ถ์ถ
โ Stemming๊ณผ Lemmatization
- ์์ด์ ๊ฒฝ์ฐ ๊ณผ๊ฑฐ/ํ์ฌ, 3์ธ์นญ ๋จ์ ์ฌ๋ถ, ์งํํ ๋ฑ ๋งค์ฐ ๋ง์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์๋ ๋จ์ด๊ฐ ๋ณํํ๋ค.
- stemming ๊ณผ lemmatization ์ ๋จ์ด์ ์ํ์ ๊ฒฐ๊ณผ๋ก ๋์ถํด์ค๋ค.
- ์ด๋ Lemmatization ์ด ๋ณด๋ค ์ ๊ตํ๊ฒ ์๋ฏธ๋ก ์ ์ธ ๊ธฐ๋ฐ์์ ๋จ์ด์ ์ํ์ ์ฐพ์์ฃผ๋ ๋์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์๋ค.
- Stemming ์ ๋จ์ํ๊ฒ ์ํ ๋จ์ด๋ฅผ ์ฐพ์์ค๋ค.
โ NLTK ํด๋์ค
- Stemmer : Porter, Lancaster, Snowball Stemmer
- Lemmatization : WordNetLemmatizer
from nltk.stem import LancasterStemmer
stemmer = LancasterStemmer()
print(stemmer.stem('happier'),stemmer.stem('happiest'))
## ๐ ๊ฒฐ๊ณผ ##
happy happiest
๐ stemmer ๋ ํ์ฉ์ฌ happy ์ ๋ํ ์ํ์ ์ ๋๋ก ์ฐพ์ง ๋ชปํ๋ค.
from nltk.stem import WordNetLemmatizer
import nltk
nltk.download('wordnet')
lemma = WordNetLemmatizer()
print(lemma.lemmatize('happier','a'),lemma.lemmatize('happiest','a'))
## ๐ ๊ฒฐ๊ณผ ##
happy happy
๐ Lemmatization ์ ๋ณด๋ค ์ ํํ ์ํ ๋จ์ด๋ฅผ ์ถ์ถํด์ฃผ๊ธฐ ์ํ์ฌ ๋จ์ด์ 'ํ์ฌ' ๋ฅผ ์ ๋ ฅํด์ฃผ์ด์ผ ํ๋ค.
* ๋์ฌ : 'v'
* ํ์ฉ์ฌ : 'a'
3๏ธโฃ BoW
๐ ๊ฐ์
๐ก Bag of Words
โ BoW ํผ์ฒ ๋ฒกํฐํ
- ๋ฌธ์๊ฐ ๊ฐ์ง๋ ๋ชจ๋ ๋จ์ด๋ฅผ ๋ฌธ๋งฅ์ด๋ ์์๋ฅผ ๋ฌด์ํ๊ณ ์ผ๊ด์ ์ผ๋ก ๋จ์ด์ ๋ํด ๋น๋ ๊ฐ์ ๋ถ์ฌํด ํผ์ฒ ๊ฐ์ ์ถ์ถํ๋ ๋ชจ๋ธ์ด๋ค.
- ๋ชจ๋ ๋ฌธ์ฅ๋ค์ ๋ํ์ฌ, ๋ชจ๋ ๋จ์ด์์ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ๊ฐ ๋จ์ด๋ฅผ ์นผ๋ผ ํํ๋ก ๋์ดํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋จ์ด์ ๊ณ ์ ์ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ ํ, ๊ฐ๋ณ ๋ฌธ์ฅ์์ ํด๋น ๋จ์ด๊ฐ ๋ํ๋๋ ํ์๋ฅผ ๊ฐ ๋จ์ด์ ๊ธฐ์ฌํ๋ค.
โ ์ฅ๋จ์
๐จ ์ฅ์
- ์ฝ๊ณ ๋น ๋ฅธ ๋ชจ๋ธ ๊ตฌ์ถ์ด ๊ฐ๋ฅ
- ๋จ์ํ ๋จ์ด์ ๋ฐ์ ํ์์ ๊ธฐ๋ฐํ๋, ๋ฌธ์์ ํน์ง์ ์ ์ก์๋ด๋ ๋ชจ๋ธ์ด๋ผ ์ ํต์ ์ผ๋ก ์ฌ๋ฌ ๋ถ์ผ์์ ํ์ฉ๋๊ฐ ๋๋ค.
๐จ ๋จ์
- ๋ฌธ๋งฅ ์๋ฏธ ๋ฐ์ ๋ถ์กฑ : ๋จ์ด์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ด์ ๋ฌธ๋งฅ์ ์๋ฏธ๊ฐ ๋ฌด์๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด n-gram ์ ์ฌ์ฉํ ์ ์์ผ๋ ๋ฌธ๋งฅ์ ์ธ ํด์์ ๋ํด์ ์ ํ์ ์ด๋ค.
- ํฌ์ํ๋ ฌ sparse ๋ฌธ์ : ๋ฌธ์๋ง๋ค ์๋ก ๋ค๋ฅธ ๋จ์ด๋ก ๊ตฌ์ฑ๋๊ธฐ์ ๋ฌธ์๋ง๋ค ๋ํ๋์ง ์๋ ๋จ์ด๊ฐ ํจ์ฌ ๋ง๋ค. ๊ทธ๋ฌ๋ ๋จ์ด ํ๋ ฌ์์ (์ค๋ณต๋์ง ์์) ๋ชจ๋ ๋จ์ด๊ฐ ์ด์ ์์นํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ ์ ๊ฐ์ด 0์ผ๋ก ์ฑ์์ง๋ค๋ ๋จ์ ์ด ์๋ค. ํฌ์ํ๋ ฌ์ ์ผ๋ฐ์ ์ผ๋ก ML ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ๊ณผ ์์ธก ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ฏ๋ก ์ด์ ๋ํ ํน๋ณํ ๊ธฐ๋ฒ์ด ๋ง๋ จ๋์ด ์๋ค.
๐ ๋ฐ์งํ๋ ฌ : ๋๋ถ๋ถ์ ๊ฐ์ด 0์ด ์๋ ์๋ฏธ์๋ ๊ฐ์ผ๋ก ์ฑ์์ง ํ๋ ฌ
๐ก ์ฌ์ดํท๋ฐ CountVectorizer, TfidfVectorizer
โ BOW ์ ํผ์ฒ๋ฒกํฐํ
- ๋ชจ๋ ๋ฌธ์์์ ๋ชจ๋ ๋จ์ด๋ฅผ ์นผ๋ผ ํํ๋ก ๋์ดํ๊ณ ๊ฐ ๋ฌธ์์์ ํด๋น ๋จ์ด์ ํ์๋ ์ ๊ทํ๋ ๋น๋๋ฅผ ๊ฐ์ผ๋ก ๋ถ์ฌํ๋ ๋ฐ์ดํฐ์ธํธ ๋ชจ๋ธ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ
- M๊ฐ์ ๋ฌธ์, ์ด N ๊ฐ์ ๋จ์ด ๐ MxN ํ๋ ฌ
โ CountVectorizer
- ๊ฐ ๋ฌธ์์ ํด๋น ๋จ์ด๊ฐ ๋ํ๋๋ ํ์๊ฐ ํ๋ ฌ์ ๊ฐ ์ ์ ๊ฐ์ ํด๋นํ๋ค.
- ์นด์ดํธ ๊ฐ์ด ๋์์๋ก ์ค์ํ ๋จ์ด๋ก ์ธ์๋๋ค.
- ์นด์ดํธ๋ง ๋ถ์ฌํ๋ค๋ณด๋, ๊ทธ ๋ฌธ์์ ํน์ง์ ๋ํ๋ด๊ธฐ ๋ณด๋ค๋ ์ธ์ด์ ํน์ฑ์ ๋ฌธ์ฅ์์ ์์ฃผ ์ฌ์ฉ๋ ์๋ฐ์ ์๋ ๋จ์ด๊น์ง ๋์ ๊ฐ์ ๋ถ์ฌํ๊ฒ ๋๋ค๋ ๋จ์ ์ด ์๋ค.
- ์ฌ์ดํท๋ฐ์ CountVectorizer ํด๋์ค๋ ๋จ์ง ํผ์ฒ ๋ฒกํฐํ๋ง์ ์ํํ์ง ์์ผ๋ฉฐ ์๋ฌธ์ ์ผ๊ด ๋ณํ, ํ ํฐํ, ์คํฑ ์๋ ํํฐ๋ง ๋ฑ์ ํ ์คํธ ์ ์ฒ๋ฆฌ๋ ํจ๊ป ์ํํ๋ค ๐ ํ ํฌ๋์ด์ง + ๋ฒกํฐํ๋ฅผ ๋์์ ํด์ค๋ค. (๋ฐ๋ก ํ ํฐํ๊น์ง ์งํ๋ ํํ๋ฅผ ๋ฃ์ด์ฃผ์ด๋ ์๊ด์ ์์. ๊ฐ ๋ฌธ์๊ฐ ๋ฆฌ์คํธ ํํ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ๋ง ํ๋ฉด๋จ)
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> corpus = [
... 'This is the first document.',
... 'This document is the second document.',
... 'And this is the third one.',
... 'Is this the first document?',
... ]
>>> vectorizer = CountVectorizer()
>>> X = vectorizer.fit_transform(corpus)
>>> vectorizer.get_feature_names_out()
array(['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third',
'this'], ...)
>>> print(X.toarray())
[[0 1 1 1 0 0 1 0 1]
[0 2 0 1 0 1 1 0 1]
[1 0 0 1 1 0 1 1 1]
๐จ ํ๋ผ๋ฏธํฐ
max_df | โพ ์ ์ฒด ๋ฌธ์์ ๊ฑธ์ณ ๋๋ฌด ๋์ ๋น๋์๋ฅผ ๊ฐ์ง ๋จ์ด ํผ์ฒ ์ ์ธ ๐ max_df = 100 : ์ ์ฒด ๋ฌธ์์ ๊ฑธ์ณ 100๊ฐ ์ดํ๋ก ๋ํ๋๋ ๋จ์ด๋ง ํผ์ฒ๋ก ์ถ์ถ ๐ max_df = 0.9 : ๋ถ๋ ์์์ ์ผ๋ก ๊ฐ์ ์ง์ ํ๋ฉด ์ ์ฒด ๋ฌธ์์ ๊ฑธ์ณ ๋น๋์ 0~90% ๊น์ง์ ๋จ์ด๋ง ํผ์ฒ๋ก ์ถ์ถํ๊ณ ๋๋จธ์ง ์์ 5%๋ ์ถ์ถํ์ง ์์ |
min_df | โพ ์ ์ฒด ๋ฌธ์์ ๊ฑธ์ณ ๋๋ฌด ๋ฎ์ ๋น๋์๋ฅผ ๊ฐ์ง ๋จ์ด ํผ์ฒ ์ ์ธ (๋ณดํต 2~3์ผ๋ก ์ค์ ) โพ ๋๋ฌด ๋ฎ์ ๋น๋๋ก ๋ฑ์ฅํ๋ ๋จ์ด๋ ํฌ๊ฒ ์ค์ํ์ง ์๊ฑฐ๋ garbage ์ฑ ๋จ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ๐ max_df ์ ๋์๋ฐฉ์์ด ๊ฐ์ |
max_features | ์ถ์ถํ๋ ํผ์ฒ์ ๊ฐ์๋ฅผ ์ ํํ๋ฉฐ ์ ์๋ก ๊ฐ์ ์ง์ ํ๋ค. ๊ฐ์ฅ ๋์ ๋น๋๋ฅผ ๊ฐ์ง๋ ๋จ์ด์์ผ๋ก ์ ๋ ฌํด ์ง์ ํ ๊ฐ์๊น์ง๋ง ํผ์ฒ๋ก ์ถ์ถํ๋ค. |
stop_words | 'english' ๋ก ์ง์ ํ๋ฉด ์์ด ๋ถ์ฉ์ด๋ก ์ง์ ๋ ๋จ์ด๋ ์ถ์ถ์์ ์ ์ธํ๋ค. |
n_gram_range | โพ ๋จ์ด ์์๋ฅผ ์ด๋์ ๋ ๋ณด๊ฐํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ โพ ํํ ํํ๋ก (๋ฒ์ ์ต์๊ฐ, ๋ฒ์ ์ต๋๊ฐ) ์ ์ง์ ํ๋ค. ๐ n_gram_range = (1,1) : ํ ํฐํ๋ ๋จ์ด๋ฅผ 1๊ฐ์ฉ ํผ์ฒ๋ก ์ถ์ถํ๋ค. ๐ n_gram_range = (1,2) : ํ ํฐํ๋ ๋จ์ด๋ฅผ 1๊ฐ์ฉ, ๊ทธ๋ฆฌ๊ณ ์์๋๋ก 2๊ฐ์ฉ ๋ฌถ์ด์ ์ถ์ถํ๋ค. |
analyzer | โพ ํผ์ฒ ์ถ์ถ์ ์ํํ ๋จ์๋ฅผ ์ง์ โพ ๊ธฐ๋ณธ๊ฐ : 'word' โพ character ์ ํน์ ๋ฒ์๋ฅผ ํผ์ฒ๋ก ๋ง๋๋ ํน์ ํ ๊ฒฝ์ฐ ๋ฑ์ ์ ์ฉํ ๋ ์ฌ์ฉ๋๋ค. |
token_pattern | โพ ํ ํฐํ๋ฅผ ์ํํ๋ ์ ๊ท ํํ์ ํจํด์ ์ง์ โพ '\b\w\w+\b' ๊ฐ ๋ํด๋ ๊ฐ์ผ๋ก ๊ณต๋ฐฑ, ๊ฐํ๋ฌธ์ ๋ฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋จ์ด๋ถ๋ฆฌ์ ํน์ 2๋ฌธ์ ์ด์์ ๋จ์ด๋ฅผ ํ ํฐ์ผ๋ก ๋ถ๋ฆฌํ๋ค. โพ analyzer='word' ์ผ๋๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅ (๋ณดํต ๋ํดํธ ๊ฐ์ ์ฌ์ฉ) |
tokenizer | ํ ํฐํ๋ฅผ ๋ณ๋์ ์ปค์คํ ํจ์๋ก ์ด์ฉ์ ์ ์ฉ |
โ TF-IDF
- ๊ฐ๋ณ ๋ฌธ์์์ ์์ฃผ ๋ํ๋๋ ๋จ์ด์๋ ๋์ ๊ฐ์ค์น๋ฅผ ์ฃผ๋, ๋ชจ๋ ๋ฌธ์์์ ์ ๋ฐ์ ์ผ๋ก ์์ฃผ ๋ํ๋๋ ๋ฒ์ฉ์ ์ธ ๋จ์ด์ ๋ํด์๋ ํ๋ํฐ๋ฅผ ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฌธ์๋ง๋ค ํ ์คํธ๊ฐ ๊ธธ๊ณ , ๋ฌธ์์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์นด์ดํธ ๋ฐฉ์๋ณด๋ค ๋ ์ข์ ์์ธก ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์๋ค.
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'you know I want your love',
'I like you',
'what should I do ',
]
tfidfv = TfidfVectorizer().fit(corpus)
print(tfidfv.transform(corpus).toarray())
print(tfidfv.vocabulary_)
## ๐ ๊ฒฐ๊ณผ ##
[[0. 0.46735098 0. 0.46735098 0. 0.46735098 0. 0.35543247 0.46735098]
[0. 0. 0.79596054 0. 0. 0. 0. 0.60534851 0. ]
[0.57735027 0. 0. 0. 0.57735027 0. 0.57735027 0. 0. ]]
{'you': 7, 'know': 1, 'want': 5, 'your': 8, 'love': 3, 'like': 2, 'what': 6, 'should': 4, 'do': 0}
๐ก BoW ๋ฒกํฐํ๋ฅผ ์ํ ํฌ์ ํ๋ ฌ
- ํฌ์ํ๋ ฌ์ ๋๋ฌด ๋ง์ ๋ถํ์ํ 0 ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ง์ด ํ์ํ๊ณ , ํ๋ ฌ์ ํฌ๊ธฐ๊ฐ ์ปค์ ์ฐ์ฐ ์์๋ ๋ฐ์ดํฐ ์์ธ์ค๋ฅผ ์ํ ์๊ฐ์ด ๋ง์ด ์๋ชจ๋๋ค.
- ํฌ์ํ๋ ฌ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๋๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ : COO ํ์ , CSR ํ์
- ์ผ๋ฐ์ ์ผ๋ก CSR ํ์์ด ๋ ์ํ ๋ฅ๋ ฅ์ด ๋ฐ์ด๋๊ธฐ ๋๋ฌธ์ COO๋ณด๋จ CSR ๋ฅผ ํ์ฉํ๋ค.
โ ํฌ์ํ๋ ฌ
โ COO
- 0์ด ์๋ ๋ฐ์ดํฐ๋ง ๋ณ๋์ ๋ฐฐ์ด์ ์ ์ฅํ๊ณ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํ๊ณผ ์ด์ ์์น๋ฅผ ๋ณ๋์ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ ๋ฐฉ์
โ CSR
- COO ํ์์ด ํ๊ณผ ์ด์ ์์น๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ๋ฐ๋ณต์ ์ธ ์์น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ๋ฐฉ์
from scipy import sparse
sparse.coo_matrix(data)
sparse.csr_matrix(data)
4๏ธโฃ ํ ์คํธ ๋ถ๋ฅ ์ค์ต
๐ ๋ด์ค ๊ทธ๋ฃน ๋ถ๋ฅ ์ค์ต
๐ก ํ ์คํธ ๋ถ๋ฅ
โ ํน์ ๋ฌธ์์ ๋ถ๋ฅ๋ฅผ ํ์ต ๋ฐ์ดํฐ๋ฅผ ํตํด ํ์ตํด ๋ชจ๋ธ์ ์์ฑํ ๋ค , ์ด ํ์ต ๋ชจ๋ธ์ ์ด์ฉํด ๋ค๋ฅธ ๋ฌธ์์ ๋ถ๋ฅ๋ฅผ ์์ธก
โ ํฌ์ํ๋ ฌ์ ๋ถ๋ฅ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ํํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ก์ง์คํฑํ๊ท
- SVM
- ๋์ด๋ธ ๋ฒ ์ด์ฆ
๐โ๏ธ Countvectorizer , TfidfVectorizer
๐โ๏ธ model : ๋ก์ง์คํฑ ํ๊ท
๐โ๏ธ ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ๋ : GridSearchCV, Pipeline
5๏ธโฃ ๊ฐ์ฑ๋ถ์
๐ ๊ฐ์
๐ก ๊ฐ์ฑ๋ถ์
โ ๋ฌธ์์ ์ฃผ๊ด์ ์ธ ๊ฐ์ฑ/์๊ฒฌ/๊ฐ์ /๊ธฐ๋ถ ๋ฑ์ ํ์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
โ ์์ ๋ฏธ๋์ด, ์ฌ๋ก ์กฐ์ฌ, ์จ๋ผ์ธ ๋ฆฌ๋ทฐ, ํผ๋๋ฐฑ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋จ
โ ํ ์คํธ์ ๋จ์ด์ ๋ฌธ๋งฅ ๐ ๊ฐ์ฑ ์์น๋ฅผ ๊ณ์ฐ ๐ ๊ธ์ ๊ฐ์ฑ ์ง์์ ๋ถ์ ๊ฐ์ฑ ์ง์
์ง๋ํ์ต
- ํ์ต ๋ฐ์ดํฐ + ํ๊น ๋ ์ด๋ธ ๊ฐ
- ํ ์คํธ ๋ถ๋ฅ์ ์ ์ฌํจ
๋น์ง๋ํ์ต
- Lexicon ์ด๋ผ๋ ์ผ์ข ์ ๊ฐ์ฑ ์ดํ ์ฌ์ ์ ์ด์ฉํ๋ค. (ํ๊ธ ์ง์ X)
- ๊ฐ์ฑ ์ดํ ์ฌ์ ์ ์ด์ฉํด ๋ฌธ์์ ๊ธ์ ์ , ๋ถ์ ์ ๊ฐ์ฑ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
- ๋ณดํต ๋ง์ ๊ฐ์ฑ ๋ถ์์ฉ ๋ฐ์ดํฐ๋ ๊ฒฐ์ ๋ ๋ ์ด๋ธ ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์๋ค.
๐จ Polarity score ๊ฐ์ฑ ์ง์
- ๊ฐ์ฑ์ฌ์ ์ ๊ธ์ ๋๋ ๋ถ์ ๊ฐ์ฑ์ ์ ๋๋ฅผ ์๋ฏธํ๋ ์์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๊ฐ์ฑ์ง์๋ ๋จ์ด์ ์์น๋ ์ฃผ๋ณ ๋จ์ด, ๋ฌธ๋งฅ, POS (๋ช ์ฌ/ํ์ฉ์ฌ/๋์ฌ ๋ฑ์ ๋ฌธ๋ฒ ์์ ํ๊น ) ๋ฑ์ ์ฐธ๊ณ ํด ๊ฒฐ์ ๋๋ค.
- NLTK ์ Lexicon ๋ชจ๋
๐ก ๊ฐ์ฑ์ฌ์
๐จ WordNet
- NLP ํจํค์ง์์ ์ ๊ณตํ๋ ๋ฐฉ๋ํ "์๋งจํฑ ๋ถ์"์ ์ ๊ณตํ๋ ์์ด ์ดํ ์ฌ์
- ์๋งจํฑ semantic : ๋ฌธ๋งฅ์์ ์๋ฏธ → ๋์ผํ ๋จ์ด๋ ๋ฌธ์ฅ์ด๋ผ๋ ๋ค๋ฅธ ํ๊ฒฝ๊ณผ ๋ฌธ๋งฅ์์๋ ๋ค๋ฅด๊ฒ ํํ๋๊ฑฐ๋ ์ดํด๋ ์ ์๋ค.
- WordNet ์ ๋ค์ํ ์ํฉ์์ ๊ฐ์ ์ดํ๋ผ๋ ๋ค๋ฅด๊ฒ ์ฌ์ฉ๋๋ ์ดํ์ ์๋งจํฑ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค ๐ ํ์ฌ๋ก ๊ตฌ์ฑ๋ ๊ฐ๋ณ ๋จ์ด๋ฅผ Synset ์ด๋ผ๋ ๊ฐ๋ ์ ์ด์ฉํด ํํํ๋ค.
- NLTK ์์ ์ ๊ณตํ๋ ๊ฐ์ฑ์ฌ์ ์ ์์ธก์ฑ๋ฅ์ ๊ทธ๋ฆฌ ์ข์ง ์๋ค. ์ค์ ์ ๋ฌด ์ ์ฉ์์๋ NLTK ํจํค์ง๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฑ ์ฌ์ ์ ์ ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๐ ๋ํ์ ์ธ ๊ฐ์ฑ์ฌ์
- NLTK ์ WordNet
- SentiWordNet : ๊ฐ์ฑ ๋จ์ด ์ ์ฉ์ WordNet ์ ๊ตฌํํ ๊ฒ
- VADER : ์์ ๋ฏธ๋์ด์ ํ ์คํธ์ ๋ํ ๊ฐ์ฑ๋ถ์์ ์ ๊ณตํ๊ธฐ ์ํ ํจํค์ง
- Pattern : ์์ธก์ฑ๋ฅ์์ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ํจํค์ง. ํ์ด์ฌ 2.X ๋ฒ์ ์์๋ง ๋์ํ๋ค.
โ ํ๊ธ ๊ฐ์ฑ ์ดํ ์ฌ์
โพ KNU : http://dilab.kunsan.ac.kr/knusl.html
โพ KOSAC : http://word.snu.ac.kr/kosac/ , https://github.com/mrlee23/KoreanSentimentAnalyzer
๐ ์ค์ต
from nltk.corpus import wordnet as wn
|
from nltk.corpus import sentiwordnet as swn
|
from nltk.sentiment.vader import SentimentIntensityAnalyzer |
๐จ ์ง๋ํ์ต
ํ ์คํธ ํด๋ ์ง(์ ๊ทํํ์) → train/test dataset → ํ ์คํธ ๋ฒกํฐํ (Count, TF-IDF) + ๋ถ๋ฅ ๋ชจ๋ธ๋ง (๋ก์ง์คํฑํ๊ท) by Pipeline
๐จ ๋น์ง๋ํ์ต
๐โ๏ธ WordNet
from nltk.corpus import wordnet as wn
term = 'present'
synsets = wn.synsets(term)
print('๋ฐํ type' , type(synsets))
print('๋ฐํ ๊ฐ ๊ฐ์', len(synsets))
print('๋ฐํ ๊ฐ', synsets) #๋ฆฌ์คํธ ํํ๋ก ๋ฐํ
###########๊ฒฐ๊ณผ##################
๋ฐํ type <class 'list'>
๋ฐํ ๊ฐ ๊ฐ์ 18
๋ฐํ ๊ฐ [Synset('present.n.01'), Synset('present.n.02'), Synset('present.n.03'), Synset('show.v.01'), Synset('present.v.02'), Synset('stage.v.01'), Synset('present.v.04'), Synset('present.v.05'), Synset('award.v.01'), Synset('give.v.08'), Synset('deliver.v.01'), Synset('introduce.v.01'), Synset('portray.v.04'), Synset('confront.v.03'), Synset('present.v.12'), Synset('salute.v.06'), Synset('present.a.01'), Synset('present.a.02')]
โพ present.n.01
- n : ๋ช ์ฌ
- 01 : present ๊ฐ ๋ช ์ฌ๋ก์ ๊ฐ์ง๋ ์ฌ๋ฌ ์๋ฏธ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ธ๋ฑ์ค
โพ synset : ํ๋์ ๋จ์ด๊ฐ ๊ฐ์ง ์ ์๋ ์ฌ๋ฌ๊ฐ์ง ์๋งจํฑ ์ ๋ณด๋ฅผ ๊ฐ๋ณ ํด๋์ค๋ก ๋ํ๋ธ ๊ฒ
print(synsets[0].name())
print(synsets[0].lexname()) # POS
print(synsets[0].definition()) # ์ ์
print(synsets[0].lemma_names()) # ๋ถ๋ช
์
##################๊ฒฐ๊ณผ#################
present.n.01
noun.time
the period of time that is happening now; any continuous stretch of time including the moment of speech
['present', 'nowadays']
โพ WordNet ์ ์ด๋ค ์ดํ์ ๋ค๋ฅธ ์ดํ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ฌ๋๋ก ๋ํ๋ผ ์ ์๋ค : path_similarity()
๐โ๏ธ SentiWordNet
from nltk.corpus import sentiwordnet as swn
senti_synsets = list(swn.senti_synsets('slow'))
print(type(senti_synsets))
print(len(senti_synsets))
print(senti_synsets)
#############๊ฒฐ๊ณผ################
<class 'list'>
11
[SentiSynset('decelerate.v.01'), SentiSynset('slow.v.02'), SentiSynset('slow.v.03'), SentiSynset('slow.a.01'), SentiSynset('slow.a.02'), SentiSynset('dense.s.04'), SentiSynset('slow.a.04'), SentiSynset('boring.s.01'), SentiSynset('dull.s.08'), SentiSynset('slowly.r.01'), SentiSynset('behind.r.03')]
โพ SentiSynset ๊ฐ์ฒด๋ ๋จ์ด์ ๊ฐ์ฑ์ ๋ํ๋ด๋ ๊ฐ์ฑ์ง์์ ๊ฐ๊ด์ฑ (๊ฐ์ฑ๊ณผ ๋ฐ๋) ๋ฅผ ๋ํ๋ด๋ ๊ฐ๊ด์ฑ ์ง์๋ฅผ ๋ํ๋ด๊ณ ์๋ค. ์ด๋ค ๋จ์ด๊ฐ ์ ํ ๊ฐ์ฑ์ ์ด์ง ์์ผ๋ฉด ๊ฐ๊ด์ฑ ์ง์๋ 1์ด ๋๊ณ , ๊ฐ์ฑ ์ง์๋ ๋ชจ๋ 0์ด ๋๋ค.
father = swn.senti_synset('father.n.01')
print(father.pos_score())
print(father.neg_score())
print(father.obj_score())
#########๊ฒฐ๊ณผ##########
0.0
0.0
1.0
fabulous = swn.senti_synset('fabulous.a.01') #๊ต์ฅํ ์ด๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์์
print(fabulous.pos_score())
print(fabulous.neg_score())
print(fabulous.obj_score())
##############๊ฒฐ๊ณผ###################
0.875
0.125
0.0
โพ IMDB ๊ฐ์ฑํ ๊ฐ์ฑ ๋ถ์ (์ฝ๋ฉ ๋ ธํธ๋ถ ์ฐธ๊ณ )
(1) ๋ฌธ์๋ฅผ ๋ฌธ์ฅ ๋จ์๋ก ๋ถํด
(2) ๋ฌธ์ฅ์ ๋จ์ด ๋จ์๋ก ํ ํฐํํ๊ณ ํ์ฌํ๊น
๐ (1), (2) ๋ฒ์ WordNet ์ ์ด์ฉ
(3) ํ์ฌ ํ๊น ๋ ๋จ์ด ๊ธฐ๋ฐ์ผ๋ก synset ๊ฐ์ฒด์ senti_synset ๊ฐ์ฒด๋ฅผ ์์ฑ
(4) Senti_synsets ์์ ๊ฐ์ ๊ธ์ /๋ถ์ ์ง์๋ฅผ ๊ตฌํ๊ณ ์ด๋ฅผ ๋ชจ๋ ํฉ์ฐํด ํน์ ์๊ณ์น ๊ฐ ์ด์์ผ ๋ ๊ธ์ ๊ฐ์ฑ์ผ๋ก, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ถ์ ๊ฐ์ฑ์ผ๋ก ๋ถ๋ฅ
๐โ๏ธ Vader
โฝ ์์ ๋ฏธ๋์ด์ ๊ฐ์ฑ๋ถ์ ๋ชฉ์
from nltk.sentiment.vader import SentimentIntensityAnalyzer
senti_analyzer = SentimentIntensityAnalyzer()
senti_scores = senti_analyzer.polarity_scores(review_df['review'][0]) # IMDB ๋ฆฌ๋ทฐ ํ๋๋ง ๊ฐ์ง๊ณ ๊ฐ์ฑ๋ถ์ ์ํํด๋ณด๊ธฐ
print(senti_scores)
########๊ฒฐ๊ณผ##########
{'neg': 0.13, 'neu': 0.743, 'pos': 0.127, 'compound': -0.7943}
- polarity_scores() ๋ฉ์๋๋ฅผ ํธ์ถํด ๊ฐ์ฑ ์ ์๋ฅผ ๊ตฌํ๋ค. ๋จ์ด์ ์์น, ์ฃผ๋ณ๋จ์ด, ๋ฌธ๋งฅ, ํ์ฌ POS ๋ฑ์ ์ฐธ๊ณ ํด ๊ฒฐ์ ๋๋ค.
- neg ๋ถ์ , neu ์ค๋ฆฝ, pos ๊ธ์ ์ง์
- compound : neg, neu, pos ๋ฅผ ์ ์ ํ ์กฐํฉํด -1 ์์ 1 ์ฌ์ด์ ๊ฐ์ฑ ์ง์๋ฅผ ํํํ ๊ฐ์ด๋ค. ์ด ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ธ๋ถ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ๋ณดํต 0.1 ์ด์์ด๋ฉด ๊ธ์ ์ผ๋ก, ๊ทธ ์ดํ๋ฉด ๋ถ์ ์ผ๋ก ํ๋จํ๋๋ฐ, ์ํฉ์ ๋ฐ๋ผ ์๊ณ๊ฐ์ ์ ์ ํ ์กฐ์ ํด ์์ธก ์ฑ๋ฅ์ ์กฐ์ ํ ์ ์๋ค.
def vader_polarity(review,threshold=0.1):
analyzer = SentimentIntensityAnalyzer()
scores = analyzer.polarity_scores(review)
# compound ๊ฐ์ ๊ธฐ๋ฐํ์ฌ threshold ์
๋ ฅ๊ฐ๋ณด๋ค ํฌ๋ฉด 1, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ๋ฐํ
agg_score = scores['compound']
final_sentiment = 1 if agg_score >= threshold else 0
return final_sentiment
# apply lambda ์์ ์ด์ฉํ์ฌ ๋ ์ฝ๋๋ณ๋ก vader_polarity( )๋ฅผ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ 'vader_preds'์ ์ ์ฅ
review_df['vader_preds'] = review_df['review'].apply( lambda x : vader_polarity(x, 0.1) )
y_target = review_df['sentiment'].values
vader_preds = review_df['vader_preds'].values
print('#### VADER ์์ธก ์ฑ๋ฅ ํ๊ฐ ####')
get_clf_eval(y_target, vader_preds)
# ์ ํ๋๊ฐ SentiWordNet ๋ณด๋ค ํฅ์๋จ (์ฌํ์จ์ด ํนํ ํฅ์๋จ)
6๏ธโฃ ํ ํฝ๋ชจ๋ธ๋ง - ๋ด์ค๊ทธ๋ฃน
๐ ๊ฐ์
๐ก ํ ํฝ ๋ชจ๋ธ๋ง
โ ๋ฌธ์ ์งํฉ์ ์จ์ด์๋ ์ฃผ์ ๋ฅผ ์ฐพ์๋ด๋ ๊ฒ (๋น์ง๋ํ์ต)
โ ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ์ ํ ํฝ ๋ชจ๋ธ๋ง์ ์จ๊ฒจ์ง ์ฃผ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํํํ ์ ์๋ ์ค์ฌ ๋จ์ด๋ฅผ ํจ์ถ์ ์ผ๋ก ์ถ์ถํ๋ค.
โ LSA (Latent semantic analysis) ์ LDA ๊ธฐ๋ฒ์ด ์์ฃผ ์ฌ์ฉ๋๋ค.
๐ก LDA
โ Latent Dirichlet Allocation
* ์ฐจ์์ถ์์ LDA ์ ์ฝ์ด๋ ๊ฐ์ง๋ง ์๋ก ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์์ ์ฃผ์ํ ๊ฒ
- ์ฌ์ดํท๋ฐ LatentDiricheltAllocation ๋ชจ๋ ์ง์
- LDA ๋ Count ๊ธฐ๋ฐ์ ๋ฒกํฐํ๋ง ์ฌ์ฉํ๋ค.
from sklearn.decomposition import LatentDirichletAllocation
|
โฝ components_ : ๊ฐ๋ณ ํ ํฝ๋ณ๋ก ๊ฐ word ๊ฐ ์ผ๋ง๋ ๋ง์ด ํ ๋น๋์๋์ง์ ๊ดํ ์์น๋ฅผ ๊ฐ์ง๋ค. ์ด ๊ฐ์ด ๋์์๋ก ํด๋น ํ ํฝ์ ์ค์ฌ ๋จ์ด๊ฐ ๋๋ค.
lda = LatentDirichletAllocation(n_components=8, random_state=0)
# โญ n_components : ํ ํฝ ๊ฐ์
lda.fit(feat_vect)
# feat_vect : ๋จ์ด ๋ฒกํฐ ํ๋ ฌ
print(lda.components_.shape)
lda.components_ # ๊ฐ๋ณ ํ ํฝ (8๊ฐ) ๋ณ๋ก ๊ฐ word ํผ์ฒ๊ฐ ์ผ๋ง๋ ๊ทธ ํ ํฝ์ ํ ๋น๋์๋์ง์ ๋ํ ์์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
# ๐ ๋์ ๊ฐ์ผ์๋ก word ํผ์ฒ๋ ๊ทธ ํ ํฝ์ ์ค์ฌ ๋จ์ด๊ฐ ๋๋ค.
โฝ 8๊ฐ์ ํ ํฝ ์ฃผ์ , 1000๊ฐ์ ๋จ์ด
def display_topics(model, feature_names, no_top_words):
for topic_index, topic in enumerate(model.components_):
print('Topic #',topic_index)
# topic_index : #0 ~ #7
# topic : ๊ฐ ํ ํฝ ์ธ๋ฑ์ค์ ํด๋นํ๋ 1000๊ฐ ๋จ์ด ๊ฐ
# components_ array์์ ๊ฐ์ฅ ๊ฐ์ด ํฐ ์์ผ๋ก ์ ๋ ฌํ์ ๋, ๊ทธ ๊ฐ์ array index๋ฅผ ๋ฐํ.
topic_word_indexes = topic.argsort()[::-1]
top_indexes=topic_word_indexes[:no_top_words]
# top_indexes๋์์ธ index๋ณ๋ก feature_names์ ํด๋นํ๋ word feature ์ถ์ถ ํ join์ผ๋ก concat
feature_concat = ' '.join([feature_names[i] for i in top_indexes])
print(feature_concat)
# CountVectorizer๊ฐ์ฒด๋ด์ ์ ์ฒด word๋ค์ ๋ช
์นญ์ get_features_names( )๋ฅผ ํตํด ์ถ์ถ
feature_names = count_vect.get_feature_names()
# Topic๋ณ ๊ฐ์ฅ ์ฐ๊ด๋๊ฐ ๋์ word๋ฅผ 15๊ฐ๋ง ์ถ์ถ
display_topics(lda, feature_names, 15)
# ์ผ๋ฐ์ ์ธ ๋จ์ด๊ฐ ์ฃผ๋ฅผ ์ด๋ฃจ๋ ๊ฒฝ์ฐ์ ํ ํฝ๋ ์๊ณ , topic #2 ์ฒ๋ผ ์ปดํจํฐ ๊ทธ๋ํฝ์ค์ ๊ด๋ จ๋ ์ฃผ์ ์ด๊ฐ ์ถ์ถ๋ ํ ํฝ๋ ์กด์ฌํ๋ค.
๐ก LSA
โ Latent Semantic Analysis
- BOW ๊ธฐ๋ฐ์ ์๋ฒ ๋ฉ์ ๋จ์ด์ ๋น๋์๋ฅผ ์ด์ฉํ์ง๋ง ๋จ์ด์ ์๋ฏธ๋ ๊ณ ๋ คํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด ์๋ค.
- ์ด์ ๋์์ผ๋ก Truncated SVD ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์์ ์ถ์์ํค๊ณ ๋จ์ด์ ์ ์ฌ๋ ์๋ฏธ๋ฅผ ๋์ด๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
'1๏ธโฃ AIโขDS > ๐ NLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[cs224n] 11๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.19 |
---|---|
ํ ์คํธ ๋ถ์ โก (0) | 2022.05.17 |
[cs224n] 10๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.13 |
[cs224n] 9๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.09 |
[cs224n] 8๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.09 |
๋๊ธ