Home TF-IDF 벡터와 벡터 유사도 예시
Post
Cancel

TF-IDF 벡터와 벡터 유사도 예시

TF-IDF 벡터와 벡터 유사도 예시

벡터 유사도를 설명하기 위해, 문서를 숫자 벡터로 바꾸는 기본적인 방법인 TF-IDF를 예로 들어보겠습니다.


1. 예시 문서

다음과 같은 문서 3개가 있다고 가정합니다.

1
2
3
문서 A: 강아지 산책 좋아
문서 B: 강아지 간식 좋아
문서 C: 자동차 운전 좋아

전체 문서에 등장한 단어들을 모으면 다음과 같습니다.

1
단어 목록 = [강아지, 산책, 좋아, 간식, 자동차, 운전]

이 단어 목록을 기준으로 각 문서를 벡터로 표현할 수 있습니다.


2. 단순 빈도 벡터

먼저 단어가 문서에 등장하면 1, 등장하지 않으면 0으로 표현해보겠습니다.

1
단어 순서 = [강아지, 산책, 좋아, 간식, 자동차, 운전]

문서 A는 강아지, 산책, 좋아가 등장합니다.

1
A = [1, 1, 1, 0, 0, 0]

문서 B는 강아지, 간식, 좋아가 등장합니다.

1
B = [1, 0, 1, 1, 0, 0]

문서 C는 자동차, 운전, 좋아가 등장합니다.

1
C = [0, 0, 1, 0, 1, 1]

표로 보면 다음과 같습니다.

문서강아지산책좋아간식자동차운전
A111000
B101100
C001011

이 방식은 단순하지만 한계가 있습니다.

예를 들어 좋아는 모든 문서에 등장합니다. 그러면 문서를 구분하는 데 별로 도움이 되지 않습니다.

반면 산책, 간식, 자동차, 운전은 특정 문서에만 등장합니다. 이런 단어들은 문서의 특징을 더 잘 보여줍니다.

그래서 TF-IDF는 단어의 단순 등장 여부뿐 아니라, 그 단어가 전체 문서에서 얼마나 희귀한지를 함께 반영합니다.


3. TF-IDF란?

TF-IDF는 다음 두 값을 곱해서 계산합니다.

1
TF-IDF = TF × IDF

여기서:

1
2
TF  = 특정 문서 안에서 단어가 등장한 빈도
IDF = 전체 문서에서 그 단어가 얼마나 희귀한지 나타내는 값

즉, 어떤 단어가 특정 문서에 자주 나오면서, 전체 문서에서는 드물게 나온다면 높은 점수를 받습니다.


4. TF 계산

이번 예시는 각 문서에 같은 단어가 여러 번 반복되지 않습니다.

따라서 TF는 단순하게 다음과 같이 볼 수 있습니다.

1
2
단어가 등장하면 1
단어가 등장하지 않으면 0

그래서 TF 벡터는 앞에서 본 단순 빈도 벡터와 같습니다.

1
2
3
A의 TF = [1, 1, 1, 0, 0, 0]
B의 TF = [1, 0, 1, 1, 0, 0]
C의 TF = [0, 0, 1, 0, 1, 1]

5. IDF 계산

IDF는 보통 다음과 같이 계산합니다.

1
IDF = log(전체 문서 수 / 해당 단어가 등장한 문서 수)

이번 예시에서 전체 문서 수는 3개입니다.

1
전체 문서 수 = 3

각 단어가 몇 개의 문서에 등장하는지 세어보면 다음과 같습니다.

단어등장한 문서등장 문서 수
강아지A, B2
산책A1
좋아A, B, C3
간식B1
자동차C1
운전C1

따라서 각 단어의 IDF는 다음과 같이 계산됩니다.

1
2
3
4
5
6
7
8
9
10
단어 순서 = [강아지, 산책, 좋아, 간식, 자동차, 운전]

IDF = [
  log(3/2),  // 강아지: 3개 문서 중 2개 문서에 등장
  log(3/1),  // 산책:   3개 문서 중 1개 문서에 등장
  log(3/3),  // 좋아:   3개 문서 중 3개 문서에 등장
  log(3/1),  // 간식:   3개 문서 중 1개 문서에 등장
  log(3/1),  // 자동차: 3개 문서 중 1개 문서에 등장
  log(3/1)   // 운전:   3개 문서 중 1개 문서에 등장
]

계산하면 대략 다음과 같습니다.

1
2
3
4
5
6
7
8
IDF ≈ [
  0.4,  // log(3/2)
  1.1,  // log(3/1)
  0.0,  // log(3/3)
  1.1,  // log(3/1)
  1.1,  // log(3/1)
  1.1   // log(3/1)
]

여기서 중요한 점은 다음과 같습니다.

1
2
3
4
5
6
좋아    → 모든 문서에 등장하므로 IDF가 0
강아지  → 2개 문서에 등장하므로 IDF가 중간 정도
산책    → 1개 문서에만 등장하므로 IDF가 높음
간식    → 1개 문서에만 등장하므로 IDF가 높음
자동차  → 1개 문서에만 등장하므로 IDF가 높음
운전    → 1개 문서에만 등장하므로 IDF가 높음

즉, 좋아는 모든 문서에 나오기 때문에 문서를 구분하는 데 도움이 거의 되지 않습니다. 반대로 산책, 간식, 자동차, 운전은 특정 문서에만 나오기 때문에 문서를 구분하는 데 도움이 됩니다.


6. TF-IDF 벡터 계산

이제 각 문서의 TF 벡터에 IDF 값을 곱합니다.

1
TF-IDF = TF × IDF

단어 순서는 계속 동일합니다.

1
[강아지, 산책, 좋아, 간식, 자동차, 운전]

IDF 값은 다음과 같습니다.

1
IDF = [0.4, 1.1, 0.0, 1.1, 1.1, 1.1]

7. 문서 A의 TF-IDF 벡터

문서 A의 TF 벡터는 다음과 같습니다.

1
A의 TF = [1, 1, 1, 0, 0, 0]

각 위치에 IDF 값을 곱합니다.

1
2
3
4
5
6
7
8
A의 TF-IDF = [
  1 × log(3/2),  // 강아지
  1 × log(3/1),  // 산책
  1 × log(3/3),  // 좋아
  0 × log(3/1),  // 간식
  0 × log(3/1),  // 자동차
  0 × log(3/1)   // 운전
]

숫자로 계산하면 다음과 같습니다.

1
2
3
4
5
6
7
8
A의 TF-IDF ≈ [
  1 × 0.4,
  1 × 1.1,
  1 × 0.0,
  0 × 1.1,
  0 × 1.1,
  0 × 1.1
]

따라서:

1
A = [0.4, 1.1, 0.0, 0, 0, 0]

8. 문서 B의 TF-IDF 벡터

문서 B의 TF 벡터는 다음과 같습니다.

1
B의 TF = [1, 0, 1, 1, 0, 0]

각 위치에 IDF 값을 곱합니다.

1
2
3
4
5
6
7
8
B의 TF-IDF = [
  1 × log(3/2),  // 강아지
  0 × log(3/1),  // 산책
  1 × log(3/3),  // 좋아
  1 × log(3/1),  // 간식
  0 × log(3/1),  // 자동차
  0 × log(3/1)   // 운전
]

숫자로 계산하면 다음과 같습니다.

1
2
3
4
5
6
7
8
B의 TF-IDF ≈ [
  1 × 0.4,
  0 × 1.1,
  1 × 0.0,
  1 × 1.1,
  0 × 1.1,
  0 × 1.1
]

따라서:

1
B = [0.4, 0, 0.0, 1.1, 0, 0]

9. 문서 C의 TF-IDF 벡터

문서 C의 TF 벡터는 다음과 같습니다.

1
C의 TF = [0, 0, 1, 0, 1, 1]

각 위치에 IDF 값을 곱합니다.

1
2
3
4
5
6
7
8
C의 TF-IDF = [
  0 × log(3/2),  // 강아지
  0 × log(3/1),  // 산책
  1 × log(3/3),  // 좋아
  0 × log(3/1),  // 간식
  1 × log(3/1),  // 자동차
  1 × log(3/1)   // 운전
]

숫자로 계산하면 다음과 같습니다.

1
2
3
4
5
6
7
8
C의 TF-IDF ≈ [
  0 × 0.4,
  0 × 1.1,
  1 × 0.0,
  0 × 1.1,
  1 × 1.1,
  1 × 1.1
]

따라서:

1
C = [0, 0, 0.0, 0, 1.1, 1.1]

10. 최종 TF-IDF 벡터 정리

1
단어 순서 = [강아지, 산책, 좋아, 간식, 자동차, 운전]
1
2
3
A = [0.4, 1.1, 0.0, 0,   0,   0]
B = [0.4, 0,   0.0, 1.1, 0,   0]
C = [0,   0,   0.0, 0,   1.1, 1.1]

표로 보면 다음과 같습니다.

문서강아지산책좋아간식자동차운전
A0.41.10.0000
B0.400.01.100
C000.001.11.1

11. 벡터 유사도 계산

이제 문서가 숫자 벡터로 바뀌었으므로, 벡터끼리 비교할 수 있습니다.

예를 들어 내적을 사용해 유사도를 계산할 수 있습니다.

1
두 벡터의 내적 = 같은 위치의 값끼리 곱해서 모두 더한 값

12. A와 B의 내적

1
2
A = [0.4, 1.1, 0.0, 0,   0,   0]
B = [0.4, 0,   0.0, 1.1, 0,   0]

내적을 계산하면:

1
2
3
4
5
6
7
8
9
A · B
= 0.4 × 0.4
+ 1.1 × 0
+ 0.0 × 0.0
+ 0 × 1.1
+ 0 × 0
+ 0 × 0

= 0.16

따라서:

1
A · B = 0.16

A와 B는 강아지라는 단어 축에서 값이 겹치기 때문에 유사도가 어느 정도 나옵니다.


13. A와 C의 내적

1
2
A = [0.4, 1.1, 0.0, 0,   0,   0]
C = [0,   0,   0.0, 0,   1.1, 1.1]

내적을 계산하면:

1
2
3
4
5
6
7
8
9
A · C
= 0.4 × 0
+ 1.1 × 0
+ 0.0 × 0.0
+ 0 × 0
+ 0 × 1.1
+ 0 × 1.1

= 0

따라서:

1
A · C = 0

A와 C는 의미 있는 단어 축에서 겹치는 부분이 없습니다. 좋아는 둘 다 등장하지만, 모든 문서에 등장하는 단어라 IDF가 0이 되었습니다. 그래서 유사도 계산에 영향을 주지 않습니다.


14. B와 C의 내적

1
2
B = [0.4, 0,   0.0, 1.1, 0,   0]
C = [0,   0,   0.0, 0,   1.1, 1.1]

내적을 계산하면:

1
2
3
4
5
6
7
8
9
B · C
= 0.4 × 0
+ 0 × 0
+ 0.0 × 0.0
+ 1.1 × 0
+ 0 × 1.1
+ 0 × 1.1

= 0

따라서:

1
B · C = 0

15. 유사도 결과 정리

1
2
3
A · B = 0.16
A · C = 0
B · C = 0

따라서 이 예시에서는 A와 B가 가장 유사하다고 볼 수 있습니다.

1
2
3
A: 강아지 산책 좋아
B: 강아지 간식 좋아
C: 자동차 운전 좋아

A와 B는 둘 다 강아지라는 단어를 포함합니다. 반면 C는 자동차, 운전과 관련된 문서이므로 A, B와는 유사도가 낮습니다.


16. 발표용 설명 문장

TF-IDF는 문서를 단어 기준의 숫자 벡터로 바꾸는 고전적인 방법입니다.

먼저 전체 문서에 등장한 단어들을 하나의 단어 목록으로 만들고, 각 문서를 그 단어 목록 기준의 벡터로 표현합니다.

단순 빈도 벡터에서는 단어가 등장하면 1, 등장하지 않으면 0으로 표현합니다.

하지만 모든 문서에 자주 등장하는 단어는 문서를 구분하는 데 큰 도움이 되지 않습니다.

예를 들어 이 예시에서 좋아는 A, B, C 모든 문서에 등장합니다. 따라서 좋아는 특정 문서의 특징을 잘 보여주지 못합니다.

반면 산책, 간식, 자동차, 운전은 특정 문서에만 등장합니다. 이런 단어들은 문서의 특징을 잘 보여주기 때문에 더 높은 중요도를 갖습니다.

IDF는 바로 이 희귀도를 계산하는 값입니다.

1
IDF = log(전체 문서 수 / 해당 단어가 등장한 문서 수)

그리고 TF-IDF는 각 문서의 단어 빈도인 TF에 단어의 희귀도인 IDF를 곱해서 계산합니다.

1
TF-IDF = TF × IDF

이렇게 계산하면 모든 문서에 등장하는 흔한 단어의 영향은 줄어들고, 특정 문서에만 등장하는 중요한 단어의 영향은 커집니다.

마지막으로 이렇게 만들어진 TF-IDF 벡터끼리 내적이나 코사인 유사도를 계산하면 문서 간 유사도를 구할 수 있습니다.


17. 핵심 요약

1
문서 → 단어 목록 기준 벡터 → TF-IDF 가중치 적용 → 벡터 유사도 계산

TF-IDF의 핵심 아이디어는 다음과 같습니다.

1
2
3
문서 안에서 자주 등장하는 단어는 중요하다.
하지만 모든 문서에 자주 등장하는 단어는 덜 중요하다.
특정 문서에만 등장하는 단어는 더 중요하다.

따라서 TF-IDF는 단어의 등장 빈도와 희귀도를 함께 고려해 문서를 벡터로 표현하는 방법입니다.

This post is licensed under CC BY 4.0 by the author.

RAG 넌 대체 뭐니?

-