PythonとMeCabで形態素解析(neologdやユーザ辞書の使い方)

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

Ubuntu14.04とPython3でMeCabを使う方法

コメント

  1. […] 詳しくはこちらを参考にすると良い。 ■ PythonとMeCabで形態素解析(neologdやユーザ辞書の使い方) […]

  2. […] PythonとMeCabで形態素解析(neologdやユーザ辞書の使い方) […]

タイトルとURLをコピーしました