본문 바로가기
Archive/자연어처리

[밑딥2] 중요도, 유사도가 높은 단어 추출하기

by 다람이도토리 2021. 7. 21.

상호 정보량을 고려하는 이유

corpus에서 단어들간의 동시 발생 횟수를 고려해보자.

the 같은 단어는 빈도가 매우 많아서 다양한 단어와 강한 관련성이있다고 판단될 것이나, 의미까지 파악한다면 더 유사도가 높은 단어가 선택되어야 할 것이다. 이를 위해서 확률적 관점에서 바라보는 지표를 선택한다.

PMI

PMI(x, y) = log2  P(x,y)/(P(x) * P(y)) 로 정의된다.

여기서 P(x)는 x가 말뭉치에 등장할 확률을 의미한다. 

예를들어 10,000개의 단어가 있는 말뭉치에서 the가 100번 등장한다면 P(the) = 0.01이 될 것이다.

동시발생 행렬과 PMI

앞에서 본 동시발생 행렬을 위의 식에 적용하면,

P(x, y) = C(x, y)/N,  P(x) = C(x) / N,  P(y) = C(y) / N이 되어, 식을 정리할 수 있다.

즉 동시발생 행렬만 주어지면, PMI를 구할 수 있다.

PPMI

PMI의 문제는, 로그 값이기에 두 단어의 동시 발생 확률이 0이면 로그 값을 계산할 수 없다. 따라서

PPMI(x, y) = max(0, PMI(x, y))를 사용한다.

즉 우리는, 이제 동시 발생 행렬 대신에 PPMI값으로 행렬을 줄 수 있다.

 

PPMI 행렬에 SVD를 적용하여 가중치가 높은 단어, 유사도가 높은 단어 등을 추출해 낼 수 있다.

 

TF - IDF

중요도가 높은 단어를 추출하는 다른 방법은 TF-IDF이다.

여러개의 문서가 있을 때, 문서 d와 단어 t에 대해 다음과 같이 계산한다.

tf-idf(d, t) = tf(d, t) * idf(t)

여기서,

- tf(d, t) : 특정한 단어의 빈도 수

- idf(t) : 특정한 단어가 들어 있는 문서의 수에 반비례 하는 수로 다음과 같이 정의한다.

  n : 전체 문서의 수
  df(t) : 단어 t를 가진 문서의 수

 

from sklearn.feature_extraction.text import TfidfVectorizer

tfidv = TfidfVectorizer().fit(corpus)
tfidv.transform(corpus).toarray()

scikit-learn에는 tf-idf 행렬을 구하는 방법이 존재한다.