[NLP] ํ ์คํธ ๋ฐ์ดํฐ์ ๊ธฐ์ด / ๋ง๋ญ์น, ํ ํฐํ, n-gram
- ๋ณธ ํฌ์คํ ์ ํ์ดํ ์น๋ก ๋ฐฐ์ฐ๋ ์์ฐ์ด ์ฒ๋ฆฌ (ํ๋น๋ฏธ๋์ด) ์ฑ ์ ์ฐธ๊ณ ํด์ ์์ฑ๋ ๊ธ์ ๋๋ค.
1. ํ ์คํธ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ
- ๋ง๋ญ์น (corpus, ์ฝํผ์ค) = ์ผ๋ฐ์ ์ธ ์์ํ ์คํธ์ ์ด ํ ์คํธ์ ์ฐ๊ด๋ค ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๊ฒ
- ์์ํ ์คํธ = ๋ฌธ์(๋ฐ์ดํธ)์ํ์ค ์ด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์๋ฅผ ํ ํฐ์ด๋ผ๋ ์ฐ์๋ ๋จ์๋ก ๋ฌถ์ฌ ์์
- ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ถ์ด์๋ ํ ์คํธ = ์ํ(Sample) or ๋ฐ์ดํฐํฌ์ธํธ ๋ผ๊ณ ๋ถ๋ฆ
- ๋ง๋ญ์น = ์ํ๋ค์ ๋ชจ์ = ๋ฐ์ดํฐ์
2. ํ ํฐํ
- ์ฃผ์ด์ง ๋ง๋ญ์น(์ฝํผ์ค)๋ฅผ ํ ํฐ์ผ๋ก ๋๋๋ ๊ณผ์ ์ ํ ํฐํ ๋ผ๊ณ ํจ
"Maria frapis la verda sorcistino"
ํด๋น ํฐํค์ด ๋ฌธ์์๋ 6๊ฐ์ ํ ํฐ์ด ์กด์ฌ (๊ณต๋ฐฑ๋ฌธ์์ ๊ตฌ๋์ ) ํ๋ค. ํ์ง๋ง ํฐํค์ด๋ ํ๊ตญ์ด์ ๊ฐ์ด '๊ต์ฐฉ์ด'๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๊ต์ฐฉ์ด๋, ์ค์ง์ ์ธ ๋จ์ด ๋๋ ์ด๊ฐ์ ๋ฌธ๋ฒ์ ์ธ ์์๊ฐ ์ฐจ๋ก๋๋ก ๊ฒฐํฉํจ์ผ๋ก์จ ๋ฌธ์ฅ ์์์ ๋ฌธ๋ฒ์ ์ธ ์ญํ ์ด๋ ๊ด๊ณ์ ์ฐจ์ด๋ฅผ ๋ํ๋ด๋ ์ธ์ด์ด๋ค. ์ด๋ด๊ฒฝ์ฐ, 'ํ ํฐ'์ ๊ธฐ์ค์ผ๋ก๋ง ํ ํฐํ๋ฅผ ์งํํ๋ ๊ฒ์ ์ถฉ๋ถํ์ง ์๋ค.
2.1 Spacy ์ NLTK ๋ก ํ ํฐํ ์งํํด๋ณด๊ธฐ
import spacy
nlp = spacy.load('en')
text = "Mary, don't slap the green witch"
print([str(token) for token in nlp(text.lower())])
from nltk.tokenize import TweetTokenizer
tweet = u"Snow White and the Seven Degrees #MakeAMovieCold@midnight:-)"
tokenizer = TweetTokenizer()
print(tokenizer.tokenize(tweet.lower()))
ํด๋น ์ฝ๋์์๋ ํด์ํ ๊ทธ(#), ๋ฉ์ (@), ๊ทธ๋ฆฌ๊ณ :-) ์ด๋ชจํฐ์ฝ์ ์๋ฒฝํ๊ฒ ํ ํฐํ ํ๋ค. ๊ทธ ์ด์ ๋ nltk์์ ์ ๊ณตํ๋ tweettokenizer ๊ธฐ๋ฅ ๋๋ฌธ์ด๋ค. tweettokenizer๋ ์ด๋ชจํฐ์ฝ์ ์ธ์ํ๋ ํ ํฐํ๋ฅผ ์ง์ํ๋ค.
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
print(word_tokenize("Snow White and the Seven Degrees #MakeAMovieCold@midnight:-)"))
๋ง์ฝ ๊ทธ๋ฅ ๋จ์ด ๋จ์๋ก ๋๋๋ ํ ํฌ๋์ด์ ์ธ word_tonkenize๋ฅผ ์ฌ์ฉํ๋ค๋ฉด :-) ์ ๋ฉ์ , ํ ํฌ์ ๊ฐ์ ๊ฒ์ ๋ชจ๋ ๋ถํดํด์ ํ ํฐํ ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ค ํ ํฌํ ๋ฐฉ์์ ์ํ๋์ง์ ๋ํด ๋ช ํํ๊ฒ ํ๋ ๊ฒ์ด ์ถํ ์ ํ๋์ ์ํฅ์ ๋ผ์น ๊ฒ์ด๋ค. ์๋ ๋ธ๋ก๊ทธ์ nltk์์ ์ฌ์ฉ๊ฐ๋ฅํ tokenizer์ ๋ํ ์ค๋ช ์ด ์์ธํ๊ฒ ๋์์๋ค.
NLTK ํจํค์ง ํ์ฉํ ํ ์คํธ ์ ์ฒ๋ฆฌ (1) ํ ํฐํ
NLTK๋ Natural Language ToolKit์ ์ฝ์๋ก ์์ฐ์ด ์ฒ๋ฆฌ ๋ฐ ๋ถ์์ ์ํ ํ์ด์ฌ ํจํค์ง์ ๋๋ค. NLTK๋ ํ ํฐ์์ฑํ๊ธฐ, ํํ์ ๋ถ์, ํ์ฌ ํ๊น ํ๊ธฐ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋ฌธ์ฅ ํ ํฐํ (Sentenc
jaaamj.tistory.com
3. ํ์
- ํ์ = ๋ง๋ญ์น์ ๋ฑ์ฅํ๋ ๊ณ ์ ํ ํ ํฐ
- ๋ง๋ญ์น์ ์๋ ๋ชจ๋ ํ์ ์ ์งํจ = ์ดํ์ฌ์ or ์ดํ
- ๋จ์ด = ๋ด์ฉ์ด / ๋ถ์ฉ์ด๋ก ๊ตฌ๋ถ
- ๋ถ์ฉ์ด = ๊ด์ฌ์ ์ ์น์ฌ ๊ฐ์ ๋๋ถ๋ถ ๋ด์ฉ์ด๋ฅผ ๋ณด์ถฉํ๋ ๋ฌธ๋ฒ์ ์ธ ์ฉ๋๋ก ์ฌ์ฉ
4. n-gram
- n-gram = ํ ์คํธ์ ์๋ ๊ณ ์ ๊ธธ์ด(n)์ ์ฐ์๋ ํ ํฐ ์ํ์ค
- ๋ฐ์ด๊ทธ๋จ = ํ ํฐ ๋ ๊ฐ๋ก ์ด๋ฃจ์ด์ง
- ์ ๋๊ทธ๋จ = ํ ํฐ ํ ๊ฐ๋ก ์ด๋ฃจ์ด์ง
1. n-gram์ ์ดํดํ๊ธฐ ์ํ ํจ์ ์ ์ํด์ ์ดํด๋ณด๊ธฐ
def n_grams(text, n):
return[text[i:i+n] for i in range(len(text)-n+1)]
cleaned = ['mary', ',', "n't", 'slap', 'green', 'witch', '.' ]
print(n_grams(cleaned, 3))
ํ ํฐํ๋ cleaned ๋ฅผ ํธ๋ผ์ด๊ทธ๋จ(3-gram)์ผ๋ก ํํํ๋ ์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ถ๋์๋ค. ๋ฌธ์์ 3๊ฐ์ ๋จ์ด๋ฅผ ๋ฌถ์ด ํ ํฐ ํ๋๋ก ์ทจ๊ธํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
n-gram์ ๊ณ์ฐํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ๊ณผ n-gram๋ชจ๋ธ์ ํ์ฉํ ๊ฒฝ์ฐ์ ํ๊ณ์ ์ ๋ํ ์ค๋ช ์ ์๋ ๋งํฌ์์ ์ฐธ๊ณ ํ ์ ์๋ค.
์ํค๋ ์ค
์จ๋ผ์ธ ์ฑ ์ ์ ์ ๊ณต์ ํ๋ ํ๋ซํผ ์๋น์ค
wikidocs.net