Upload
tomoko-uchida
View
2.716
Download
0
Embed Size (px)
Citation preview
Pure Python 実装の形態素解析器
をつくってみた話
2015.05.22 PyData.Tokyo Meetup #5 -‐ 自然言語処理 (LT)
@moco_beta
自己紹介• @moco_beta
• http://mocobeta-backup.tumblr.com/
• 元・Web系 Python エンジニア
• いまは日曜 Python プログラマ
• 興味があること: 情報検索技術/プロダクト
• 自然言語処理・機械学習ワナビー🐣
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) ... すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
janome とは• 2015/4/8 v0.1 公開
• 最新 0.2.5
• Python 2.7 / 3.4 対応
一瞬バズった(っぽい)
特徴・実装• 辞書同梱
• 辞書エントリ, 言語モデルは mecab-ipadic-2.7.0-20070801 を使用
• trie木 (Double Array) ではなく Minimal Acyclic Subsequential Transducer でエンコード
• Pure Python
• ユーザー辞書サポート (meab-ipadic フォーマット)
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)
• (認識違いがあったらご指摘ください)
初期リリース~現在• Python 2.7 対応
• 辞書サイズを縮小
• 解析速度、メモリ使用量の改善
• 実装上の最適化の余地はまだ色々ある…と思う…
現在進行形でハマっていること• 同梱辞書の取り扱いは、Python経験値不足もあっていろいろ踏んだ/踏んでる
• バイト配列の扱い
• struct.unpack() が解析実行時のボトルネック
• array, memoryview など(?)より高速なバイト配列へのアクセス方法を模索中
• ソースに埋め込みのデータ
• 辞書の一部はソースに埋め込んでいるが、ソースが大きくなりすぎてビルドのときにメモリをたくさんくう
• pip install のビルド時に3~4GB必要
• (実装が楽という利点はある)
これから• 解析のスループット、メモリ使用量が入力のサイズに影響を受けすぎないようにする
• 入力が大きい場合、巨大なラティスを作らずに、あらかじめ決めておいたバッファサイズに収まる範囲で部分的に解析する(入力によっては最適解ではなく近似解になるかも)
• その他 Issues: https://github.com/mocobeta/janome/issues
• っていうか、そもそもニーズあるの…(もしあるなら補足したい)
• Twitter ハッシュタグ #janome_ma で拾います(さっき決めました)
• なんらかの手段で伝えていただいたバグや要望は、無理なものでなければ最優先タスクになります(めったにないのでw)
Python で使える形態素解析器• mecab-python
• MeCab の Python バインディング
• 本家サイトで公開されているのは Python 2対応だけど少し手を入れれば Python 3でも動く
• python-cjuman
• JUMAN の Python バインディング
• igo-python
• Java 製の形態素解析器 Igo の Python ポート
• pure python
• 辞書は同梱しない。別途ビルドが必要
• ユーザー辞書が不要なら、現行の janome より高速で、 mecab-python との解析結果の差異(未知語処理の差異)も少ないのでおすすめ
• 他、とりこぼしがあったらすみません
ありがとうございました