★ 아직 많이 부족합니다. 댓글을 통한 가르침 환영입니다. ★

 

오늘은 Python을 활용하여 TF-IDF 알고리즘을 활용하여 뉴스 기사를 분석해보도록 하겠습니다.

 

[ Python 3.5.4 버전을 활용하며, 개발 툴은 Pycharm을 사용 ]

 

 

1. TF-IDF 알고리즘

 

'TF-IDF(Term Frequency - Inverse Document Frequency)는 정보 검색과 텍스트 마이닝에서 이용하는 가중치로, 여러 문서로 이루어진 문서군이 있을 때 어떤 단어가 특정 문서 내에서 얼마나 중요한 것인지를 나타내는 통계적 수치.

문서의 핵심어를 추출하거나, 검색 엔진에서 검색 결과의 순위를 결정하거나, 문서들 사이의 비슷한 정도를 구하는 등의 용도로 사용' 한다고 합니다.

 

TF : 문서에 나타난 빈도

IDF : 단어가 나타난 문서의 빈도

 

 

즉, 문서의 수와 그 문서에 나타난 단어의 빈도수를 분석하여 유사도를 나타내는 것입니다.

 

더욱 자세한 사항은 https://ko.wikipedia.org/wiki/TF-IDF 에서 확인이 가능하십니다.

 

그렇다면,  TF-IDF의 복잡한 수식 없이 scikit-learnTfidfVectorizer을 활용하여 분석해보도록 하겠습니다.

 

먼저,

 

pip install scikit-learn 

 

을 통해 라이브러리를 설치해줍니다.

 

 

 

Pycharm을 통해 라이브러리 설치를 확인합니다.

 

ImportError: No module named 'scipy' 

 

와 같은 Error가 발생하면

 

pip install scipy 

 

를 통해 설치 후 해결해주도록 합니다.

 

뉴스 기사의 유사도를 분석하기에 앞서, 간단하게 코드를 보겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.feature_extraction.text import TfidfVectorizer
 
mydoclist = ['find what you love''do what you love'"don't do what you hate"]
 
tfidf_vectorizer = TfidfVectorizer(min_df=1)
tfidf_matrix = tfidf_vectorizer.fit_transform(mydoclist)
 
document_distances = (tfidf_matrix * tfidf_matrix.T)
 
print ('유사도 분석을 위한 ' + str(document_distances.get_shape()[0]) + 'x' + str(document_distances.get_shape()[1]) + ' matrix를 만들었습니다.')
 
print(document_distances.toarray())
 
cs

 

 

 

TfdifVectorizer을 import 한 후,

 

mydoclist에 비교하고자하는 문장을 담아줍니다. 우선 영어로 문서를 작성해보도록 하겠습니다.

 

다음과 첫번째 문서가 'find what you love', 두번째 문서가 'do what you love', 세번째 문서가 'dont't do what you hate'가 되겠네요 

 

분석 결과는 위와 같습니다.

 

 

그렇다면, 이번엔 한글로 mydoclist를 작성해보겠습니다.

 

다음과 같이 list에 3개의 한 문장으로 이루어진 문서를 넣어보았습니다.

 

mydoclist = ['영희가 좋아하는 사람은 철수다.',  '철수를 영희가 좋아한다.',  '영희는 철수를 좋아하고 있다.']

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.feature_extraction.text import TfidfVectorizer
 
mydoclist = ['영희가 좋아하는 사람은 철수다.',
             '철수를 영희가 좋아한다.',
             '영희는 철수를 좋아하고 있다.']
 
tfidf_vectorizer = TfidfVectorizer(min_df=1)
tfidf_matrix = tfidf_vectorizer.fit_transform(mydoclist)
 
document_distances = (tfidf_matrix * tfidf_matrix.T)
 
print ('유사도 분석을 위한 ' + str(document_distances.get_shape()[0]) + 'x' + str(document_distances.get_shape()[1]) + ' matrix를 만들었습니다.')
 
print(document_distances.toarray())
 
cs

 

 

 

첫번째 문서인 '영희가 좋아하는 사람은 철수다' 와 두번째 문서인 '철수를 영희가 좋아한다'의 유사도가 20%밖에 안나오네요

 

심지어, 첫번째 문서인 '영희가 좋아하는 사람은 철수다'와 세번째 문서인 '영희는 철수를 좋아하고 있다'는 유사도가 0%로 나오는걸 볼 수 있습니다.

 

우수한 한글의 특성상 조사에 따라 '단어'를 다르게 인식하는게 문제로 보이네요.

 

이러한 문제를 해결하기 위해, 다음 포스팅에서는 형태소 분석을 진행하여 명사에 붙은 조사를 떼어내고, 명사만으로 비교를 통해 유사도가 얼마나 올라가는지 비교해보도록 하겠습니다.

'텍스트 분석' 카테고리의 다른 글

텍스트 유사도 분석 - 3  (0) 2017.12.15
텍스트 유사도 분석 - 2  (0) 2017.12.14

+ Recent posts