PythonプログラムからMecabを使用して、形態素解析を行う。
Mecabの使い方は基本本家サイトを参照。
PythonとMecabのバインディングや各種辞書の追加は以前の記事を参照。
Ubuntu14.04にpyenv,Anaconda,MeCabをインストールしPython3環境構築
Ubuntu14.04(15.04)にmecab-ipadic-neologdをインストールできなかった※追記あり
Ubuntu14.04でmecabの辞書にWikipediaとはてな単語を追加
1. 通常のmecabを使う場合
とりあえず本家サイト読んで使い方学ぶ。
MeCab::Tagger というクラスのインスタンスを生成し, parse (もしくは parseToString) というメソッドを呼ぶことで, 解析結果が文字列として取得できます. MeCab::Tagger のコンストラクタの引数は, 基本的に mecab の実行形式に与え るパラメータと同一で, それらを文字列として与えます.
parseメソッドを使ってみる。
parseメソッドとparseToStringメソッドは同じものらしい。
vim test.py
import MeCab m = MeCab.Tagger ("-Ochasen") print (m.parse ("今日もしないとね"))
-Ochasenを引数で渡すことで、出力するフォーマットをchasenという形態素解析ツールと互換性を持たせる。
他にもフォーマットは色々あるので、上記サイトみて勉強する。
実行。
python test.py
今日 キョウ 今日 名詞-副詞可能 も モ も 助詞-係助詞 し シ する 動詞-自立 サ変・スル 未然形 ない ナイ ない 助動詞 特殊・ナイ 基本形 と ト と 助詞-接続助詞 ね ネ ね 助詞-終助詞
続いてparseToNodeを使ってみる。
parseToNode の返り値は, 「文頭」という特別な形態素を示す MeCab::Node インタンスです.
parseToNodeは文字列を解析し、文頭(MeCab::Nodeインスタンス)を返し、nextで順に巡ることで全形態素にアクセスできる。
neologdのサンプルコードを参考に実行する(そのままでは動かなかった・・・)。
#!/usr/bin/env python # coding: utf-8 import MeCab input = '10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。' mt = MeCab.Tagger("-Ochasen") mt.parse('') node = mt.parseToNode(input) while node: print (node.surface, node.feature) node = node.next
2. mecab-ipadic-neologdを使う場合
mecab-ipadic-neologdとは以下。つまり高性能な辞書。
インストール方法はこちらを参照。
mecab-ipadic-neologd は、多数のWeb上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム辞書です。
mecabの辞書にはシステム辞書とユーザー辞書がある。
そのシステム辞書の方。
MeCab::Taggerの引数にmecab-ipadic-neologdを指定する。
システム辞書なので「-d」をつける。
#!/usr/bin/env python # coding: utf-8 import MeCab input = '10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。' mt = MeCab.Tagger("-Ochasen -d /usr/lib/mecab/dic/mecab-ipadic-neologd") mt.parse('') node = mt.parseToNode(input) while node: print (node.surface, node.feature) node = node.next
3. Wikipediaとはてなキーワードの辞書を使う場合
ユーザ辞書の方。
インストール方法はこちらを参照。
ユーザ辞書なので「-u」を引数につける。
#!/usr/bin/env python # coding: utf-8 import MeCab userdic_path="./custom.dic" input = '10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中> 居正広が、篠原信一の過去の勘違いを明かす一幕があった。' mt = MeCab.Tagger("-Ochasen -u "+userdic_path) mt.parse('') node = mt.parseToNode(input) while node: print (node.surface, node.feature) node = node.next
4. MecabのparseToNodeを使うとエラーになる
以下のコードでparseToNodeを使うとエラーになってしまう。
解決策はparseToNodeを使う前に、mt.parse(”)とすること。
こちらの記事に大変助けられました。
ありがとうございます!
#!/usr/bin/env python # coding: utf-8 import MeCab input = '10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。' mt = MeCab.Tagger("-Ochasen") node = mt.parseToNode(input) while node: print (node.surface, node.feature) node = node.next
上を実行すると以下のようになる。
気をつけろ。
BOS/EOS,*,*,*,*,*,*,*,* Traceback (most recent call last): File "mecab.py", line 9, in <module> print (node.surface, node.feature) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
参考
mecab – 形態素解析のために Wikipedia とはてなキーワードからユーザー辞書を生成し利用する – Qiita
コメント
[…] 詳しくはこちらを参考にすると良い。 ■ PythonとMeCabで形態素解析(neologdやユーザ辞書の使い方) […]
[…] PythonとMeCabで形態素解析(neologdやユーザ辞書の使い方) […]