NLP - TF-IDF

매생이·2021년 12월 21일
0

일지

목록 보기
12/16

참조 - https://wikidocs.net/31698
위키독스 딥러닝을 이용한 자연어처리 입문


TF-IDF란?


TF-IDF는 Term Frequency-Inverse Document Frequency의 약자로,
단어의 빈도와 역 문서 빈도(문서의 빈도에 특정 식을 취한 값)을 사용하여
DTM 내의 단어들마다 중요한 정도를 가중치로 주는 방법입니다.

DTM이란?


서로 다른 문서들에서 등장하는 각 단어들의 빈도를 행렬로 표현한 것을 말합니다.
단어들을 토큰화를 수행하고 문서간 단어 행렬로 표현하는 방식입니다.
전체 문서에서 등장한 단어들을 원핫인코딩 방식으로 행렬의 컬럼으로 만들어주고,
각 문서별로 해당 단어의 등장 빈도를 값으로 매겨서 벡터화 해줍니다.

TF-IDF


TF-IDF는 주로 문서의 유사도를 구하거나 검색 시스템에서 검색 결과의 중요도를 정하는 작업, 특정 단어의 중요도를 구하는 작업 등에 쓰입니다.

TF-IDF는 TF와 IDF를 곱한 값을 의미하는데,
문서 = d, 단어 = t, 문서의 총 개수 = n

tf(d,t)

tf는 특정 문서 d에서의 특정 단어 t의 등장 횟수입니다.

df(t)

df는 특정 단어 t가 등장한 문서으 ㅣ수를 이야기합니다.
예를 들어 문서가 5개가 존재하는데, '경관'이라는 단어가 5개중 2번째, 3번째 문서에 존재한다면 '경관'이라는 단어의 df는 2입니다.
한 문서 내에서 몇번이나 등장하는지는 중요하지 않습니다.
전체 문서중에서 몇개의 문서에 존재하는지만 카운트합니다.

idf(d,t)

idf는 df에 반비례하는 수입니다.
idf(d,t)=log(n/1+df(t))idf(d,t) = log(n/1+df(t))
log를 사용해주지 않았을 때, idf를 df의 역수로 간단히 사용한다면 총 문서의 갯수가 커질수록 idf의 값이 너무 커지는 문제가 발생합니다.
이런 문제를 해결하기 위해서 df의 역수를 구한 뒤 분모에 1을 더해주고 log를 취햊부니다.

TF-IDF는 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하며,
특정 문서에서만 자주 등장하는 단어는 중요도가 높다고 판단하게 됩니다.

TF-IDF값이 낮으면 중요도가 낮은 것이며, TF-IDF값이 크면 중요도가 큰 것입니다.
조사같은 불용어는 모든 문서에서 자주 등장하기 때문에 다른 단어에 비해서 자연스럽게 TF-IDF값이 낮아지게 됩니다.

우선 DTM, 모든 문서의 단어 토큰들을 한 문서내에 단어가 몇개가 존재하는지의 벡터들의 행렬을 만들어주면 그것이 바로 각 단어의 TF의 행렬이 됩니다.

여기서 이제 IDF값을 구해주어야합니다.
위에서 설명한 수식대로 각 TF의 IDF값들을 구해주어 곱해주면 TF-IDF값을 만들 수 있습니다.


저는 최근 진행한 머신러닝 프로젝트에서 Konlpy패키지의 Kkma모듈을 사용하여 형태소 분석을 실시해 전체 문서의 단어 벡터를 만들어 각 문서들과의 코사인 유사도를 구해보았습니다.

그런 과정에서 조사와 불용어를 삭제해주기 위해서 명사, 대명사를 제외한 형태소를 필터링 해주고,
곳, 분, 리 와 같은 불필요한 명사도 직접 제거해준 뒤 진행하였습니다.
하지만 이런 과정조차 엔지니어의 견해가 포함되는 것이기 때문에 데이터 왜곡이 일어나는 것은 아닐까? 하는 생각이 들었습니다.

엔지니어의 직접적인 개입을 줄이고, 조사와 같은 불용어는 자연스레 가중치가 낮아지고 각 문서에서 자주 등장하는 단어의 가중치가 높아져 제가 사용한 방법보다 더 정확한 유사도가 구해지지 않을까 생각했습니다.

때문에 비록 프로젝트는 마무리 되었지만, TF-IDF를 사용하여 구한 유사도를 기존에 사용한 유사도를 대체하여 모델을 학습시켜보고 그 결과를 비교하여 프로젝트 리뷰 게시글을 추가적으로 작성할 계획입니다.

0개의 댓글