word2vecのvocabulary更新および再学習方法



Programming fastText word2vec

2018-09-30

はじめに


word2vecモデルを用いてオンライン学習を行うためには、vocabularyを更新し、再学習する必要がある。そのまとめた情報をここで共有する。

コンテンツ


  • コーパスの学習
  • vocabularyの追加および、再学習

コーパスの学習


fasttextのインストール方法など基本的な使い方は前記事参照。

例によって、学習データとして分かち書きしたwikipediaコーパスを利用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import gensim
import os
from gensim.models.word2vec import LineSentence
from gensim.models.fasttext import FastText as FT_gensim

#set wikipedia corpus
lee_data = LineSentence("./wiki_corpus_wakati.txt")

model_gensim = FT_gensim(size=100)

#build the vocabulary
model_gensim.build_vocab(lee_data)

#train the model
model_gensim.train(lee_data, total_examples=model_gensim.corpus_count, epochs=model_gensim.iter)

print(model_gensim)

実行結果

FastText(vocab=511322, size=100, alpha=0.025)

試しに、「イリオモテヤマネコ」の類義語を獲得する。

1
model_gensim.most_similar("イリオモテヤマネコ")
[(‘ニホンイノシシ’, 0.8724625706672668),
(‘ミナミハンドウイルカ’, 0.8698593974113464),
(‘オオヤマネコ’, 0.8691668510437012),
(‘ヤマネコ’, 0.8595893979072571),
(‘ウミタナゴ’, 0.8558826446533203),
(‘チュウゴクオオサンショウウオ’, 0.8558309078216553),
(‘ニホンアナグマ’, 0.8543074131011963),
(‘ニホンザル’, 0.8535688519477844),
(‘ニホンカナヘビ’, 0.8525514006614685),
(‘ニホンイタチ’, 0.8515022993087769)]

「イリオモテヤマネコ」は「ヤマネコ」よりも「ミナミハンドウイルカ」の方が似ているという驚きの結果はさておき、
語彙として登録されていることは確認できる。


次に「ベンガルヤマネコ」の類義語を獲得を試みると、

1
model_gensim.most_similar("ベンガルヤマネコ")
—————————————————————————
IndexError Traceback (most recent call last)
in ()
—-> 1 loaded_model.most_similar(“ベンガルヤマネコ”)

~/.pyenv/versions/3.5.0/lib/python3.5/site-packages/gensim/utils.py in new_func1(*args, **kwargs)
1396 stacklevel=2
1397 )
-> 1398 return func(*args, **kwargs)
1399
1400 return new_func1

~/.pyenv/versions/3.5.0/lib/python3.5/site-packages/gensim/models/base_any2vec.py in most_similar(self, positive, negative, topn, restrict_vocab, indexer)
694 Refer to the documentation for `gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.most_similar`
695 “””
–> 696 return self.wv.most_similar(positive, negative, topn, restrict_vocab, indexer)
697
698 @deprecated(“Method will be removed in 4.0.0, use self.wv.wmdistance() instead”)

~/.pyenv/versions/3.5.0/lib/python3.5/site-packages/gensim/models/keyedvectors.py in most_similar(self, positive, negative, topn, restrict_vocab, indexer)
379 best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True)
380 # ignore (don’t return) words from the input
–> 381 result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] 382 return result[:topn] 383

~/.pyenv/versions/3.5.0/lib/python3.5/site-packages/gensim/models/keyedvectors.py in (.0)
379 best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True)
380 # ignore (don’t return) words from the input
–> 381 result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] 382 return result[:topn] 383

IndexError: list index out of range

上記のようにエラーが出る。
これはwikipediaコーパス内に、「ベンガルヤマネコ」が出現する回数が少なかったため、
語彙として登録されなかったからである。

vocabularyの追加および、再学習


語彙の追加はgensim 0.13.3より可能となっている。

今回、自作したベンガルヤマネココーパスは、下記リンクにて公開する。
https://drive.google.com/file/d/1uhYS_sMWOXlTizpBargsIO30yQqyW-WE/view?usp=sharing

1
2
3
4
#build the vocabulary
model_gensim.build_vocab("bengal_wakati.txt", update=True)
#train the model
model_gensim.train("bengal_wakati.txt", total_examples=model_gensim.corpus_count, epochs=model_gensim.iter)

その後もう一度類義語の獲得を行うと、

1
model_gensim.most_similar("ベンガルヤマネコ")
[(‘カナダオオヤマネコ’, 0.8028029799461365),
(‘イベリアカタシロワシ’, 0.7805435061454773),
(‘ヤマネコ’, 0.7799322009086609),
(‘チュウゴクオオカミ’, 0.7795432806015015),
(‘アッサムセタカガメ’, 0.7792356014251709),
(‘マハゼ’, 0.7750200033187866),
(‘イラワジイルカ’, 0.7692221403121948),
(‘ハリモモチュウシャク’, 0.7689074873924255),
(‘サランガニ’, 0.7666099071502686),
(‘ティラピア’, 0.7635414600372314)]

無事、vocabularyが更新され、学習されていることが確認できた。

参考文献


fastText:https://github.com/facebookresearch/fastText
gensim:https://radimrehurek.com/gensim/models/fasttext
Github/RaRe-Technologies/gensim:https://github.com/RaRe-Technologies/gensim/t
Medium/Word2Vec and FastText Word Embedding with Gensim:https://towardsdatascience.com/word-embedding-with-word2vec-and-fasttext-a209c1d3e12c

プロフィール

sobacurry
sobacurry:
本サイト内に登場する猫たちの飼い主。
蕎麦とカレー好き。

Contents