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]
표로 보면 다음과 같습니다.
| 문서 | 강아지 | 산책 | 좋아 | 간식 | 자동차 | 운전 |
|---|---|---|---|---|---|---|
| A | 1 | 1 | 1 | 0 | 0 | 0 |
| B | 1 | 0 | 1 | 1 | 0 | 0 |
| C | 0 | 0 | 1 | 0 | 1 | 1 |
이 방식은 단순하지만 한계가 있습니다.
예를 들어 좋아는 모든 문서에 등장합니다. 그러면 문서를 구분하는 데 별로 도움이 되지 않습니다.
반면 산책, 간식, 자동차, 운전은 특정 문서에만 등장합니다. 이런 단어들은 문서의 특징을 더 잘 보여줍니다.
그래서 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, B | 2 |
| 산책 | A | 1 |
| 좋아 | A, B, C | 3 |
| 간식 | B | 1 |
| 자동차 | C | 1 |
| 운전 | C | 1 |
따라서 각 단어의 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]
표로 보면 다음과 같습니다.
| 문서 | 강아지 | 산책 | 좋아 | 간식 | 자동차 | 운전 |
|---|---|---|---|---|---|---|
| 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 |
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는 단어의 등장 빈도와 희귀도를 함께 고려해 문서를 벡터로 표현하는 방법입니다.