티스토리 뷰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
# ************
# NLTK 자연어 처리 패키지
# ************
"""
https://datascienceschool.net/view-notebook/118731eec74b4ad3bdd2f89bab077e1b/
NLTK(Natural Language Toolkit) 패키지는
교육용으로 개발된 자연어 처리 및 문서 분석용 파이썬 패키지다.
다양한 기능 및 예제를 가지고 있으며 실무 및 연구에서도 많이 사용된다.
NLTK 패키지가 제공하는 주요 기능은 다음과 같다.
말뭉치
토큰 생성
형태소 분석
품사 태깅
"""
# *********
# 말뭉치
# *********
"""
말뭉치(corpus)는 자연어 분석 작업을 위해 만든 샘플 문서 집합을 말한다.
단순히 소설, 신문 등의 문서를 모아놓은 것도 있지만
품사. 형태소, 등의 보조적 의미를 추가하고 쉬운 분석을 위해
구조적인 형태로 정리해 놓은 것을 포함한다.
NLTK 패키지의 corpus 서브패키지에서는 다양한 연구용 말뭉치를 제공한다.
이 목록은 전체 corpus의 일부일 뿐이다.
말뭉치 자료는 설치시에 제공되지 않고 download 명령으로
사용자가 다운로드 받아야 한다.
nltk.download('book') 명령을 실행하면
NLTK 패키지 사용자 설명서에서 요구하는
대부분의 말뭉치를 다운로드 받아준다.
"""
import nltk
nltk.download('book', quiet=True)
from nltk.book import *
"""예를 들어 저작권이 말소된 문학작품을 포함하는 gutenberg 말뭉치에는
다음과 같은 작품이 샘플로 포함되어 있다."""
nltk.corpus.gutenberg.fileids()
# 이 중 제인 오스틴의 엠마 문서를 살펴보면
# 다음과 같이 원문 형태 그대로를 포함하고 있다.
emma_raw = nltk.corpus.gutenberg.raw("austen-emma.txt")
print(emma_raw[:1302])
# ************
# 토큰 생성
# ************
"""
자연어 문서를 분석하기 위해서는 우선 긴 문자열을 분석을 위한
작은 단위로 나누어야 한다.
이 문자열 단위를 토큰(token)이라고 하고
이렇게 문자열을 토큰으로 나누는 작업을 토큰 생성(tokenizing)이라고 한다.
영문의 경우에는 문장, 단어 등을
토큰으로 사용하거나 정규 표현식을 쓸 수 있다.
문자열을 토큰으로 분리하는 함수를
토큰 생성 함수(tokenizer)라고 한다.
토큰 생성 함수는 문자열을 입력받아 토큰 문자열의 리스트를 출력한다."""
from nltk.tokenize import sent_tokenize
print(sent_tokenize(emma_raw[:1000])[3])
from nltk.tokenize import word_tokenize
word_tokenize(emma_raw[50:100])
from nltk.tokenize import RegexpTokenizer
retokenize = RegexpTokenizer("[\w]+")
retokenize.tokenize(emma_raw[50:100])
# ***************
# 형태소 분석
# ***************
"""
형태소(morpheme)는 언어학에서
일정한 의미가 있는 가장 작은 말의 단위를 뜻한다.
보통 자연어 처리에서는 토큰으로 형태소를 이용한다.
형태소 분석(morphological analysis)이란 단어로부터
어근, 접두사, 접미사, 품사 등 다양한 언어적 속성을 파악하고
이를 이용하여 형태소를 찾아내거나 처리하는 작업이다.
형태소 분석의 예로는 다음과 같은 작업이 있다.
어간 추출(stemming)
원형 복원(lemmatizing)
품사 부착(Part-Of-Speech tagging)
어간 추출과 원형 복원¶
어간 추출(stemming)은 변화된 단어의 접미사나 어미를 제거하여
같은 의미를 가지는 형태소의 기본형을 찾는 방법이다.
NLTK는 PorterStemmer LancasterStemmer 등을 제공한다.
어간 추출법은 단순히 어미를 제거할 뿐이므로
단어의 원형의 정확히 찾아주지는 않는다.
"""
words = ['lives', 'crying', 'flies', 'dying']
from nltk.stem import PorterStemmer
st = PorterStemmer()
[st.stem(w) for w in words]
from nltk.stem import LancasterStemmer
st = LancasterStemmer()
[st.stem(w) for w in words]
# 원형 복원(lemmatizing)은 같은 의미를 가지는 여러 단어를
# 사전형으로 통일하는 작업이다. 품사(part of speech)를 지정하는 경우
# 좀 더 정확한 원형을 찾을 수 있다.
from nltk.stem import WordNetLemmatizer
lm = WordNetLemmatizer()
[lm.lemmatize(w) for w in words]
lm.lemmatize("dying", pos="v")
# **********
# POS tagging
# **********
"""
품사(POS, part-of-speech)는 낱말을
문법적인 기능이나 형태, 뜻에 따라 구분한 것이다.
품사의 구분은 언어마다 그리고 학자마다 다르다.
예를 들어 NLTK에서는 펜 트리뱅크 태그세트(Penn Treebank Tagset)
라는 것을 이용한다.
다음은 펜 트리뱅크 태그세트에서 사용하는 품사의 예이다.
NNP: 단수 고유명사
VB: 동사
VBP: 동사 현재형
TO: to 전치사
NN: 명사(단수형 혹은 집합형)
DT: 관형사
nltk.help.upenn_tagset 명령으로 자세한 설명을 볼 수 있다.
"""
nltk.help.upenn_tagset('VB')
"""국내 태그세트로는 "21세기 세종계획 품사 태그세트"를 비롯하여
다양한 품사 태그세트가 있으며 세종계획 품사 태그세트에 대해서는
"(21세기 세종계획)국어 기초자료 구축" 보고서의
"어절 분석 표지 표준안"을 참조한다.
사실은 형태소 분석기마다 사용하는 품사 태그가 다르며
자세한 내용은 다음절의 koNLPy 패키지에서 설명한다.
pos_tag 명령을 사용하면 단어 토큰에 품사를 부착하여 튜플로 출력한다.
다음 예문에서 refuse, permit이라는 같은 철자의 단어가
각각 동사와 명사로 다르게 품사 부착된 것을 볼 수 있다."""
from nltk.tag import pos_tag
sentence = "Emma refused to permit us to obtain the refuse permit"
tagged_list = pos_tag(word_tokenize(sentence))
tagged_list
# 품사 태그 정보를 사용하면 명사인 토큰만 선택할 수 있다.
nouns_list = [t[0] for t in tagged_list if t[1] == "NN"]
nouns_list
# untag 명령을 사용하면 태그 튜플을 제거할 수 있다.
from nltk.tag import untag
untag(tagged_list)
# Scikit-Learn 등에서 자연어 분석을 할 때는 같은 토큰이라도
# 품사가 다르면 다른 토큰으로 처리해야 하는 경우가 많은데
# 이 때는 원래의 토큰과 품사를 붙여서 새로운 토큰 이름을 만들어 사용하면
# 철자가 같고 품사가 다른 단어를 구분할 수 있다.
def tokenizer(doc):
return ["/".join(p) for p in tagged_list]
tokenizer(sentence)
# ***********
# Text 클래스
# ***********
# NLTK의 Text 클래스는 문서 분석에 유용한 여러가지 메서드를 제공한다.
# 토큰열을 입력하여 생성한다.
from nltk import Text
text = Text(retokenize.tokenize(emma_raw), name="Emma")
# plot 메소드를 사용하면 각 단어(토큰)의 사용 빈도를 그래프로 그려준다.
text.plot(20)
plt.show()
# dispersion_plot 메서드는 단어가 사용된 위치를 시각화한다.
# 소설 엠마의 각 등장인물에
# 대해 적용하면 다음과 같은 결과를 얻는다.
text.dispersion_plot(["Emma", "Knightley", "Frank", "Jane", "Harriet", "Robert"])
# concordance 메서드로 단어가 사용된 위치를 직접 표시할 수도 있다.
text.concordance('Emma', lines=5)
# similar 메서드는 해당 단어와 비슷한 문맥에서 사용된 단어들을 찾는다.
text.similar('Emma', 10)
# collocations 메서드로는 같이 붙어서 쓰이는 단어
# 즉, 연어(collocation)를 찾는다.
text.collocations(10)
# ***********
# FreqDist
# ***********
fd = text.vocab()
type(fd)
# 또는 다음처럼 토큰 리스트를 넣어서 직업 만들 수도 있다.
# 다음 코드에서는 Emma 말뭉치에서 사람의 이름만 모아서 FreqDist 클래스 객체를 만들었다.
# 품사 태그에서 NNP(고유대명사)이면서 필요없는 단어(stop words)는 제거하였다
from nltk import FreqDist
stopwords = ["Mr.", "Mrs.", "Miss", "Mr", "Mrs", "Dear"]
emma_tokens = pos_tag(retokenize.tokenize(emma_raw))
names_list = [t[0] for t in emma_tokens if t[1] == "NNP" and t[0] not in stopwords]
fd_names = FreqDist(names_list)
# FreqDist 클래스는 단어를 키(key), 출현빈도를 값(value)으로
# 가지는 사전 자료형과 유사하다.
# 다음 코드는 전체 단어의 수, "Emma"라는 단어의 출현 횟수, 확률을 각각 계산한다.
fd_names.N(), fd_names["Emma"], fd_names.freq("Emma")
# 워드클라우드
# most_common 메서드를 사용하면 가장 출현 횟수가 높은 단어를 찾는다.
fd_names.most_common(5)
# ***********
# 워드클라우드
# ***********
# wordcloud 패키지를 사용하면 단어의 사용 빈도수에 따라
# 워드클라우드(Word Cloud) 시각화를 할 수 있다.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
wc = WordCloud(width=1000, height=600, background_color="white", random_state=0)
plt.imshow(wc.generate_from_frequencies(fd_names))
plt.axis("off")
plt.show()
|
cs |
'5. 파이썬' 카테고리의 다른 글
[파이썬] 인공지능 개발환경 아나콘다(Anaconda) , 파이참(Pycharm) 설치하기 (0) | 2020.05.24 |
---|---|
[파이썬 NL] 한글 자연어 처리기 Komoran, Hannanum, Kkma, Okt 성능 비교 (사이트 링크) (0) | 2020.05.24 |
[파이썬 DM] NLTK 자연어 처리 패키지 (사이트 링크) (0) | 2020.05.24 |
파이썬/자연어/2020-05-24/ 꼬꼬마 이용한 텍스트 마이닝 (0) | 2020.05.24 |
[플라스크] index.html (0) | 2020.05.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Git
- Java
- terms
- COLAB
- maven
- intellij
- ERD
- SQLAlchemy
- jQuery
- Algorithm
- database
- mariadb
- SpringBoot
- Django
- Mlearn
- docker
- nodejs
- JUnit
- Oracle
- React
- Python
- JPA
- tensorflow
- vscode
- AWS
- Eclipse
- Mongo
- KAFKA
- springMVC
- FLASK
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함