Symfoware

Symfowareについての考察blog

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バインディングからの使用



簡単な解析プログラムを書いてみました。


  1. # -*- coding:utf-8 -*-
  2. import MeCab
  3. import sys, codecs, re, math
  4. sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
  5. m = MeCab.Tagger('-Owakati')
  6. text = u'miku'
  7. encoded_text = text.encode('utf-8')
  8. node = m.parseToNode(encoded_text)
  9. while True:
  10.     
  11.     node = node.next
  12.     if not node:
  13.         break
  14.     
  15.     surface = node.surface.decode('utf-8')
  16.     feature = node.feature.decode('utf-8')
  17.     
  18.     print surface,feature




実行すると、もちろんユーザー辞書の情報は反映されていません。


# python sample.py
miku 名詞,固有名詞,組織,*,*,*,*
BOS/EOS,*,*,*,*,*,*,*,*





MeCab.Taggerの引数に、コマンドラインで試したのと同様
-u [ユーザー辞書]を追加します。


  1. # -*- coding:utf-8 -*-
  2. import MeCab
  3. import sys, codecs, re, math
  4. sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
  5. m = MeCab.Tagger('-Owakati -u mykeywords.dic')
  6. text = u'miku'
  7. encoded_text = text.encode('utf-8')
  8. node = m.parseToNode(encoded_text)
  9. while True:
  10.     
  11.     node = node.next
  12.     if not node:
  13.         break
  14.     
  15.     surface = node.surface.decode('utf-8')
  16.     feature = node.feature.decode('utf-8')
  17.     
  18.     print surface,feature




狙い通り、作成したユーザー辞書の結果が優先されて表示されました。


# python sample.py
miku 名詞,一般,*,*,*,*,MIKU,ミク,特別な存在
BOS/EOS,*,*,*,*,*,*,*,*




もちろん、他のキーワードは通常の辞書を使用して処理されます。


# python sample.py
miku 名詞,一般,*,*,*,*,MIKU,ミク,特別な存在
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
最高 名詞,一般,*,*,*,*,最高,サイコウ,サイコー
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ
! 記号,一般,*,*,*,*,!,!,!
BOS/EOS,*,*,*,*,*,*,*,*

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/11/03(月) 17:55:39|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<FreeBSD 10 + Python + pillowで透過pngの合成 | ホーム | Mecab PythonでTF・IDFによるBlogの重要単語抽出>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1530-78dba7ac
この記事にトラックバックする(FC2ブログユーザー)