자연어 처리에서 텍스트를 표현하는 여러 방법 중
텍스트를 카운트 기반으로 수치화하는 방식에 대해 얘기해보려 한다.
Bag of Words(BoW)
Bag of Words : 단어들의 순서는 전혀 고려하지 않고, 출현 빈도에만 집중하는 텍스트 수치화 방식.
단어들을 가방에 담아서 흔들어 섞는다면
순서는 상관없이 얼마나 많이 나왔는지가 주요 포인트 일 것이다.
Bow 만드는 과정
1. 각 단어에 고유한 정수 인덱스 부여
2. 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만듦.
ex) doc1 = "정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다."
vocabulary : {'정부': 0, '가': 1, '발표': 2, '하는': 3, '물가상승률': 4, '과': 5, '소비자': 6, '느끼는': 7, '은': 8, '다르다': 9}
bag of words vector : [1, 2, 1, 1, 2, 1, 1, 1, 1, 1]
BoW 활용
- 단어의 출현빈도를 기준으로 문서의 성격을 판단하는 작업에 사용
- 분류 문제, 여러 문서간의 유사도
- 불용어를 제거 -> 처리의 정확도를 높이기 위해 선택할 수 있는 기법
문서 단어 행렬(DTM)
DTM : 다수의 문서에서 등장하는 각 단어들의 빈도를 행렬로 표현한 것.
=> 각 문서에 대한 BoW를 하나의 행렬로 만든 것.
ex) 문서1 : 먹고 싶은 사과
문서2 : 먹고 싶은 바나나
문서3 : 길고 노란 바나나 바나나
문서4 : 저는 과일이 좋아요
<예시 DTM>
과일이 | 길고 | 노란 | 먹고 | 바나나 | 사과 | 싶은 | 저는 | 좋아요 | |
문서1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
문서2 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
문서3 | 0 | 1 | 1 | 0 | 2 | 0 | 0 | 0 | 0 |
문서4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
DTM의 한계
- 희소표현 : 원-핫 벡터와 같이 전체 단어집합의 크기를 가짐 => 많은 양의 저장공간, 높은 계산 복잡도 요구
- 단어 집합의 크기를 줄이는 것이 중요
- 단순 빈도수 기반 접근 : 불용어와 같은 단어들은 빈도수가 높을 확률 높아
- 그렇게 불용어의 빈도수가 고루 많다고 해서 유사한 문서라고 판단하는 것은 오류
어떻게 해결해야 할까?
DTM에서 불용어나 중요단어에 대해 가중치를 줄 수 있는 방법은 없을까?
TF-IDF
TF-IDF : 단어의 빈도(Term Frequency)와 역문서 빈도(Inverse Document Frequency)를 사용해
DTM내의 각 단어들의 중요한 정도를 가중치로 주는 방법.
TF-IDF의 용어들을 하나씩 정리해보자
- d : 문서(document), t : 단어(term), n : 문서의 총 개수
- TF-IDF : TF와 IDF를 곱한 것
- tf(d,t) : 특정 문서 d에서 특정 단어 t의 등장 횟수
- df(t) : 특정단어 t가 등장하는 문서의 수
- idf(d,t) : df(t)에 반비례하는 수
- n이 커질수록 idf가 기하급수적으로 커지는 상황 log로 방지
<예시 IDF>
단어 | IDF(역 문서 빈도) |
과일이 | ln(4/(1+1)) = 0.693147 |
길고 | ln(4/(1+1)) = 0.693147 |
노란 | ln(4/(1+1)) = 0.693147 |
먹고 | ln(4/(2+1)) = 0.287682 |
바나나 | ln(4/(2+1)) = 0.287682 |
사과 | ln(4/(1+1)) = 0.693147 |
싶은 | ln(4/(2+1)) = 0.287682 |
저는 | ln(4/(1+1)) = 0.693147 |
좋아요 | ln(4/(1+1)) = 0.693147 |
<예시 TF - IDF>
과일이 | 길고 | 노란 | 먹고 | 바나나 | 사과 | 싶은 | 저는 | 좋아요 | |
문서1 | 0 | 0 | 0 | 0.287682 | 0 | 0.693147 | 0.287682 | 0 | 0 |
문서2 | 0 | 0 | 0 | 0.287682 | 0.287682 | 0 | 0.287682 | 0 | 0 |
문서3 | 0 | 0.693147 | 0.693147 | 0 | 0.575364 | 0 | 0 | 0 | 0 |
문서4 | 0.693147 | 0 | 0 | 0 | 0 | 0 | 0 | 0.693147 | 0.693147 |
TF-IDF의 활용
- 해석
- 모든 문서에서 자주 등장하는 단어 -> 중요도가 낮음 / 특정 문서에서만 자주 등장하는 단어 -> 중요도가 높음
- TF-IDF : 단어의 등장 빈도 * 특정 단어가 여러 문서에서 등장하는 것에 대한 패널티
- TF-IDF값이 낮음 -> 중요도 낮음, 높음 -> 중요도 높음
- 사용
- 문서의 유사도를 구하는 작업
- 검색 시스템에서 검색 결과의 중요도를 정하는 작업
- 문서 내에서 특정 단어의 중요도를 구하는 작업
'NLP' 카테고리의 다른 글
2. 텍스트를 숫자로 - 인코딩 (0) | 2023.03.03 |
---|---|
1. NLP의 뿌리, 텍스트 전처리 (0) | 2023.02.28 |
자연어 처리 워크플로우 (0) | 2023.02.19 |