PythonでJanomeを使って形態素解析
PythonでJanome(蛇の目)を使って形態素解析するメモ.
公式サイトはこちら http://mocobeta.github.io/janome/
Welcome to janome’s documentation! (Japanese) — Janome v0.3 documentation (ja)
環境
Janomeとは
Janome (蛇の目) は,Pure Python で書かれた,辞書内包の形態素解析器です。
依存ライブラリなしで簡単にインストールでき,アプリケーションに組み込みやすいシンプルな API を備える形態素解析ライブラリを目指しています。
内包辞書として mecab-ipadic-2.7.0-20070801 を使っています。
Welcome to janome’s documentation! (Japanese) — Janome v0.3 documentation (ja)
導入については,Pythonで使う場合,JanomeはPythonで書かれているので,MeCabと比較して簡単.
Janomeのインストール
pip 一発でインストールできる.
pip install Janome
サンプルコード
形態素解析
Tokenizer
にテキストを渡す.
from janome.tokenizer import Tokenizer t = Tokenizer() text='すもももももももものうち' for token in t.tokenize(text): print(token)
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ も 助詞,係助詞,*,*,*,*,も,モ,モ もも 名詞,一般,*,*,*,*,もも,モモ,モモ も 助詞,係助詞,*,*,*,*,も,モ,モ もも 名詞,一般,*,*,*,*,もも,モモ,モモ の 助詞,連体化,*,*,*,*,の,ノ,ノ うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
分かち書き
from janome.tokenizer import Tokenizer t = Tokenizer() tokens = t.tokenize(u'分かち書きモードがつきました!', wakati=True) tokens
['分かち書き', 'モード', 'が', 'つき', 'まし', 'た', '!']
品詞でフィルタ
- 除外したい場合は,
POSStopFilter(['接続詞', '記号', '助詞', '助動詞'])
- 取得したい場合は,
POSKeepFilter('名詞')
をTokenFilter
に指定する.
from janome.tokenizer import Tokenizer from janome.analyzer import Analyzer from janome.tokenfilter import POSKeepFilter text = 'すもももももももものうち' tokenizer = Tokenizer() token_filters = [POSKeepFilter(['名詞'])] analyzer = Analyzer([], tokenizer, token_filters) for token in analyzer.analyze(text): print(token)
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ もも 名詞,一般,*,*,*,*,もも,モモ,モモ もも 名詞,一般,*,*,*,*,もも,モモ,モモ うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
品詞フィルタして分かち書き
Analyzer
では分かち書きオプションは使えない.
なので,PosFilter
後にtokenの配列を返す処理を書く.
from janome.tokenizer import Tokenizer from janome.analyzer import Analyzer from janome.charfilter import UnicodeNormalizeCharFilter, RegexReplaceCharFilter from janome.tokenfilter import POSStopFilter def wakati_filter(text: str, char_reg_filter=[("[,\.\(\)\{\}\[\]]"," ")], ignore_filter=['接続詞', '接頭辞', '接尾辞', '記号', '助詞', '助動詞']): char_filters = [UnicodeNormalizeCharFilter()] for reg in char_reg_filter: char_filters.append(RegexReplaceCharFilter(*reg)) tokenizer = Tokenizer() token_filters = [POSStopFilter(ignore_filter)] analyzer = Analyzer(char_filters, tokenizer, token_filters) return [token.surface for token in analyzer.analyze(text)] text='すもももももももものうち' wakati_filter(text)
['すもも', 'もも', 'もも', 'うち']
所感
前処理が必要
UnicodeNormalizeCharFilter()
をかけると,記号の品詞が変わってしまう.
例えば,(),.
が名詞扱いになる.
よって,RegexReplaceCharFilter
(正規表現で置換)などで前処理をしておいたほうがいい.