続・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