1. 최소한의 단위를 찾을 것인가
- 영어에서는 토크나이즈
- 우리나라 말에서는 조금 더 필요해서 형태소를 잘라야해서 Morphemanalize를 함
1) 실제 사용
- MeCab(일본에서 만듦). Khaiii(카카오에서 만듦)
- 둘다 리눅스에서만 돌아간다.
2. 절차
Input Text => Sentence Splitting => Tokenizing => Part-of-Speech(POS) Tagging
1) Sentence Splitting
- 그동안 했던 sentnece를 나누어 토큰을 만들고 토큰을 나누어 morphemes로 만듦
2) n-gram
- 다음의 나올 글자를 예측하기 위함
- 데이터를 학습 시켜서 확률을 이용하여 가장 높은 확률 아이템을 뽑아옴
- 입력으로는 글자 전체를 넣고 예측된 결과를 빼옴
3. N-Gram
- 형태소와 다른 Feature 모델이다.
- 음절 또는 어절의 앞뒤 관계를 카운팅하여 특정 음절 또는 어절 다음에 나오는 것의 확률을 구하는 것
1) tokenize
Beautiful is better than ugly.
P(4|1-3) => P(4|1-3) * P(3|1-2) * P(2|1) * P(1)
=> 1st Markov Assumption P(4|3) => P(4|3) * P(3|2) * P(2|1) * P(1)
=> P(4 | 3) => 4 hits / 3 hits
N-Grame : 서로 이웃하는 것들을 쌍으로 두고 해당 패턴의 구해서 확률을 구함
- 음절과 어절로 나누어 해당 단어가 나올 확률을 구함
국민의, 국민을, 국민에게
=> 국민, 민의, 국민, 민을, 국민, 민에, 에게
국민 = 3
원시 코퍼스 -> 어절(원시) => n-gram / 형태소 / 패턴(Re)
- 이렇게 여러가지 feature를 사용해서 경우를 많이 구한다.
3. 실습
1) 어절 단위로 앞뒤 나누기
1] 어절을 n까지의 관계로 나누는 함수
def eojeol(text, n=2):
ngram = list()
tokens = text.split()
for i in range(len(tokens)-(n-1)):
ngram.append(" ".join(tokens[i:i+n]))
return ngram
2) 코퍼스 가져오기
from konlpy.corpus import kolaw, kobill
corpus = kolaw.open(kolaw.fileids()[0]).read()
3) 나누기
from nltk.tokenize import sent_tokenize, word_tokenize, TweetTokenizer
for _ in sent_tokenize(corpus):
print(eojeol(_))
break
4) 음절로 나누는 함수
def umjeol(text, n=2):
ngram = list()
#tokens = text.split()
for i in range(len(text)-(n-1)):
ngram.append(" ".join(text[i:i+n]))
return ngram
5) 음절 결과
6) 어절로 나눈 것의 결과
from nltk import Text
bigram = eojeol(corpus)
bigramText = Text(bigram)
=> 결과를 보면 "수 있다" 가 나오는데 원하는 데이터가 수 있다의 앞에 나오는 것이면 n을 3으로 늘리면 된다.
4. N-Gram의 특징
1) 순서를 고려한다.
- 앞뒤 순서가 바뀌면 아예 다른 쌍이 된다.
- 특정 단어의 순서끼리의 쌍은 특정 단어에 매칭하여 가중치를 줄 수도 있다.
=> 박보영이 = {박보, 보영, 영이}
'데이터 분석가 역량' 카테고리의 다른 글
day 12 ] 불용어 (0) | 2019.05.16 |
---|---|
day 12] BPE (0) | 2019.05.15 |
day 11 ] 형태소 분석 (0) | 2019.05.15 |
day 10 ] 형태소 분석 심화 (0) | 2019.05.14 |
day 10 ] 형태소 분석 개론 (0) | 2019.05.14 |