/var/log/messages

Oct 31, 2018 - 3 minute read - Comments - MachineLearning

japanese-word2vec-model-builder 実装確認メモ

以下にて公開されている

Japanese Word2Vec Model Builder の実装について確認を行ないましたので、以下にメモを羅列します。

導入及び実行の方法などについては上記リポジトリの README.md を確認すれば十分と思われます。

ソースファイル

下記四点となっています。以降にて順に列挙します。

  • main.py
  • word2vec.py
  • tokenizer.py
  • wikipedia.py

main.py

  • コマンドラインからの実行時のエントリポイントは main 手続き
  • --download-neologd オプション指定時には tokenizer.pydownload_neologd 手続きが呼び出されます
  • --download-wikipedia-dump オプション指定時には wikipedia.pydownload_dump 手続きが呼び出されます
  • --build-gensim-model オプション指定時に行なわれる処理として以下の記述があります
        with tempfile.TemporaryDirectory() as temp_dir:
            iter_docs = partial(wikipedia.iter_docs,
                                wikipedia_dump_path, temp_dir)
            iter_tokens = get_tokens_iterator(tokenizer.get_tagger(dic_path),
                                              iter_docs)
            word2vec.build_gensim_w2v_model(output_model_path, iter_tokens,
                                            size, window, min_count)

以下に、指定可能なオプションとそれぞれのオプションにおける処理について補足します。

  • --build-gensim-model
    • boolean (指定時に True となります)
    • 既定値は False
  • -o または --output-model-path
    • 既定値は ‘output/word2vec.gensim.model’
  • --size
    • 整数型
    • 既定値は 100
  • --window
    • 整数型
    • 既定値は 8
  • --min-count
    • 整数型
    • 既定値は 10
  • --download-wikipedia-dump
    • boolean (指定時に True となります)
    • 既定値は False
  • --wikipedia-dump-path
    • 既定値は ‘output/jawiki-latest-pages-articles.xml.bz2’
  • --wikipedia-dump-url
  • --download-neologd
    • boolean (指定時に True となります)
    • 既定値は False
  • `–dictionary-path
    • 既定値は ‘output/dic’

download_neologd

  • tokenizer.pydownload_neologd に dictionary_path オプションの値を渡して呼び出します

download_wikipedia_dump

  • wikipedia.pydownload_dump に wikipedia_dump_path および wikipedia_dump_url オプションの値を渡して呼び出します

build_gensim_model

  • wikipedia.pyiter_docs 手続きに wikipedia_dump_path オプションの値とテンポラリディレクトリの情報が渡されている手続きオブジェクトを iter_docs に設定します
  • get_tokens_iterator 手続きを呼び出します、詳細については下記に記載します
  • get_tokens_iterator 手続きの戻りが設定された iter_tokens および size、window、min_count、output_model_path オプションを渡して word2vec.pybuild_gensim_w2v_model 手続きを呼び出します

get_tokens_iterator 手続き

  • 引数として以下を渡して呼び出されます

    • tokenizer.pyget_tagger に dictionary_path オプションを渡して呼び出した戻り (mecab オブジェクト)
    • iter_docs
  • まず、tokenizer.pytokenize 手続きに引数 tagger (上記の get_tagger の戻り) が渡されている手続きオブジェクトを tokenize に設定します

  • iter_docs の戻りを要素単位で取り出して tokenize に渡して戻りを yield します

    • これは Word2Vec オブジェクトの trainbuild_vocab などに渡される形となっており、繰り返しの中で以下が呼び出されて要素を戻す形となっています
    • 下記の手続きオブジェクトが渡されて tokenize の戻りが順に取り出される形となります
    def iter_tokens():
        for doc in iter_docs():
            yield tokenize(doc)

word2vec.py

  • Word2Vec オブジェクトを生成して訓練を行ないます
  • build_gensim_w2v_model のみが定義されています
  • 定義は以下
def build_gensim_w2v_model(model_path, iter_tokens, size, window, min_count):
    """
    Parameters
    ----------
    model_path : string
        Path of Word2Vec model
    iter_tokens : iterator
        Iterator of documents, which are lists of words
    """
    model = Word2Vec(
        size=size,
        window=window,
        min_count=min_count,
        workers=multiprocessing.cpu_count()
    )
    model.build_vocab(iter_tokens())
    model.train(iter_tokens())
    model.init_sims(replace=True)
    model.save(model_path)
  • build_vocab
    • Build vocabulary from a sequence of sentences (can be a once-only generator stream).
    • 一連の文から語彙を構築する(一度だけのジェネレータストリームにすることができます)。
  • train
    • Update the model’s neural weights from a sequence of sentences.
    • 一連の文からモデルの神経の重みを更新します。
  • init_sims

tokenizer.py

  • 定義されているのは以下三点の手続き
    • download_neologd
    • get_tagger
    • tokenize

download_neologd

  • 基本的には mecab-ipadic-neologd リポジトリを clone して導入を行なう手続きです
  • mecab-ipadic-neologd について
    • 頻繁に更新される MeCab 要のシステム辞書
    • 最新の単語に対応した形態素解析ができる

get_tagger

  • Mecab.Tagger('-d {}'.format(dic_path)) の戻りを返却します
    • 辞書を指定して mecab オブジェクトを戻すものです
    • これは main 手続きにて get_tokens_iterator に渡されています

tokenize

  • mecab オブジェクトで parse して解析された語を配列に追加してそれを戻しています
  • 定義が以下
def tokenize(text, tagger):
    tokens = []
    for line in tagger.parse(text).split('\n'):
        if line == 'EOS':
            break
        surface = line.split('\t')[0]
        tokens.append(surface)
    return tokens

wikipedia.py

  • 定義されているのは以下二点の手続き
    • download_dump
    • iter_docs

download_dump

iter_docs

  • 引数で指定された wikipedia dump file の前処理を行ない、r'^<doc(\s.*)?>$' にマッチする箇所から r'^</doc>$' にマッチする箇所までを一区切りのデータとして配列に追加して配列を戻す

おわりに

以下の箇所は修正を行なう必要があるかもしれません。

  • tokenizer.py の tokenize
    • 品詞でしばる場合
  • word2vec.py の build_gensim_w2v_model
    • init_sims が deprecated

word2vec の学習済みモデル 詰碁

comments powered by Disqus