MeCabのPythonバインディングでユーザー辞書を使用する
FreeBSD 10にMeCab + Pythonな環境を構築しました。FreeBSD 10 に MeCab + Pythonバインディングをインストールする
MeCab、ユーザー辞書が使えるようなので、試してみます。
こちの記事が非常に参考になりました。
mecabの辞書に新しい単語を登録する方法
特別なmiku
「miku」という単語に特別な意味を持たせてみます。
まず、通常の状態での解析結果を見てみます。
# echo 'miku' | mecab
miku 名詞,固有名詞,組織,*,*,*,*
EOS
ユーザー辞書の作成
ユーザー辞書の元ネタはCSV形式で作成します。
参考サイトの記載そのままですが、各フィールドの意味は以下のとおり。
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
コストに指定する数値が低いほど優先順位が上がるようなので、これに1を指定します。
品詞は独自のものは指定できず、既存の「名詞」や「動詞」などしか指定できません。
該当しないキーワードを指定すると、辞書作成時にこんなエラーが発生します。
# /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic \
-u mykeywords.dic -f utf-8 -t utf-8 mykeywords.csv
reading mykeywords.csv ... context_id.cpp(96) [it != left_.end()] cannot find LEFT-ID for 名詞,特別,*,*,*,*,*
原型や読み、発音は任意のものが指定できますので、
発音に「特別な存在」と指定してみました。
作成したkeywords.csvは以下のとおり。
miku,,,1,名詞,一般,*,*,*,*,MIKU,ミク,特別な存在
これをutf-8で保存しておきます。
辞書の作成はmecab-dict-indexコマンドを使用します。
# /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u mykeywords.dic \
-f utf-8 -t utf-8 mykeywords.csv
これでmykeywords.dicというユーザー辞書が作成できました。
ユーザー辞書の使用
従来通りの解析。
# echo 'miku' | mecab
miku 名詞,固有名詞,組織,*,*,*,*
EOS
-u [作成したユーザー辞書]というオプション付きで解析実行。
# echo 'miku' | mecab -u mykeywords.dic
miku 名詞,一般,*,*,*,*,MIKU,ミク,特別な存在
EOS
ちゃんと作成した辞書の内容が反映されていますね。
Pythonバインディングからの使用
簡単な解析プログラムを書いてみました。
- # -*- coding:utf-8 -*-
- import MeCab
- import sys, codecs, re, math
- sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
- m = MeCab.Tagger('-Owakati')
- text = u'miku'
- encoded_text = text.encode('utf-8')
- node = m.parseToNode(encoded_text)
- while True:
- node = node.next
- if not node:
- break
- surface = node.surface.decode('utf-8')
- feature = node.feature.decode('utf-8')
- print surface,feature
実行すると、もちろんユーザー辞書の情報は反映されていません。
# python sample.py
miku 名詞,固有名詞,組織,*,*,*,*
BOS/EOS,*,*,*,*,*,*,*,*
MeCab.Taggerの引数に、コマンドラインで試したのと同様
-u [ユーザー辞書]を追加します。
- # -*- coding:utf-8 -*-
- import MeCab
- import sys, codecs, re, math
- sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
- m = MeCab.Tagger('-Owakati -u mykeywords.dic')
- text = u'miku'
- encoded_text = text.encode('utf-8')
- node = m.parseToNode(encoded_text)
- while True:
- node = node.next
- if not node:
- break
- surface = node.surface.decode('utf-8')
- feature = node.feature.decode('utf-8')
- print surface,feature
狙い通り、作成したユーザー辞書の結果が優先されて表示されました。
# python sample.py
miku 名詞,一般,*,*,*,*,MIKU,ミク,特別な存在
BOS/EOS,*,*,*,*,*,*,*,*
もちろん、他のキーワードは通常の辞書を使用して処理されます。
# python sample.py
miku 名詞,一般,*,*,*,*,MIKU,ミク,特別な存在
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
最高 名詞,一般,*,*,*,*,最高,サイコウ,サイコー
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ
! 記号,一般,*,*,*,*,!,!,!
BOS/EOS,*,*,*,*,*,*,*,*
- 関連記事
コメント