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)

bigramText.vocab()

=> 결과를 보면 "수 있다" 가 나오는데 원하는 데이터가 수 있다의 앞에 나오는 것이면 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

+ Recent posts