形態素解析といえば MeCab が定番ですが、python から使うには関連パッケージのインストールが結構大変だったりします。
そこで、Janome を使ってみました。
Janome について詳しくは こちら
内部では MeCab の辞書を使うらしいので MeCab のインストールが前提ですが、Janome の解析結果は基本的に MeCab と同等で、インストールはいたって簡単です。
(辞書は janome に同梱されているので MeCab は不要。作者ご本人様から情報提供していただきました)
インストール
1 行
で入ります。
使ってみる
日本語を解析
日本語を解析して結果を表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from janome.tokenizer import Tokenizer t = Tokenizer() tokens = t.tokenize(u'pythonの本を読んだ') for token in tokens: print token #----------------------------------------- # python 名詞,固有名詞,組織,*,*,*,*,*,* # の 助詞,連体化,*,*,*,*,の,ノ,ノ # 本 名詞,一般,*,*,*,*,本,ホン,ホン # を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ # 読ん 動詞,自立,*,*,五段・マ行,連用タ接続,読む,ヨン,ヨン # だ 助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ #----------------------------------------- |
情報を取り出し
表層形、品詞、活用形 等の情報を個々に取り出してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
from janome.tokenizer import Tokenizer t = Tokenizer() tokens = t.tokenize(u'pythonの本を読んだ') for token in tokens: print token.surface, '\t', # 表層形 print token.part_of_speech.split(',')[0], # 品詞 print token.part_of_speech.split(',')[1], # 品詞細分類1 print token.part_of_speech.split(',')[2], # 品詞細分類2 print token.part_of_speech.split(',')[3], # 品詞細分類3 print token.infl_type, # 活用型 print token.infl_form, # 活用形 print token.base_form, # 原形 print token.reading, # 読み print token.phonetic, # 発音 print token.node_type, # node_type print #----------------------------------------- # python 名詞 固有名詞 組織 * * * * * * UNKNOWN # の 助詞 連体化 * * * * の ノ ノ SYS_DICT # 本 名詞 一般 * * * * 本 ホン ホン SYS_DICT # を 助詞 格助詞 一般 * * * を ヲ ヲ SYS_DICT # 読ん 動詞 自立 * * 五段・マ行 連用タ接続 読む ヨン ヨン SYS_DICT # だ 助動詞 * * * 特殊・タ 基本形 だ ダ ダ SYS_DICT #----------------------------------------- |
– 注意 –
上の並びは 0.2.8 以降のものです。
0.2.7 までは infl_type と infl_form が逆になっています。
品詞を判定
特定の品詞(たとえば 名詞)を取り出してみます。上のソースにあるとおり、token.part_of_speech.split(‘,’)[0] に品詞が入っているので == u’名詞’ で判定します。
バージョン 0.2.7 以降
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from janome.tokenizer import Tokenizer t = Tokenizer() tokens = t.tokenize(u'pythonの本を読んだ') for token in tokens: # 品詞を取り出し partOfSpeech = token.part_of_speech.split(',')[0] if partOfSpeech == u'名詞': print token.surface #--------- # python # 本 #--------- |
バージョン 0.2.6 まで
バージョンが 0.2.6(およびそれ以前)は文字コードに注意が必要です。
python 2系の場合、janome から返ってくる各情報の文字コードは str型と unicode型が混在します。
(0.2.7 で改善。作者ご本人様から情報提供していただきました)
この問題を回避するため、判定前に文字コードを確認、統一します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from janome.tokenizer import Tokenizer t = Tokenizer() tokens = t.tokenize(u'pythonの本を読んだ') for token in tokens: # 品詞を取り出し partOfSpeech = token.part_of_speech.split(',')[0] # unicode型 は str型 へ if isinstance(partOfSpeech, unicode): partOfSpeech = partOfSpeech.encode('utf-8') if partOfSpeech == '名詞': print token.surface #--------- # python # 本 #--------- |
確認しないと UnicodeDecodeError ないし UnicodeWarning になります。
ユーザー定義辞書
単語を独自に追加する場合はユーザー定義辞書を作成して引数に指定します。
辞書の形式は複数あるようですが(くわしくは 本家サイト で)MeCab 辞書フォーマットの CSV ファイルが使えるようです。
userdict.csv
1 |
焼きおにぎり,1285,1285,7265,名詞,一般,*,*,*,*,焼きおにぎり,ヤキオニギリ,ヤキオニギリ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from janome.tokenizer import Tokenizer # ユーザー定義辞書 なし t = Tokenizer() tokens = t.tokenize(u'焼きおにぎり') for token in tokens: print token #--------------------------------------------------- # 焼き 名詞,一般,*,*,*,*,焼き,ヤキ,ヤキ # おにぎり 名詞,一般,*,*,*,*,おにぎり,オニギリ,オニギリ #--------------------------------------------------- # ユーザー定義辞書 あり t = Tokenizer('userdict.csv', udic_enc='utf8') tokens = t.tokenize(u'焼きおにぎり') for token in tokens: print token #--------------------------------------------------- # 焼きおにぎり 名詞,一般,*,*,*,*,焼きおにぎり,ヤキオニギリ,ヤキオニギリ #--------------------------------------------------- |
moco_beta says:
通りすがりの janome 作者です。紹介ありがとうございます。2点、訂正させてください。
> 内部では MeCab の辞書を使うらしいので MeCab のインストールが前提ですが、
辞書はjanomeに同梱しているのでMeCabは不要です。
> python 2系の場合、janome から返ってくる各情報の文字コードは str型と unicode型が混在するようです。
バージョン 0.2.6 まで、strとunicodeが混在する不具合がありました。
0.2.7 で unicode に統一されたので、アップデートしてみてください。
http://mocobeta-backup.tumblr.com/post/140503222592/janome-027
管理人 says:
なんと、作者ご本人に見て頂けるとは。
嬉しい驚きです。
> 辞書はjanomeに同梱しているのでMeCabは不要です。
かん違いしていました。
MeCab の辞書を更新しても反映されないので不思議だったのですが
疑問が解消しました。
> 0.2.7 で unicode に統一されたので、アップデートしてみてください。
最新の 0.2.8 で確認しました。問題なく動きました。
ありがとうございました。
Lien says:
形態素解析の結果をtxtファイルに書き込んで、保存したい場合はどうすればよいですか?教えていただけませんか?
管理人 says:
Lienさん、こんにちわ
print の箇所をファイル出力に置き換えてください。
python でファイル出力する方法は、詳しいサイトがたくさんあるので、そちらで確認してください。
時系列全てが動くコードに感謝 says:
from janome.tokenizer import Tokenizer
import codecs
t = Tokenizer()
tokens = t.tokenize(u'pythonの本を読んだ')
f = codecs.open('after_janome.txt','w','utf-8')
for token in tokens:
f.write (token.surface) # 表層形
f.write (token.part_of_speech.split(',')[0]) # 品詞
f.write (token.part_of_speech.split(',')[1]) # 品詞細分類1
f.write (token.part_of_speech.split(',')[2]) # 品詞細分類2
f.write (token.part_of_speech.split(',')[3]) # 品詞細分類3
f.write (token.infl_type) # 活用型
f.write (token.infl_form) # 活用形
f.write (token.base_form) # 原形
f.write (token.reading) # 読み
f.write (token.phonetic) # 発音
f.write (token.node_type) # node_type
f.close()
#Google Colaboratory ランタイムPython3 で動作確認済み
#管理人さんのコードの置き換えです。
To_ru says:
pypi から janome をダウンロードしました。
pip コマンドでコマンドプロントにインストールしようとしているのですができません。
コマンドプロントではできないのでしょうか。
匿名 says:
pip install https://pypi.python.org/packages/b4/7b/6f4fa5243a235cd682693b448f05afacedb2b10fc2efea3369d6336ab83b/Janome-0.3.6.tar.gz#md5=8f9955be6b1d70333dbc46b90db9c346