はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

PythonでJanomeを使って形態素解析

PythonJanomeを使って形態素解析

PythonJanome(蛇の目)を使って形態素解析するメモ.

公式サイトはこちら 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で使う場合,JanomePythonで書かれているので,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正規表現で置換)などで前処理をしておいたほうがいい.