본문 바로가기

AI

6-1. 자연어분석(NoMLPy, Gensim)

1. 형태소분석: 문장을 형태소 단위로 분할하고 품사를 판별하는 작업

KoNLPy를 사용하여 문장을 형태소분석을 해보자.

KoNLPy란 한국어 형태소 분석 라이브러리로 한나눔, 꼬꼬마, Komoran, MeCab, 트위터 등의 형태소 분석기 사용할 수 있다. 

KoNLPy를 사용하기 전에 자바, KoNLPy 등을 설치해야한다.

#apt-get install g++ openjdk-8-jdk python-dev python3-dev

#pip install konlpy

from konlpy.tag import Twitter
twitter = Twitter()
malist = twitter.pos("이건 무슨 소리냨ㅋㅋㅋ?!", norm=True, stem=True)

print(malist)

문장을 형태소로 나눈 후 품사를 판별하여 리턴한다

코드에서는 트위터 분석기를 사용했다. 옵션은 예를들어 "그래욬ㅋㅋㅋ" 이라고 왔을 때

norm옵션은 그래요/ㅋㅋㅋㅋ으로 나눠주고, stem옵션은 그래요 -> 그렇다 로 변환해준다.

 

2.Word2Vec: 문장 내부의 단어를 벡터로 변환하는 도구.

단어를 벡터로 만들어 단어와 단어간 유사도를 계산하고 활용할 수 있다. 예를들어 왕자-남자+여자 = 공주 같은 계산을 수행할 수 있다.

Word2Vec는 다양한 도구를 쓸 수있는데 Gensim을 사용해서 소설 학습 모델을 만들어보았다.

import codecs
from konlpy.tag import Twitter
from gensim.models import word2vec

fp = codecs.open("change.txt", "r", encoding="utf-8")
text = fp.read()

#텍스트를 한줄씩 처리
twitter = Twitter()
results = []
results = text.split("\n")

#파일로 출력
temp_file = "change.tempfile"
with open(wakati_file, "w", encoding = "utf-8") as fp:
    fp.write("\n".join(results))

#Word2Vec 모델 만들기
data = word2vec.LineSentence(temp_file) #분류
model = word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
model.save("change.model")

 

특정 형태소만 분석하고 싶은 경우는 다음과 같이 하면 된다

for line in text.split("\n"):
    #형태소분석
    malist = twitter.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()
    results.append(rl)

 

Word2Vec의 파라미터는 다음과 같다.

size = 벡터의 차원.

window = 컨텍스트 윈도우 크기. 단어 앞 뒤로 몇글자까지 볼지

  -"맛있는 배가 나무 아래에 있다" 에서 딱 "배"만 보는 것이 아니라 "맛있는 배가 나무" 이런식으로 보고 문맥을 살피는 범위이다.

min_count = 데이터에서 등장하는 단어의 최소빈도

  -빈도가 적은 단어들은 학습 X. min_count가 작으면 그만큼 많은 단어들이 학습된다

workers = 학습을 위한 프로세스 수

sg = 0이면 CBOW 방법, 1이면 Skip-gram 방법이다.

 -Skip-gram: 하나의 단어에서 여러 단어를 예측하는 방법

 -CBOW: 주변의 단어를 이용해 하나의 단어를 찾아내는 방법이다.

 

 

검색했더니 아래와 같은 형태의 코드도 있었다. 위 코드는 조사도 다 포함해서 모델이 생성될 것이다.

from gensim.models import Word2Vec 
from gensim.models.callbacks import CallbackAny2Vec
from tqdm import tqdm

corpus_fname = 'change.txt' 
model_fname = 'change3.model' 

print('corpus(말뭉치) 생성') 
corpus = [sent.strip().split(" ") for sent in tqdm(open(corpus_fname, 'r', encoding='euc-kr').readlines())] 
print("학습...") 
model = Word2Vec(corpus, size=100, workers=4, sg=1, compute_loss=True, iter=5) 
model.wv.save_word2vec_format(model_fname) 
print('완료')

wakati파일의 내용. 소설을 위와같은 형태로 바꾸어서 분석한다.
change3.model의 내용. 카프카의 변신을 학습한 모델이다

위 과정에서 만든 모델로 유사한 단어, 반대되는 단어 등을 찾을 수 있다.

from gensim.models import KeyedVectors 
loaded_model = KeyedVectors.load_word2vec_format("change3.model") 

# 모델을 로딩하여 가장 유사한 단어를 출력 
print(loaded_model.wv.vectors.shape) 
print(loaded_model.wv.most_similar("그")) 

"그" 라는 단어와 유사한 단어들을 찾아준다

파이썬은 기본적으로 utf-8 인코딩을 사용하므로 텍스트파일을 utf-8로 바꾼 후 모델을 생성하는 것이 좋다.

 

참고링크

https://dreamgonfly.github.io/blog/word2vec-explained/

https://datascienceschool.net/view-notebook/6927b0906f884a67b0da9310d3a581ee/

'AI' 카테고리의 다른 글

6-2. 자연어분석(베이즈정리)  (0) 2020.09.19
5. 딥러닝(Keras)  (0) 2020.09.12
4-2. 머신러닝(SVM, Cross Validation, GridSearch)  (0) 2020.09.11
4-1. 머신러닝  (0) 2020.09.10