본문 바로가기

* [R_Python] 데이터분석 정리/[Python] 텍스트마이닝

[자연어처리] 3. TF-IDF 벡터

 

주어진 단어가 해당 문서에서 얼마나 중요한가?

  • 단어 중요도 표현 방법
    • 단어 모음
    • N그램 모음
    • TF-IDF 벡터

 

2-1. 단어 모음

  1. 단어 빈도
    • 가정 : 많이 나오는 단어가 중요할 것이다.
from collection import Counter
bag_of_words = Counter(tokens)
bag_of_words.most_common(10) #빈도순 나열

 

 

2.  벡터화

  • 기준이 필요
    • 정규화된 용어 빈도 필요
    • 공통 공간안의 위치 고려
    • 벡터의 길이 차원 표준화
  • 공통 공간을 위한 어휘집, 어휘사전 필요
  • 차원을 줄여야 유사도로 비교가 가능함
    • 두 문서의 벡터 표현들이 비슷하면 두 문서는 비슷
    • 코사인 유사도 (유클리드 내적 공식에서 유도) -1~+1 범위
      • 내적을 두 벡터의 길이에 맞게 정규화
      • 1 : 모든 차원에서 완전히 같은 방향
      • 0 : 두 벡터의 공통점이 없음

 

3. 지프의 법칙

  • 수학적 통계를 바탕으로 밝혀진 경험적 법칙으로 많은 종류의 종보들이
    지프 분포에 가까운 경향을 보이는 것을 말함 (지수적으로 감소하는 형태)\

4. 주제의 모형화

  • 상대적 중요도 파악
  • TF-IDF
    • 가정 : 어떤 용어가 한 문서에서만 자주 등장하고 다른 문서에서는 잘 나오지 않는다면,
      그 문서에서 그 단어는 중요한 단어일 것임
    • 유사도 파악 : 코사인 유사도 / Okapi BM25
      • Okapi BM25 : 코사인 유사도 정규화 /평활화
from sklearn.feature_extraction.text import TfidfVectorizer

# 토큰화
title_list = df[df['포스트분류']=='원글']['제목'].tolist()
title_vec = []
for i in tqdm.tqdm(title_list):
    title_vec.append(" ".join(kkma.nouns(i)))

# tf-idf
vectorizer = TfidfVectorizer(min_df=1)
model = vectorizer.fit_transform(title_vec)

word_list = [i[0] for i in sorted(vectorizer.vocabulary_.items())]
pd.DataFrame(model.toarray(), columns = [word_list])

# cosin 유사도 확인 및 시각화
from sklearn.metrics.pairwise import cosine_similarity
import matplotlib.pyplot as plt
import seaborn as sns

tmp = pd.DataFrame(cosine_similarity(model.toarray()))

plt.figure(figsize=(10,10))

sns.heatmap(tmp) #annot=True, fmt='f'
plt.show();

 

Source : 파이썬으로 배우는 자연어 처리 인 액션