TF-IDF, PPMI

단어 간 관계

일반적으로 특정 단어 사이의 관계를 확인하기 위해 사용하는 방법으로 word-word matrix + Cosine Similarity가 있다. 

...is very complicated. Therefore, natural language is analyzed through several steps...

예를 들어 ±4 window를 사용한다면 특정 단어의 좌우 4 단어의 출현 빈도를 활용하는 것이다. 아래 matrix는 문서 전체에서 ±4 window로 단어 빈도를 카운트한 예시값이다. 

  language science education
culture 5 0 2
country 6 8 5
the 25 38 7

만약 culturecountry 간의 유사도를 알고 싶다면 아래와 같이 cosine 유사도를 사용할 수 있다.

$cos(\vec{v}\vec{w})=\frac{\vec{v}\cdot \vec{w}}{|\vec{v}||\vec{w}|}=\frac{\sum_i v_i w_i}{\sqrt{\sum_i v_i^2}\sqrt{\sum_i w_i^2}}$

이때 $\vec{v}$가 culture의 값인 [5 0 2], $\vec{w}$가 country의 값인 [6, 8, 5]가 된다. 

 

문제점

그런데 위 matrix에서 the를 보면 모든 단어에 대해 높은 값을 가지고 있다. 그 외 a, it, they 등 의미 없는 단어도 비정상적으로 높은 값을 가질 수 있다. 따라서 이러한 차이를 줄이기 위해 log 값을 활용한다. (아래 TF-IDF에서 활용)

x log x
1 0
100 2
10000 4

log를 활용해 값의 차이를 완화한 예


TF-IDF

TF-IDF는 말 그대로 TF와 IDF의 곱으로 이루어진다.

$TF-IDF=TF_{word, document}\ IDF_{word}$

TF: Term Frequency. 특정 문서에 출현한 단어의 빈도수

* w: word, d: document

$TF_{w, d}=\begin{cases}
1+log_{10}count(w|d) & \text{ if } count(w|d)>0 \\
0 & \text{ otherwise } 
\end{cases}$

IDF: Inverse document frequency. 적은 문서에 사용되었고 출현 빈도가 높으면 유사성이 높다고 본다. 

$IDF_i=log(\frac{N_{d}}{N_{1+d\ include\ w_i}})$

* 분모에 더해진 1은 0이 되는 것을 방지하기 위한 장치이다.

from sklearn.feature_extraction.text import TfidfVectorizer

doc1 = "I like to watch action films"
doc2 = "He doesn't like to watch romance films"

vectorizer = TfidfVectorizer()
dt_matrix = vectorizer.fit_transform([doc1, doc2])

# vectorizer.get_feature_names()
# dt_matrix.toarray()

# Formatting
for name in vectorizer.get_feature_names():
    print(f"{name:>10}", end="")
print("\n")

for matrix in dt_matrix.toarray():
    for i in matrix:
        print(f"{i:10.2}", end="")
    print("\n")
    action     doesn     films        he      like   romance        to     watch

      0.57       0.0      0.41       0.0      0.41       0.0      0.41      0.41

       0.0      0.45      0.32      0.45      0.32      0.45      0.32      0.32

 

문제점

단어의 빈도수만으로 판단하기 때문에 don't likelike 같은 문맥상으로 다른 의미의 단어도 오로지 빈도로만 분석한다. 이는 빈도수만 처리하는 방식에서 흔하게 나타나는 문제점이고, 일반적으로 n-gram을 만들어 (very, like)(don't, like)를 구분한다.  


PPMI

PPMI는 Positive PMI이다. PMIPointwise Mutual Information의 약자로 두 벡터가 독립적으로 출현한 빈도와 함께 출현한 빈도를 비교한다. 

$PMI(X,Y)=log_2\frac{P(x,y)}{P(x)P(y)}$

값이 커질수록 두 값의 의존도가 높다는 뜻이다. 그런데 해당 값에서 $log_2(0)$이나 음수와 같이 비정상적인 값이 발생하는 것을 방지해 Positive-PMIPPMI를 정의한다. 

$PPMI(X,Y)=max(log_2\frac{P(x,y)}{P(x)P(y)}, 0)$

이러한 식을 통해 0보다 작은 값일 경우, 0을 반환하도록 정의하였다.