新語や人名に対応したWord2Vecモデルを作成する

AI

今回は、比較的新しい言葉や、有名人の名前に対応したWord2Vecモデルを作成する方法について説明します。

先日投稿した記事、「pythonでword2vecを使ってテキスト処理をしてみよう」で、Word2Vecモデルの作成方法について書きました。しかし、色々と試していると、かなり頻繁に「KeyError: “○○○’ not in vocabulary”」というエラーが出ることに気がつきました。そんな語彙ないよ!って言われちゃっています。
例えば、Word2Vecの紹介でよく使われる「松本人志」から「ボケ」を引いて、「ツッコミ」を足すと、「浜田雅功」が検出されるというのを試してみると、「KeyError: “松本人志’ not in vocabulary”」とエラーがでます。はたまた、「棒ノ折山」という山があるのですが、これを入力しても同様にエラーがでます。

これは、モデルを作成した際に使用したコーパス、つまりWikipediaのテキストをMeCabで分かち書きした際の形態素解析に問題があったことが原因です。MeCab の分かち書きは、読み込んでいる辞書に、基づいて処理されるのですが、前述した「松本人志」や「棒ノ折山」は辞書に登録されていないため、下記のように分かち書きされてしまうようです。

  • 松本人志は、「松本」と「人志」
  • 棒ノ折山は「棒」、「の」と「折山」

この問題は、MeCabで利用する辞書を入れ替えることで解決します。

mecab-ipadic-NEologd をインストールする

mecab-ipadic-NEologd とは、Webの情報から得た新語を追加してカスタマイズされたMeCab用の辞書です。詳細はgithub上のREADMEに記載されています。推奨空きメモリ等も書いてあるため、一度確認しておくことをお勧めします。

1. リポジトリをクローンする

インストールするにはまず、githubのリポジトリをクローンします。下記のコマンドを実行してください。

$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

2.mecab-ipadic-NEologd をインストールする

続いて、mecab-ipadic-NEologd のインストールを行います。まずは下記のコマンドを実行して、クローンしたリポジトリに移動してください。

$ cd mecab-ipadic-neologd

続いて、下記のコマンドを実行してください。途中でyes/noを聞かれるので、yesを入力してください。

$ ./bin/install-mecab-ipadic-neologd -n -a

上記では、-aオプションを指定しています。標準インストールでは一部の辞書がインストールされないらしいのですが、-aオプションを指定することで、コマンド一発で全部入りの辞書がインストールされるとのことです。

3.形態素解析を試してみる

下記のコマンドを実行して、辞書が反映されたかを確認しましょう。-dオプションで、今回インストールした辞書を指定してください。

$ echo "松本人志が棒ノ折山に登ったそうです。"  | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/

上記を実行すると、下記のような結果が得られるはずです。

松本人志	名詞,固有名詞,人名,一般,*,*,松本人志,マツモトヒトシ,マツモトヒトシ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
棒ノ折山	名詞,固有名詞,一般,*,*,*,棒ノ折山,ボイノオレヤマ,ボイノオレヤマ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
登っ	動詞,自立,*,*,五段・ラ行,連用タ接続,登る,ノボッ,ノボッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
そう	名詞,特殊,助動詞語幹,*,*,*,そう,ソウ,ソー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。

ちなみに、mecab-ipadic-neologdを指定しないで実行してみると、下記のような結果になるかと思います。

松本	名詞,固有名詞,人名,姓,*,*,松本,マツモト,マツモト
人志	名詞,固有名詞,人名,名,*,*,人志,ヒトシ,ヒトシ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
棒	名詞,一般,*,*,*,*,棒,ボウ,ボー
ノ	記号,一般,*,*,*,*,ノ,ノ,ノ
折山	名詞,一般,*,*,*,*,折山,オリヤマ,オリヤマ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
登っ	動詞,自立,*,*,五段・ラ行,連用タ接続,登る,ノボッ,ノボッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
そう	名詞,特殊,助動詞語幹,*,*,*,そう,ソウ,ソー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。

違いが一目瞭然ですね。

新語に対応したWord2Vecモデルを作成する

では、インストールしたmecab-ipadic-NEologd を利用して、新後に対応したWord2Vecモデルを作成していきましょう。前提として、こちらの記事の手順を実施しており、wikipedia.txtが存在しているものとします。

コーパスを分かち書きする

今回、インストールしたmecab-ipadic-NEologd を指定して、分かち書きを行います。

$ mecab -Owakati wikipedia.txt -o wikipedia_owakati.txt -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
nkf -w --overwrite wikipedia_owakati.txt

これで、新しい辞書を元に分かち書きされたコーパスが作成されました。これ以降の手順は、以前の記事で作成したcreate_model.pyを実行すれば、Word2Vecモデルが作成されます。念のため、create_model.pyを再度記載しておきます。

from gensim.models import word2vec as w2v
import logging

# 進捗状況を出力する
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

# コーパスからモデルを生成する
corpus = w2v.Text8Corpus('./wikiextractor/wikipedia_owakati.txt')
model = w2v.Word2Vec(corpus, size=100, min_count=5, window=5, iter=100)

# モデルを保存する
model.save('wiki.model')

コメント

タイトルとURLをコピーしました