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

 

이어 두 번째 시간에는 문장에서 조사를 떼어내고, 명사만 활용하여 분석을 시도해보도록 하겠습니다.

 

그러기 위해서, 한글 형태소 분석을 위한 '한국어 정보처리 파이썬 패키지'인 konlpy를 설치해줍니다.

 

Windows 10에서 konlpy를 설치하기 위해, http://konlpy-ko.readthedocs.io/ko/v0.4.3/install/#id2를 참고합니다.

 

저는 Python 3.5.4 버전에 Windows 10이 64bit이므로

 

https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype에 접속하여, JPype1‑0.6.2‑cp35‑cp35m‑win_amd64.whl 을 다운받고,

 

프롬프트에서 whl 설치 폴더로 이동하여,

 

pip install --upgrade pip  

 

pip install JPype1‑0.6.2‑cp35‑cp35m‑win_amd64.whl  

 

와 같이 설치해줍니다.

 

최종적으로

 

pip installl konlpy 

 

를 설치해줍니다.

 

+) JAVA환경변수가 설정되어있지 않으신 분들은 http://konlpy-ko.readthedocs.io/ko/v0.4.4/install/#id2 를 참고하여 환경변수를 설정해주시면 됩니다.

 

 

 

형태소 분석을 위해 Konlpy의 사용법을 익혀보도록 하겠습니다.

 

Konlpy의 Kkma class를 사용해보겠습니다

 

1
2
3
4
5
6
7
8
9
10
11
12
from konlpy.tag import Kkma
from konlpy.utils import pprint
 
kkma = Kkma()
 
sentence = u'영희와 철수는 백구를 산책시키기 위해 한강에 갔다. 한강에 도착하여 누렁이를 만났다.'
 
print('형태소 : ' + str(kkma.morphs(sentence)))
 
print('명사 : ' + str(kkma.nouns(sentence)))
 
print('품사 : ' + str(kkma.pos(sentence)))
cs

 

출력결과는

 

1
2
3
4
5
6
7
8
9
10
형태소 : ['영희''와''철수''는''백구''를''산책''시키''기''위하''어''한강''에''가''었''다''.''한강''에''도착''하''여''누렁이''를''만나''었''다''.']
 
 
명사 : ['영희''철수''백구''산책''한강''도착''누렁이']
 
 
품사 : [('영희''NNP'), ('와''JKM'), ('철수''NNG'), ('는''JX'), ('백구''NNG'), ('를''JKO'), ('산책''NNG'), ('시키''XSV'),
        ('기''ETN'), ('위하''VV'), ('어''ECS'), ('한강''NNP'), ('에''JKM'), ('가''VV'), ('었''EPT'), ('다''EFN'), ('.''SF'), ('한강''NNP'),
        ('에''JKM'), ('도착''NNG'), ('하''XSV'), ('여''ECS'), ('누렁이''NNG'), ('를''JKO'), ('만나''VV'), ('었''EPT'), ('다''EFN'), ('.''SF')]
 
cs

 

와 같이 조사를 제거하고 명사를 잘 추출하는 것을 볼 수 있습니다.

 

또 다른 class인 Twitter을 사용해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
from konlpy.tag import Twitter
from konlpy.utils import pprint
 
twitter =Twitter()
 
sentence = u'영희와 철수는 백구를 산책시키기 위해 한강에 갔다. 한강에 도착하여 누렁이를 만났다.'
 
print('형태소 : ' + str(twitter.morphs(sentence)))
 
print('명사 : ' + str(twitter.nouns(sentence)))
 
print('품사 : ' + str(twitter.pos(sentence)))
cs

 

 

1
2
3
4
5
6
7
8
형태소 : ['영희''와''철수''는''백구''를''산책''시키''기''위해''한강''에''갔''다''.''한강''에''도착하여''누렁이''를''만났''다''.']
 
명사 : ['영희''철수''백구''산책''위해''한강''한강''누렁이']
 
품사 : [('영희''Noun'), ('와''Josa'), ('철수''Noun'), ('는''Josa'), ('백구''Noun'), ('를''Josa'), ('산책''Noun'), 
        ('시키''Verb'), ('기''Eomi'), ('위해''Noun'), ('한강''Noun'), ('에''Josa'), ('갔''Verb'), ('다''Eomi'), ('.''Punctuation'), ('한강''Noun'), 
        ('에''Josa'), ('도착하여''Verb'), ('누렁이''Noun'), ('를''Josa'), ('만났''Verb'), ('다''Eomi'), ('.''Punctuation')]
 
cs

 

Twitter class 역시 어느정도 분석을 잘하는 것을 확인할 수 있습니다.

 

 

하나만 더 비교해보도록 하겠습니다.

 

이전 포스팅의 각 문서 1, 2, 3을 조금 수정해보았습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
from konlpy.tag import Kkma, Twitter
from konlpy.utils import pprint
 
mydoclist = ['영희가 사랑하는 강아지 백구를 산책시키고 있다.',
             '철수가 사랑하는 소 누렁이를 운동시키고 있다.',
             '영희와 철수는 소와 강아지를 산책 및 운동시키고 있다.']
 
twitter = Twitter()
kkma = Kkma()
 
 
print('명사 : ' + str(kkma.nouns(mydoclist[0])))
print('명사 : ' + str(twitter.nouns(mydoclist[0])))
cs

 

첫번째 문서인 '영희가 사랑하는 강아지 백구를 산책시키고 있다.'를 분석한 결과는 다음과 같습니다.

 

1
2
3
명사 : ['영희''사랑''강아지''백구''산책'# Kkma class
 
명사 : ['영희''강아지''백구''산책'# Twitter class
cs

 

Twitter은 '사랑하-'를 '동사'로 인식하여 이 부분은 추출하지 못하는 것을 볼 수 있습니다.

 

 

+) 추가적으로 위의 수정한 문서를 통한 TfidfVectorizer의 결과는 아래와 같습니다.

 

 

 

어느 정도 유사한 문장이 있음에도 불구하고 유사도가 6~22% 남짓 나오고 있습니다.

 

 

다시 돌아와, 분석에 조금 더 용이할 것 같아 Kkma class를 활용해 분석해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from sklearn.feature_extraction.text import TfidfVectorizer
from konlpy.tag import Kkma, Twitter
from konlpy.utils import pprint
 
mydoclist = ['영희가 사랑하는 강아지 백구를 산책시키고 있다.',
             '철수가 사랑하는 소 누렁이를 운동시키고 있다.',
             '영희와 철수는 소와 강아지를 산책 및 운동시키고 있다.']
 
kkma = Kkma()
 
doc_nouns_list = []
 
for doc in mydoclist:
    nouns = kkma.nouns(doc)
    doc_nouns = ''
 
    for noun in nouns:
        doc_nouns += noun + ' '
 
    doc_nouns_list.append(doc_nouns)
 
for i in range(03):
    print('doc' + str(i + 1+ ' : ' + str(doc_nouns_list[i]))
cs

 

먼저 추출한 명사를 doc_nouns_list에 넣어주었습니다.

 

1
2
3
4
5
doc1 : 영희 사랑 강아지 백구 산책 
 
doc2 : 철수 사랑 소 누렁이 운동 
 
doc3 : 영희 철수 소 강아지 산책 운동 
cs

 

출력 결과는 위와 같습니다.

 

이제 이전 포스팅에서 사용했던 TfidfVectorizer을 활용하여 비교해보도록 하겠습니다. 아래쪽에 코드를 더 추가해줍니다.

 

1
2
3
4
5
6
7
8
tfidf_vectorizer = TfidfVectorizer(min_df=1)
tfidf_matrix = tfidf_vectorizer.fit_transform(doc_nouns_list)
 
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

 

 

결과는

 

 

 

형태소를 분석하여 비교하니 세번째 문서와 첫번째 문서 그리고 세번째 문서와 두번째 문서가 어느정도 유사함을 보이는게 보이는군요 !

 

 

다음 포스팅에서는 간단하게 이를 활용하여 뉴스를 분석해보도록 하겠습니다.

 

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

텍스트 유사도 분석 - 3  (0) 2017.12.15
텍스트 유사도 분석 - 1  (0) 2017.12.13

+ Recent posts