続・Python上からMeCabを使う

過去の日記Python上でMeCabを使うことを書いた。今回は、出力フォーマットを変更して、python上からMeCabを扱う方法を書く。「名詞だけ抽出したい」っていった時に便利だと思う。

出力フォーマットの変更

解析結果の出力フォーマットは「/usr/local/lib/mecab/dic/ipadic/dicrc」に記述されている。1つの出力フォーマットを規定するために、次の4つの場合の出力形式を指定しなければならない。

  • node: 1つの形態素を出力, デフォルトは空文字
  • unk: 1つの未知語形態素を出力, デフォルトは node と同一フォーマット
  • bos: 形態素解析の結果に先だって出力 (header 的役割), デフォルトは空文字
  • eos: 形態素解析の結果の後に出力 (footer 的役割), デフォルトは "EOS\n"

unk を指定しないと、辞書に無い単語を読んだときにmecabが処理してくれなくなるので、nodeだけではなくて、unkも指定する必要がある。

出力フォーマットChaSenは、こうなっているみたい。

node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen  = EOS\n

実験

temp.txtから、一般名詞と固有名詞だけをコマンドラインに表示するプログラムを書いた。

temo.txtの中身

MeCabオープンソース形態素解析エンジンで、奈良先端科学技術大学院大学出身、現Googleソフトウェアエンジニアの工藤拓によって開発されている。名称は開発者の好物「和布蕪(めかぶ)」から取られた。

コード

「/usr/local/lib/mecab/dic/ipadic/dicrc」に次の2行を追加した。%hは形態素に対応した番号。

node-format-dev = %h,%m,
unk-format-dev = %h,%m,
import MeCab

f = open('temp.txt','r')
string = f.read()
lst = Mecab.Tagger("-Odev").parse(string).split(",")
lim = len(lst)				

i = 0
while i < lim:
	try:			
		num = int(lst[i]) 
		i += 1				
		if 38 == num or 40 < num and 47 > num:
			insertDic(lst[i])
			i += 1
		
	except ValueError:
		i += 1
出力結果
MeCab
ソース
形態素
エンジン
奈良先端科学技術大学院大学
出身
Google
ソフトウェア
エンジニア
工藤
拓
名称
好物
和布
蕪
め

最後の'め'っていう言葉が良く分からないけど、概ね良好。形態素に対応した番号は、「/usr/local/lib/mecab/dic/ipadic/pos-id.def」を変更することで指定できるので、必要な形態素は1、必要じゃない形態素は0ってやるともっと楽になると思う。ただし、「/usr/local/lib/mecab/dic/ipadic/pos-id.def」の変更を反映させるには、辞書の際コンパイルが必要なので、手間がかかる。