야금야금

한국어 분석(형태소 분석) 본문

SWING/머신러닝

한국어 분석(형태소 분석)

hyk0425 2020. 7. 25. 10:39

형태소 분석

: 자연 언어의 문장을 최소 단위(형태소)로 분할하고, 품사를 판별하는 작업이다.

형태소 분석은 기계 번역, 텍스트 마이닝 등의 여러 분야에서 활용된다.

 

영어의 경우 띄어쓰기를 통해 형태소를 분석하기 때문에 어렵지 않다. 하지만 아시아 계열의 언어의 경우 품사 사전과 문법 사전을 기반으로 대조하면서 형태소 분석을 진행해야 한다. 문법 규칙에 의한 방법과 확률적 언어 모델을 사용하는 등 방법이 있고 최근 확률적 언어 모델을 사용한 형태소 분석이 많아져 정밀도가 높아졌다.

 

 

한국어 형태소 분석

KoNLPy의 트위터 형태소 분석기

from konlpy.tag import Okt
okt = Okt()
malist1 = okt.pos("아버지 가방에 들어가신다." , norm = True, stem = True)
malist2 = okt.pos("그래욬ㅋㅋ?" , norm = True, stem = True)
malist3 = okt.pos("그래욬ㅋㅋ?" , norm = False, stem = True)
malist4 = okt.pos("그래욬ㅋ?" , norm = True, stem =False)
print(malist1)
print(malist2)
print(malist3)
print(malist4)

 

Okt() : Okt객체 생성 메서드

pos() : 형태소 분석을 진행할 문장을 지정하는 메서드

 

 

norm옵션 : 그래욬ㅋㅋ -> 그래요 처럼 변환해주는 옵션

stem옵션 : 원형을 찾아주는 옵션 (그래요 -> 그렇다)

 

 

 

박경리의 "토지"를 사용한 출현 빈도 분석

 

 

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")
body = soup.select_one("body > text")
text = body.getText()

okt = Okt()
word_dic ={}
lines = text.split("\n")
for line in lines:
    malist = okt.pos(line)
    for word in malist:
        if word[1] == "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()

 

실행 결과

 

 

 

 

Word2Vec

: 문장 내부의 단어를 벡터로 변환하는 도구이다. 단어의 연결을 기반으로 단어의 연관성을 벡터로 만들어준다. 이를 활용하면 단어의 의미를 파악할 수 있다.

 

 

 

Gensim의 Word2Vec으로 "토지" 읽어보기

다음 코드는 koNLPy의 Okt 형태소 분석기로 형태소를 나누고 Word2Vec으로 읽어 들이는 예제이다

import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt
from gensim.models import word2vec

fp = codecs.open("BEXX0003.txt", "r", encoding="utf=16")
soup = BeautifulSoup(fp, "html.parser")
body = soup.select_one("body > text")
text = body.getText()

okt = Okt()
result = []
lines = text.split("\n")

for line in lines:
    malist = okt.pos(line, norm=True, stem=True)
    r =[]
    for word in malist:
        if not word[1] in ["Josa", "Eomi", "Punctuation"]:
            r.append(word[0])
    rl = (" ".join(r)).strip()
    result.append(rl)
    print(rl)

gubun_file = 'toji.gubun'
with open(gubun_file, 'w', encoding='utf-8') as fp:
    fp.write("\n".join(result))

data = word2vec.LineSentence(gubun_file)
model = word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
model.save("toji.model")
print("ok")

 

프로그램을 실행하면 "toji.model"이라는 모델 파일이 생성되며 아래와 같이 학습에 사용할 텍스트가 출력된다.

 

"토지" 모델 살펴보기

위에서 생성한 토지 모델을 읽어 들여서 단어를 추출해 보자

먼저 "땅"과 유사한 단어를 추출해보았다.

from gensim.models import word2vec
model = word2vec.Word2Vec.load("toji.model")

print(model.most_similar(positive=["땅"]))

 

실행 결과는 다음과 같다.

땅과 비슷한 단어로는 "육", "원귀", "일기", "사흘", "누님", "어무님", "커서", "봇짐", "시월", "장차"등이 추출되었다.