今回は、比較的新しい言葉や、有名人の名前に対応した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')
コメント