11
Pure Python 実装の形態素解析器 をつくってみた話 2015.05.22 PyData.Tokyo Meetup #5 自然言語処理 (LT) @moco_beta

Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

Embed Size (px)

Citation preview

Page 1: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

Pure  Python  実装の形態素解析器  

をつくってみた話

2015.05.22  PyData.Tokyo  Meetup  #5  -­‐    自然言語処理    (LT)  

@moco_beta

Page 2: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

自己紹介• @moco_beta

• http://mocobeta-backup.tumblr.com/

• 元・Web系 Python エンジニア

• いまは日曜 Python プログラマ

• 興味があること: 情報検索技術/プロダクト

• 自然言語処理・機械学習ワナビー🐣

Page 3: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

janome  とは• http://mocobeta.github.io/janome/

• “janome (蛇の目) は, Pure Python で書かれた, 辞書内包の形態素解析器です.”(venv)  $  pip  install  janome  (venv)  $  python  >>>  from  janome.tokenizer  import  Tokenizer  >>>  t  =  Tokenizer()  >>>  for  token  in  t.tokenize('すもももももももものうち'):  ...          print(token)  ...  すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ  

も        助詞,係助詞,*,*,*,*,も,モ,モ  

もも    名詞,一般,*,*,*,*,もも,モモ,モモ  

も        助詞,係助詞,*,*,*,*,も,モ,モ  

もも    名詞,一般,*,*,*,*,もも,モモ,モモ  

の        助詞,連体化,*,*,*,*,の,ノ,ノ  

うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

Page 4: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

janome  とは• 2015/4/8 v0.1 公開

• 最新 0.2.5

• Python 2.7 / 3.4 対応

一瞬バズった(っぽい)

Page 5: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

特徴・実装• 辞書同梱

• 辞書エントリ, 言語モデルは mecab-ipadic-2.7.0-20070801 を使用

• trie木 (Double Array) ではなく Minimal Acyclic Subsequential Transducer でエンコード

• Pure Python

• ユーザー辞書サポート (meab-ipadic フォーマット)

Page 6: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

Minimal  Acyclic  Subsequential  Transducer

• FST (Finite State Transducer) の一種

• Apache Lucene (Solr, Elasticsearch のコアとして使用されている検索ライブラリ) の辞書やクエリ実行エンジン部分で採用されている

• 状態遷移の prefix, suffix 両方を共有するので、データサイズがコンパクト(≒省メモリ)なのが特徴

• janome (0.2.5時点) の実装では, mecab-ipadic の見出し語 39万語をインデックスして3.5MB

• 構築されるオートマトンは決定的で、高速な検索が可能

• 探索時の計算量は、trie木と同じで入力の長さに対して O(n)

• (認識違いがあったらご指摘ください)

Page 7: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

初期リリース~現在• Python 2.7 対応

• 辞書サイズを縮小

• 解析速度、メモリ使用量の改善

• 実装上の最適化の余地はまだ色々ある…と思う…

Page 8: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

現在進行形でハマっていること• 同梱辞書の取り扱いは、Python経験値不足もあっていろいろ踏んだ/踏んでる

• バイト配列の扱い

• struct.unpack() が解析実行時のボトルネック

• array, memoryview など(?)より高速なバイト配列へのアクセス方法を模索中

• ソースに埋め込みのデータ

• 辞書の一部はソースに埋め込んでいるが、ソースが大きくなりすぎてビルドのときにメモリをたくさんくう

• pip install のビルド時に3~4GB必要

• (実装が楽という利点はある)

Page 9: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

これから• 解析のスループット、メモリ使用量が入力のサイズに影響を受けすぎないようにする

• 入力が大きい場合、巨大なラティスを作らずに、あらかじめ決めておいたバッファサイズに収まる範囲で部分的に解析する(入力によっては最適解ではなく近似解になるかも)

• その他 Issues: https://github.com/mocobeta/janome/issues

• っていうか、そもそもニーズあるの…(もしあるなら補足したい)

• Twitter ハッシュタグ #janome_ma で拾います(さっき決めました)

• なんらかの手段で伝えていただいたバグや要望は、無理なものでなければ最優先タスクになります(めったにないのでw)

Page 10: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

Python  で使える形態素解析器• mecab-python

• MeCab の Python バインディング

• 本家サイトで公開されているのは Python 2対応だけど少し手を入れれば Python 3でも動く

• python-cjuman

• JUMAN の Python バインディング

• igo-python

• Java 製の形態素解析器 Igo の Python ポート

• pure python

• 辞書は同梱しない。別途ビルドが必要

• ユーザー辞書が不要なら、現行の janome より高速で、 mecab-python との解析結果の差異(未知語処理の差異)も少ないのでおすすめ

• 他、とりこぼしがあったらすみません

Page 11: Pure Python 実装の形態素解析器をつくってみた話 #PyDataTokyo #janome_ma

ありがとうございました