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('완료')
위 과정에서 만든 모델로 유사한 단어, 반대되는 단어 등을 찾을 수 있다.
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 |