★ 아직 많이 부족합니다. 댓글을 통한 가르침 환영입니다. ★
이어 두 번째 시간에는 문장에서 조사를 떼어내고, 명사만 활용하여 분석을 시도해보도록 하겠습니다.
그러기 위해서, 한글 형태소 분석을 위한 '한국어 정보처리 파이썬 패키지'인 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(0, 3):
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 |