note.nkmk.me

Python, Janomeで日本語の形態素解析、分かち書き(単語分割)

Date: 2018-06-30 / tags: Python, 文字列処理

JanomeはPythonの形態素解析エンジン。日本語のテキストを形態素ごとに分割して品詞を判定したり分かち書き(単語に分割)したりすることができる。MeCabなどの外部エンジンは必要なくpipでインストール可能。

ここでは以下の内容について説明する。サンプルコードで使っているJanomeのバージョンは0.3.6

  • Janomeのインストール
  • JanomeとMeCab
    • 解析結果の精度
    • 形態素解析の速度
    • 使いどころ
  • Janomeで形態素解析
    • 基本的な使い方
    • Tokenオブジェクトの属性
  • Janomeで分かち書き(単語ごとに分割)
    • 引数wakati
    • リスト内包表記
  • 単語の出現回数をカウント
  • Analyzerフレームワークの使い方
    • Analyzerによる単語の出現回数のカウント
    • 品詞指定の注意点
スポンサーリンク

Janomeのインストール

pip(環境によってはpip3)でインストールできる。別途インストールが必要な依存ライブラリはなにもない。非常に手軽。

$ pip install janome

JanomeとMeCab

日本語の形態素解析エンジンとして有名なものにMeCabがある。

MeCabをインストールして、さらにそのPythonバインディングもインストールするとPythonからMeCabを使うことが可能。

Janomeの公式ドキュメントのFAQにMeCabとの比較についての回答がある。

解析結果の精度

解析結果の精度は同等。

Q. 解析結果の精度は。
A. 辞書,言語モデルともに MeCab のデフォルトシステム辞書をそのまま使わせていただいているため,バグがなければ,MeCab と同等の解析結果になると思います。
Janome公式ドキュメントFAQ

形態素解析の速度

解析速度はJanomeのほうが10倍程度遅い。

Q. 形態素解析の速度は。
A. 文章の長さによりますが,手元の PC では 1 センテンスあたり数ミリ〜数十ミリ秒でした。mecab-python の10倍程度(長い文章だとそれ以上)遅い,というくらいでしょうか。
Janome公式ドキュメントFAQ

使いどころ

Janomeのインストールの手軽さは魅力的。数百文字程度であれば気になるほど遅くもない。形態素解析がどんなものか試してみたい、という目的であればJanomeでまったく問題ないと思う。

繰り返し長文を解析したり大量のテキストを解析したりする必要がある場合はMeCabの環境を整えたほうがいいだろう。

Janomeで形態素解析

基本的な使い方

TokenizerをインポートしてTokenizerオブジェクトのインスタンスを生成、tokenize()メソッドに対象の文字列を渡す。tokenize()メソッドはjanome.tokenizer.Tokenオブジェクトを要素とするリストを返す。

from janome.tokenizer import Tokenizer

t = Tokenizer()

s = 'すもももももももものうち'

print(type(t.tokenize(s)))
# <class 'list'>

print(type(t.tokenize(s)[0]))
# <class 'janome.tokenizer.Token'>

Tokenオブジェクトをprint()で出力すると以下のように解析結果が表示される。

for token in t.tokenize(s):
    print(token)
# すもも   名詞,一般,*,*,*,*,すもも,スモモ,スモモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも    名詞,一般,*,*,*,*,もも,モモ,モモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも    名詞,一般,*,*,*,*,もも,モモ,モモ
# の 助詞,連体化,*,*,*,*,の,ノ,ノ
# うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

tokenize()メソッドの引数streamTrueとするとストリーミングモードとなり、リストではなくジェネレーターを返す。リスト全体を保持する必要がなくTokenを逐次的に処理する場合に使う。

print(type(t.tokenize(s, stream=True)))
# <class 'generator'>

for token</