목차
한국어 형태소를 분석하기위해 KoNLPy 라이브러리를 사용한다.
KoNLPy 라이브러리에는 5가지 종류{Hannanum, Kkma, Komoran, Mecab, Okt(Twitter)}의 형태소 분석기가 있다. 파이썬뿐만 아니라 다양한 프로그래밍 언어로 된 형태소 분석을 할 수 있는 라이브러리가 많이 존재한다.
NLP : National Language Processing의 줄임말로 자연어 처리라는 뜻으로 텍스트에서 의미있는 정보를 분석, 추출, 이해하는 기술이다.
이 글에서는 Okt를 사용해 형태소 분석을 진행한다.
Okt에서 제공하는 함수들
- morphs() : 텍스트를 형태소 단위로 나눈다.
옵션 : norm, stem. norm은 normalize의 약자로 문장의 정규화 여부를 정하는 옵션이다.
stem은 각 단어에서 어간을 추출할지 정하는 옵션이다. 기본값은 둘다 False.
- nouns() : 텍스트에서 명사만 추출한다.
- phrases() : 텍스트에서 어절을 추출한다.
- pos() : 텍스트를 형태소 단위로 나눈 뒤, 형태소와 품사 정보를 리스트화한 결과를 반환한다.
pos() 함수도 norm, stem 옵션이 있다.
[실습 1 - 간단한 형태소 분석]
#1 - 간단한 형태소 분석
from konlpy.tag import Okt
okt = Okt()
malist=okt.pos("아버지 가방에 들어가신다.", norm=True, stem=True)
print(malist)
1. Okt() 메서드를 사용해 Okt 객체를 생성한다.
2. malist 변수에 해당 텍스트를 형태소로 나눈 뒤, 형태소와 품사 정보를 리스트화한 결과를 저장한다.
3. 결과를 보면 텍스트에서 '들어가신다' 부분이 '들어가다'라고 출력되었다. 그 이유는 stem 값을 True로 했기 때문이다. stem 값을 True로 하면 원형을 찾아주기 때문에 '들어가시다'의 원형인 '들어가다'가 출력되었다.
또한, Okt는 결과 화면과 같이 품사 정보를 읽기 쉽게 출력해준다.
[실습 2 - 출현 빈도 분석]
박경리의 "토지"를 활용해 어떤 명사가 얼마나 나오는 지 분석해보겠다.
import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt
fp = codecs.open("BEXX0003.txt", "r", encoding="utf-16")
soup = BeautifulSoup(fp, "html.parser")
text = soup.select_one('body').text #body 태그 안의 텍스트 추출(텍스트가 태그 안에 존재하기 때문)
okt=Okt()
word_dic={} #딕셔너리 변수 선언
lines=text.split("\n")
for line in lines:
malist=okt.pos(line) #문장을 형태소로 분석 후 품사 정보와 함께 저장
for word in malist: #word 값 예시 => ('마을', 'Noun')
print(word)
if word[1]=="Noun": #품사 정보가 Noun, 즉 품사가 명사라면 딕셔너리 변수에 해당 글자를 딕셔너리 변수에 넣음
if not (word[0] in word_dic):
word_dic[word[0]]=0
word_dic[word[0]]+=1
keys=sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
for word, count in keys[:50]:
print("{0}({1})".format(word, count), end="")
print()
1. 박경리의 "토지" 파일은 국립국어원 언어 정보 나눔터 말뭉치 데이터베이스에서 다운로드 받을 수 있다.
https://ithub.korean.go.kr/user/total/database/corpusManager.do
2. 텍스트가 body 태그 안에 존재하기 때문에 텍스트만 추출하기 위해 BeautifulSoup을 사용한다.
3. 텍스트를 한 줄씩 분리하고 한 줄씩 형태소를 분석해서 품사 정보와 함께 malist에 저장한다.
4. 단어가 key값, 해당 단어의 빈도 값이 value로 word_dic 변수에 저장된다.
5. 빈도 수가 높은 단어부터 출력하기 위해 word_dic변수를 정렬한 다음에 출력한다.
참고자료
파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문_ 쿠지라 히코우즈쿠에 저
'Study > 머신러닝' 카테고리의 다른 글
[4] MLP(Multi Layer Perceptron)로 텍스트 분류하기 (0) | 2020.07.30 |
---|---|
[3] 나이브 베이즈 분류를 사용한 텍스트 분류 (0) | 2020.07.25 |
[2-2] Word2Vec을 활용해 문장을 벡터로 변환하기 (0) | 2020.07.17 |
[1-2] 서포트 벡터 머신(Support Vector Machine) (0) | 2020.07.10 |
[1-1] 의사 결정 나무 (0) | 2020.07.10 |