Cleaning (์ ์ )
- corpus๋ก๋ถํฐ ๋ ธ์ด์ฆ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐ
- ๋ ธ์ด์ฆ ๋ฐ์ดํฐ๋ ํน์ ๋ฌธ์ ์ธ์ ๋ถ์ ๋ชฉ์ ์ ๋ง์ง ์๋ ๋ถํ์ํ ๋จ์ด๋ฅผ ๋งํ๊ธฐ๋ ํจ
1) Removing stopwords
- stopword: ํฐ ์๋ฏธ๊ฐ ์๋ ๋จ์ด (I, my, me, over, ์กฐ์ฌ, ์ ๋ฏธ์ฌ ๋ฑ)
- NLTK์์ ์ ์ํ๊ณ ์์
- ํ๊ตญ์ด ๋ถ์ฉ์ด์ ๊ฒฝ์ฐ๋ ๋ฏธ๋ฆฌ ๋ถ์ฉ์ด ์ฌ์ ์ ์ ์ํด๋๊ณ ์ฌ์ฉ (https://www.ranks.nl/stopwords/korean)
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
stop_words = set(stopwords.words('english'))
text = 'Family is not an important thing. It\'s everything.'
word_tokens = word_tokenize(text)
result = []
for w in word_tokens:
if w not in stop_words:
result.append(w)
print(word_tokens)
print(result) # 'is', 'not', 'an' are removed.
2) Removing rare words
- ๋ฑ์ฅ ๋น๋๊ฐ ์ ์ ๋จ์ด ์ ๊ฑฐ
3) Removing words with very short length
- ์์ด๊ถ ์ธ์ด์์ ๊ธธ์ด๊ฐ ์งง์ ๋จ์ด๋ค์ ๋๋ถ๋ถ stopwords(๋ถ์ฉ์ด)์ ํด๋น๋จ
- ๋ฐ๋ฉด ํ๊ตญ์ด๋ ํ ๊ธ์์ ํจ์ถ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์ ํจํ์ง ์์
- ์์ด ๋จ์ด์ ํ๊ท ๊ธธ์ด๋ 6~7, ํ๊ตญ์ด ๋จ์ด์ ํ๊ท ๊ธธ์ด๋ 2~3
- ๊ทธ๋์ ์์ด ํ ์คํธ์์ ๊ธธ์ด๊ฐ 1์ธ ๋จ์ด๋ฅผ ์ ๊ฑฐํ๋ฉด stopwords์ธ 'a'์ 'I'๊ฐ ์ ๊ฑฐ๋จ
- ๊ธธ์ด๊ฐ 2์ธ ๋จ์ด๋ฅผ ์ ๊ฑฐํ๋ฉด 'it', 'at', to', 'in', 'by' ๋ฑ์ stopwords๊ฐ ์ ๊ฑฐ๋จ
- ๊ธธ์ด๊ฐ 3์ธ ๋จ์ด๋ถํฐ ๋ช ์ฌ๊ฐ ์ ๊ฑฐ๋๊ธฐ ์์ํจ
Normalization (์ ๊ทํ)
- ํํ ๋ฐฉ๋ฒ์ด ๋ค๋ฅธ ๋จ์ด๋ค์ ํตํฉ์์ผ ํ๋์ ๋จ์ด๋ก ๋ง๋ฆ
1) Lemmatization (ํ์ ์ด ์ถ์ถ)
- lemma: ํ์ ์ด
- lemmatization์ ๋จ์ด๊ฐ ๋ค๋ฅธ ํํ๋ฅผ ๊ฐ์ง๋๋ผ๋ ๊ทธ ๋ฟ๋ฆฌ ๋จ์ด๋ฅผ ์ฐพ์๊ฐ ๋จ์ด ๊ฐ์๋ฅผ ์ค์ผ ์ ์๋์ง ํ๋จํจ
- ๊ฐ๋ น 'am', 'are', 'is'์ ํ์ ์ด๋ 'be'
- lemmatization์ ํ๊ธฐ ์ํด์๋ ํํํ์ ํ์ฑ์ ํด์ผ ํจ
- ํํํ์ ํ์ฑ์ ์ด๊ฐ(stem)๊ณผ ์ ์ฌ(affix)๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์
- ์ด๊ฐ: ๋จ์ด์ ์๋ฏธ๋ฅผ ๋ด๊ณ ์๋ ํต์ฌ ๋ถ๋ถ, ์ ์ฌ: ๋จ์ด์ ์ถ๊ฐ์ ์ธ ์๋ฏธ๋ฅผ ์ฃผ๋ ๋ถ๋ถ
- ๊ฐ๋ น cats๋ ์ด๊ฐ 'cat', ์ ์ฌ 's'๋ก ๋ถ๋ฆฌ
- lemmatization์ stemming๊ณผ ๋ค๋ฅด๊ฒ ๋จ์ด์ ํํ๊ฐ ์ ์ ํ ๋ณด์กด๋จ
- ๊ทธ๋ฌ๋ lemmatizer๊ฐ ๋ณธ๋ ๋จ์ด์ ํ์ฌ ์ ๋ณด๋ฅผ ๋ชจ๋ฅด๋ฉด ์ ์ ํ์ง ์์ ๋จ์ด๋ฅผ ์ถ๋ ฅํจ
- lemmatization์ ๋ฌธ๋งฅ์ ๊ณ ๋ คํ๋ฉฐ ๋จ์ด์ ํ์ฌ ์ ๋ณด๋ฅผ ๋ณด์กดํจ (pos ํ๊ทธ๋ฅผ ๋ณด์กด)
- stemming์ ํ์ฌ ์ ๋ณด๋ฅผ ๋ณด์กดํ์ง ์์ผ๋ฉฐ (pos ํ๊ทธ๋ฅผ ๋ณด์กดํ์ง ์์) ๊ฒฐ๊ณผ๊ฐ ์ฌ์ ์ ์๋ ๋จ์ด์ผ ๊ฒฝ์ฐ๊ฐ ๋ง์
from nltk.stem import WordNetLemmatizer
n = WordNetLemmatizer()
words = ['dies', 'watched', 'has']
print([n.lemmatize(w) for w in words]) # ['dy', 'watched', 'ha']
print([n.lemmatize(w, 'v') for w in words]) # ['die', 'watch', 'have']
2) Stemming (์ด๊ฐ ์ถ์ถ)
- ์ด๊ฐ์ ์ถ์ถํ๋ ์์
- ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ์ด๋ฆผ์ก์ ์ด๊ฐ์ ์ถ์ถํจ
- ์ฌ์ธํ ์์ ์ด ์๋๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ์ฌ์ ์ ์๋ ๋จ์ด์ผ ๊ฒฝ์ฐ๊ฐ ๋ง์
- ์ผ๋ฐ์ ์ผ๋ก stemming์ด lemmatization๋ณด๋ค ๋น ๋ฆ
- stemmer๋ง๋ค ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ์ ํ ๋ค๋ฅผ ์ ์์
- corpus์ stemmer๋ฅผ ์ ์ฉํด๋ณด๊ณ ์ ์ ํ stemmer๋ฅผ ๊ณจ๋ผ์ผ ํจ
- stemming ๊ฒฐ๊ณผ๊ฐ ์ง๋์น๊ฒ ์ผ๋ฐํ๊ฐ ๋์๊ฑฐ๋ ์ผ๋ฐํ๊ฐ ๋ ๋ ๊ฒฝ์ฐ๊ฐ ์๊น
- ๊ฐ๋ น 'organization'๊ณผ 'organ'์ ์ ํ ๋ค๋ฅธ ๋จ์ด์ง๋ง stemming ๊ฒฐ๊ณผ 'organ'์ผ๋ก ๋์ผํ ์ ์์
from nltk.stem import PorterStemmer, LancasterStemmer
p = PorterStemmer()
l = LancasterStemmer()
words = ['policy', 'organization']
print([p.stem(w) for w in words]) # ['polici', 'organ']
print([l.stem(w) for w in words]) # ['policy', 'org']
3) ๋์๋ฌธ์ ํตํฉ
- ๋์๋ฌธ์๊ฐ ๊ตฌ๋ถ๋์ด์ผ ํ๋ ์ํฉ๋ ์์ (US vs us / ๊ณ ์ ๋ช ์ฌ์ ์๊ธ์)
- ๋ฐ๋ผ์ ์ธ์ ์๋ฌธ์ ๋ณํ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ ML ์ํ์ค ๋ชจ๋ธ์ ์ด์ฉํ ์ ์์
- ๊ทธ๋ฌ๋ corpus ์์ฒด์์ ๋์๋ฌธ์๊ฐ ์์ ๋กญ๊ฒ ์ฐ์๋ค๋ฉด ์๋ฏธ๊ฐ ์์ด ๋ชจ๋ corpus๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พธ๋ ๊ฒ ๋์์๋
References
'๋จธ์ ๋ฌ๋, ๋ฅ๋ฌ๋ > Paper Classification' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4/23 ํด๋ดค๋ ๊ฒ ์ ๋ฆฌ (0) | 2020.04.24 |
---|---|
NLP Encoding (wikidocs) (0) | 2020.03.19 |
NLP Tokenization (wikidocs) (0) | 2020.03.16 |
NLP tutorial (wikidocs) (0) | 2020.03.16 |
Research paper classification systems based on TF-IDF and LDA schemes (0) | 2020.03.03 |
๋๊ธ