상호 정보량을 고려하는 이유
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 행렬을 구하는 방법이 존재한다.
'Archive > 자연어처리' 카테고리의 다른 글
[자연어] BERT 모델, 찍먹해보자. (0) | 2021.09.06 |
---|---|
[자연어] 트위터 문자 분류 문제를 통한 자연어 처리 실습(1) (0) | 2021.09.01 |
[밑딥2] CBOW 모델과 skip-gram 모델의 수식 이해 (0) | 2021.08.02 |
[밑딥2] 신경망에서의 단어 처리와 word2vec (0) | 2021.07.31 |
[밑딥2] 시소러스(thesaurus)와 기본적인 전처리 (0) | 2021.07.19 |