def save_model(tokenize, epochs, min_alpha, corpus_list, model_name):
# Mecab
tagger = Mecab()
# corpus 저장 리스트
tagged_corpus_list = []
# corpus 생성 (TaggedDocument 추가)
for corpus in corpus_list:
# 태그
tag = corpus[0]
# 내용
word = corpus[1]
# tokenize에 따라 다른 방법으로 Word Tokenize
if tokenize == 'morphs':
tagged_corpus_list.append(doc2vec.TaggedDocument(tags=[tag], words=tagger.morphs(word)))
elif tokenize == 'nouns':
tagged_corpus_list.append(doc2vec.TaggedDocument(tags=[tag], words=tagger.nouns(word)))
elif tokenize == 'split':
tagged_corpus_list.append(doc2vec.TaggedDocument(tags=[tag], words=word.split(' ')))
else:
print("Not Valid Tokenize")
return
print(f"Corpus Size: {len(corpus_list)}", end=' / ')
# Doc2Vec 클래스 생성
# vector_size = Dimensionality of the feature vectors.
# alpha = The initial learning rate.
# min_alpha = Learning rate will linearly drop to min_alpha as training progresses.
model = doc2vec.Doc2Vec(vector_size=300, alpha=0.025, min_alpha=min_alpha, workers=8, window=8, dm=dm)
# Vocabulary 빌드
model.build_vocab(tagged_corpus_list)
print(f"Tag Size: {len(model.docvecs.doctags.keys())}", end=' / ')
# Doc2Vec 학습
start_time = time.time()
model.train(tagged_corpus_list, total_examples=model.corpus_count, epochs=epochs)
end_time = time.time()
print(f"Time: {(end_time - start_time):.3f} sec", end=' / ')
# 저장 경로
path = {경로}
print("Path:", path)
# 모델 저장
model.save(path)
모델 학습 및 저장 함수
doc2vec의 학습 데이터셋은 word2vec과 유사하지만 살짝 다르다. 말뭉치(corpus)에서 해당 말뭉치들을 대표하는 태그가 추가된 TaggedDocument 클래스를 데이터셋으로 받는다.
def test_model(token, path, corpus):
# Mecab
tagger = Mecab()
# 모델 불러오기
model = Doc2Vec.load(path)
# 3가지 방식으로 토큰화 후 벡터화
if token == 'morphs':
inf_vector = model.infer_vector(tagger.morphs(corpus))
elif token == 'nouns':
inf_vector = model.infer_vector(tagger.nouns(corpus))
elif token == 'split':
inf_vector = model.infer_vector(corpus.split(' '))
else:
print("Not Valid Tokenize")
return
# inf_vector 유사도가 가장 높은 태그와 유사도
most_sim_list = model.docvecs.most_similar([inf_vector])
for m in most_sim_list:
print(m[0], round(m[1], 3))
모델을 불러와 입력 받은 문장을 새로 벡터화 후 기존의 벡터화된 문장들(태그)과와 코사인 유사도를 비교하여 상위 10개의 태그와 유사도를 출력하는 함수
학습 파라미터
- Algorithm: PV-DM
- Dimension: 300
- Epoch: 2000
- Learning Rate: 0.025
- Target Learning Rate (Decay): 0.0001
- Tokenize: Mecab - morphs (형태소 단위)
'파이썬' 카테고리의 다른 글
[파이썬] Selenium과 Threading을 이용하여 구글 이미지 크롤링 (8) | 2021.05.26 |
---|---|
[파이썬] 멀티 쓰레드 정리 (0) | 2021.03.31 |
[파이썬] OpenCV, Pandas를 이용하여 LATCH 정보 출력 (2) | 2020.09.12 |
[파이썬] 특수문자 비교 관련 (0) | 2020.09.11 |
[파이썬] OpenCV, OpenPose를 이용하여 사진 속 인물의 자세 추정 - Experimental Model 추가 (1) | 2020.08.14 |