자연어처리를 위한 BoW & TF-IDF


1. BoW (Bag of Words)

BoW는 문장 또는 문서에 나타나는 단어의 발생 빈도수를 의미합니다. 다른 의미로는 문장 또는 문서의 단어들을 표현하는 One-Hot 벡터의 합이라고 볼 수 있습니다.

{
    "나는": 0,
    "학생": 1,
    "입니다": 2,
    "당신은": 3,
    "수학": 4,
    "선생님": 5
}

위와 같은 개수가 6개인 Vocabulary를 가정해 보겠습니다.

# index
[0, 1, 2]

# one-hot
[
    [1, 0, 0, 0, 0, 0],  # 나는
    [0, 1, 0, 0, 0, 0],  # 학생
    [0, 0, 1, 0, 0, 0],  # 입니다
]

# bag-of-words
[1, 1, 1, 0, 0, 0]  # 나는 학생 입니다

"나는 학생 입니다"라는 문장은 위와 같이 표현할 수 있습니다.

# index
[3, 4, 5, 2]

# one-hot
[
    [0, 0, 0, 1, 0, 0],  # 당신은
    [0, 0, 0, 0, 1, 0],  # 수학
    [0, 0, 0, 0, 0, 1],  # 선생님
    [0, 0, 1, 0, 0, 0],  # 입니다
]

# bag-of-words
[0, 0, 1, 1, 1, 1]  # 당신은 수학 선생님 입니다

"당신은 수학 선생님 입니다"라는 문장은 위와 같이 표현할 수 있습니다.

# index
[0, 1, 2, 3, 4, 5, 2]

# one-hot
[
    [1, 0, 0, 0, 0, 0],  # 나는
    [0, 1, 0, 0, 0, 0],  # 학생
    [0, 0, 1, 0, 0, 0],  # 입니다
    [0, 0, 0, 1, 0, 0],  # 당신은
    [0, 0, 0, 0, 1, 0],  # 수학
    [0, 0, 0, 0, 0, 1],  # 선생님
    [0, 0, 1, 0, 0, 0],  # 입니다
]

# bag-of-words
[1, 1, 2, 1, 1, 1]  # 나는 학생 입니다 당신은 수학 선생님 입니다

위 두 문장을 합친 "나는 학생 입니다 당신은 수학 선생님 입니다"라는 문장은 위와 같이 표현할 수 있습니다.

위 결과에서 Bag of Words는 다음 문장이 모두 같은 값을 가집니다.

  • 나는 학생 입니다 당신은 수학 선생님 입니다
  • 나는 학생 입니다 입니다 수학 선생님 당신은
  • 학생 수학 선생님 입니다 당신은 나는 입니다

즉 Bag of Words는 단어의 발생 빈도만을 표현하며 단어의 발생 순서는 표현하지 못합니다.

1.1. Bag of Words Similarity

Bag of Words는 문장 또는 문서를 하나의 벡터로 표현할 수 있습니다. 이렇게 만들어진 벡터의 유사도를 비교해서 두 문장 또는 문서의 유사성을 비교하는 값으로 사용할 수 있습니다.

{
    "나는": 0,
    "학생": 1,
    "입니다": 2,
    "좋은": 3,
    "선생님": 4,
    "당신은": 5,
    "매우": 6,
}

위와 같은 개수가 7개인 Vocabulary를 가정해 보겠습니다.

# bag-of-words
[1, 1, 1, 0, 0, 0, 0]  # 나는 학생 입니다
[1, 0, 1, 1, 1, 0, 0]  # 나는 좋은 선생님 입니다
[0, 0, 1, 1, 1, 1, 1]  # 당신은 매우 좋은 선생님 입니다

위와 같이 3개의 문장을 Bag of Words로 표현한 벡터를 가정해 보겠습니다.

우선 3개의 벡터의 길이인 norm을 구해보겠습니다.

$$ \begin{equation} \begin{split} \lVert \vec{a} \rVert &= \sqrt{3} \\ \lVert \vec{b} \rVert &= \sqrt{4} = 2 \\ \lVert \vec{c} \rVert &= \sqrt{5} \\ \end{split} \end{equation} $$

이제 3개의 벡터를 각각 두 쌍씩 dot-product 해 보겠습니다.

$$ \begin{equation} \begin{split} \vec{a} \cdot \vec{b} &= 2 \\ \vec{b} \cdot \vec{c} &= 3 \\ \vec{c} \cdot \vec{a} &= 1 \\ \end{split} \end{equation} $$

Dot-product와 norm을 이용해서 두 벡터의 내각 $\theta$에 대한 $\cos \theta$를 아래 수식을 이용해 구할 수 있습니다.

$$ \begin{equation} \begin{split} \vec{a} \cdot \vec{b} &= \lVert \vec{a} \rVert \lVert \vec{b} \rVert \cos \theta \\ \cos \theta &= {\vec{a} \cdot \vec{b} \over \lVert \vec{a} \rVert \lVert \vec{b} \rVert} \end{split} \end{equation} $$

3개의 벡터의 각각 두 쌍의 내각의 $\cos \theta$는 아래와 같습니다.

$$ \begin{equation} \begin{split} \cos \theta_{ab} &= {\vec{a} \cdot \vec{b} \over \lVert \vec{a} \rVert \lVert \vec{b} \rVert} = {1 \over \sqrt{3}} \\ \cos \theta_{bc} &= {\vec{b} \cdot \vec{c} \over \lVert \vec{b} \rVert \lVert \vec{c} \rVert} = {3 \over 2 \sqrt{5}} \\ \cos \theta_{ca} &= {\vec{c} \cdot \vec{a} \over \lVert \vec{c} \rVert \lVert \vec{a} \rVert} = {1 \over 2 \sqrt{15}} \\ \end{split} \end{equation} $$

위 결과 $\cos \theta$의 크기는 $\cos \theta_{bc} > \cos \theta_{ab} > \cos \theta_{ca}$와 같습니다. 내각 $\theta$의 크기는 $\theta_{ca} > \theta_{ab} > \theta_{bc}$와 같습니다. 즉, $\vec{b}$와 $\vec{c}$가 3 벡터 중에서 가장 비슷하다고 할 수 있습니다.


2. TF-IDF (Term Frequency - Inverse Document Frequency)

2.1. TF (Term Frequency)

Term Frequency는 문장이나 문서에서 발생하는 단어의 발생 빈도수를 의미하는 것으로 발생하는 빈도수가 많은 단어가 문서의 주제일 가능성이 높습니다.

# Doc #1
영희는 매우 영어를 좋아한다
영희는 영어를 잘한다

# Doc #2
철수는 수학을 매우 좋아한다
철수는 수학을 매우 매우 잘한다

위와같은 두 문서를 가정해 보겠습니다.

tf-idf-01.png

위 두 문서의 발생 빈도수는 위 그림과 같습니다. 'Doc #1'에서는 '영희는', '영어를'이 2번으로 빈도수가 가장 많고 'Doc #2'에서는 '매우'가 3번으로 빈도가 가장 많고 '철수는', '수학을'은 2번으로 빈도수가 두 번째로 많습니다.

  • 'Doc #1'의 경우는 영희가 영어를 잘하는 것에 대해서 이야기하고 있으므로 '영희는', '영어를'이 문서의 주제라고 할 수 있습니다.
  • 'Doc #2'의 경우는 철수가 수학을 잘하는 것에 대해서 이야기하고 있으므로 '철수는', '수학을'이 문서의 주제라고 할 수 있습니다. 반면 3번 발생한 '매우'는 강조하기 위한 단어로 주제와는 상관이 없습니다.

문서 내에 빈도수가 많은 단어가 문서의 주제일 가능성이 높지만 항상 그렇다고 할 수는 없습니다.

2.2. IDF (Inverse Document Frequency)

Inverse Document Frequency는 특정한 문서들에만 나타나는 단어들에게 부여하는 가중치입니다. 수식으로 표현하면 다음과 같습니다.

$$idf(D, w) = \log {N \over df(D, w)}$$

위 수식에서 $N$은 전체 문서의 개수를 의미합니다. $df(D, w)$는 단어가 발생한 문서의 개수입니다.

tf-idf-02.png

위 그림은 단어가 발생한 문서의 개수 $df(D, w)$ 입니다.

  • '영희는', '영어를'은 'Doc #1'에서만 발생했기 때문에 1 입니다.
  • '매우', '좋아한다', '잘한다'는 'Doc #1', 'Doc #2' 두군데 모두에서 발생했기 때문에 2 입니다.
  • '철수는', '수학을'은 'Doc #2'에서만 발생했기 때문에 1 입니다.

tf-idf-03.png

위 그림은 단어가 발생한 문서의 개수의 역수 ${N \over df(D, w)}$입니다. 문서의 개수를 의미하는 $N$은 2입니다.

tf-idf-04.png

위 그림은 $idf(D, w) = \log {N \over df(D, w)}$의 결과입니다. 이전 ${N \over df(D, w)}$ 결과에 log를 취한 값입니다.

2.3. TF-IDF (Term Frequency-Inverse Document Frequency)

TF-IDF는 Term Frequency와 Inverse Document Frequency의 곱입니다. 수식은 아래와 같습니다.

$$tfidf(d, w) = tf(d, w) \times idf(D, w)$$

tf-idf-05.png

위 그림은 위에서 구한 Term Frequency와 Inverse Document Frequency를 곱한 결과입니다. 두 문서에서 나타난 단어는 모두 0이 되어서 사라지고 각각 문서에 나타난 단어의 가중치만 남게 되었습니다.

발생 빈도수가 많더라고 범용적으로 많이 사용하는 단어는 문서의 주제가 될 가능성이 낮습니다. 반대로 특정 문서에서만 자주 사용되는 단어는 문서의 주제일 가능성이 높습니다.
TF-IDF는 이용하면 범용적으로 많이 사용되는 단어는 가중치를 적게 주고 특정 문서에만 사용되는 단어에 가중치를 많이 주게 됩니다.