Today I Learned/머신러닝

[텍스트분석] 단어빈도의 가중치 TF-IDF

하나719 2020. 11. 27. 20:42
반응형

[이전글] 2020/11/27 - [텍스트분석] TDM (Term Document Matrix) 단어 문서 행렬

 

[텍스트분석] TDM (Term Document Matrix) 단어 문서 행렬

텍스트 분석으로 어떤걸 할 수 있을까? 예시) 1) 기사 분류 - 하루에도 수백개씩 나오는 기사들, 지도 학습을 통해 사회, 연예, 정치등 카테고리를 분류해줄 수 있다. 2) 감성 분석 - 영화 리뷰, 정

hanawithdata.tistory.com

이전글에서 CountVector로 단어가 등장하는 빈도수로 Matrix를 만들어주는 TDM을 만들어보았다.

같은 단어의 빈도수가 동일하게 나타나는 문서는 서로 비슷하다고 판단할 수 있다.

그런데, 무의미하게 특정 문서에서 반복되는 단어의 경우 분석에 도움이 되지 않기도 한다.

예를들어 리뷰에 좋아요 좋아요 좋아요 라고 되어 있을 때, 좋아요와 내용이 다르지 않다.

하지만 빈도수 TDM에서는 다르게 판단할 수 있다.

이럴 때 단어에 적절한 가중치를 주어서 보완할 수 있다.

단어 빈도 가중치들

1. binary: 단어 등장 여부에 따라 0 또는 1로만 표시 -> 무의미하게 반복되는 단어를 무시할 수 있다.

2. 로그함수 적용: 1 -> 0 , 10 -> 1, 100 -> 2, 1000 -> 3, 10000 -> 4 로 만들어주는데, 너무 많이 길거나 반복되는 것의 효과를 줄일 수 있다.

3. 문서의 총 단어 빈도로 나눔 

글이 길 때 같은 단어가 3번 나오는거랑 글이 짧을 때 3번 나오는 것은 다르다.

그 것을 보정하기 위해 문서 길이로 나누어준다.

4. 가장 많은 단어의 빈도로 나눔

가장 많이 등장하는 단어의 빈도 대비 이 단어의 빈도가 어떻게 되는지 중요도를 확인할 수 있다.

 

문서 빈도 (document frequency - df)

- df: 각 단어가 등장한 문서 수

- idf(역문서빈도): 총 문서 수 / df

- 여러 문서에 자주 나오면 -> df 높음, idf 낮음

- 문서간의 차이가 중요한 상황에서는 Idf가 높은 단어가 좋은 단어이다. (특정 문서에서만 등장하는 단어!)

  맛집 시청
문서1 3 2 1
문서2 2 0 3
문서3 0 0 1
df 2 1 3
idf 3/2 = 1.5 3 / 1 =3 3 / 3 = 1

-> 밥은 모든 문서에 나오는 단어이므로 문서간의 차이를 보여주지는 않는다. 시청이라는 키워드는 특정 문서에서 등장하는 단어로 문서간의 차이를 보여주는 키워드이다. 이 예시에서는 맛집에 대한 문서에서 장소가 문서마다 다르다는 점을 알 수 있다.

 

TF - IDF

TDM에 가중치를 주는 대표적인 방법입니다.

- 단어 빈도 (TF) X 역문서빈도 (IDF) 

-> 위 테이블의 문서 1은 맛집의 경우 빈도가 3, idf가 1.5 이므로 TF-IDF 가 4.5 이고, 시청은 빈도가 2, idf가 3으로 TF-IDF 가 6이다.

그래서 빈도 자체는 맛집이 더 많지만, 중요도 가중치를 넣으면 시청의 TF-IDF가 더 높다.

 

실습해보기!

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=500, stop_words='english')
tdm = tfidf.fit_transform(df[0])

단어 빈도순 정렬

word_count = pd.DataFrame({
    '단어': tfidf.get_feature_names(),
    '빈도': tdm.sum(axis=0).flat
})

반응형