[janome 開発日誌] 前処理・後処理用の Analyzer フレームワークを追加した janome 0.3.4 をリリースしました

janome のバージョン 0.3.4 をリリースしました。

形態素解析,前処理大事!解析後の処理もいろいろやりたい!・・・気づいたら同じような処理を色々なところで再実装してる・・・ということで,形態素解析の前処理・後処理を簡単にテンプレ化するためのフレームワーク(的なもの)を実装しました。(”Analyzer フレームワーク” と名づけている通り,Solr や Elasticsearch を使っている方はご存知の,Lucene の Analyzer をイメージしてもらえるとわかりやすいと思います。)

詳しくはドキュメントを参照いただくとして,だいたいの感触がわかる実行例を紹介します。ここでは以下の処理フローを定義して,解析対象の文字列に適用しています。

  • 前処理として,ユニコード正規化と正規表現による文字列置換
  • 形態素解析
  • 後処理として,名詞の連続のまとめあげ(複合名詞化),品詞によるフィルタリング,表層形の小文字化
>>> from janome.tokenizer import Tokenizer
>>> from janome.analyzer import Analyzer
>>> from janome.charfilter import *
>>> from janome.tokenfilter import *
>>> text = u'蛇の目はPure Pythonな形態素解析器です。'
>>> char_filters = [UnicodeNormalizeCharFilter(), RegexReplaceCharFilter(u'蛇の目', u'janome')]
>>> tokenizer = Tokenizer()
>>> token_filters = [CompoundNounFilter(), POSStopFilter(['記号','助詞']), LowerCaseFilter()]
>>> a = Analyzer(char_filters, tokenizer, token_filters)
>>> for token in a.analyze(text):
... print(token)
...
janome 名詞,固有名詞,組織,*,*,*,*,*,*
pure 名詞,固有名詞,組織,*,*,*,*,*,*
python 名詞,一般,*,*,*,*,*,*,*
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
形態素解析器 名詞,複合,*,*,*,*,形態素解析器,ケイタイソカイセキキ,ケイタイソカイセキキ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス

まだ数は少ないですが,いくつか組み込みのフィルターを用意しているので,現在実装済みのフィルター一覧をここに載せておきます。

CharFilters (for pre-processing)

  • RegexReplaceCharFilter : 入力文字列の,指定された正規表現にマッチする箇所を指定の文字列で置換します。
  • UnicodeNormalizeCharFilter : 入力文字列をユニコード正規化します。

TokenFilters (for post-processing)

  • LowerCaseFilter : 表層形の小文字化を行います。
  • UpperCaseFilter : 表層形の大文字化を行います。
  • POSStopFilter : 指定された品詞タグにマッチするトークンを除去します。
  • POSKeepFilter : 指定された品詞タグにマッチするトークンのみ残し,その他を除去します。
  • CompoundNounFilter : 連続する名詞をひとつにまとめ,複合名詞にします。まとめられたトークンには「名詞,複合」という特殊な品詞が付与されます。
  • ExtractAttributeFilter : 指定された属性(プロパティ)を各トークンから抽出します。属性名として指定できるのは ‘surface’, ‘part_of_speech’, ‘infl_type’, ‘infl_form’, ‘base_form’, ‘reading’, ‘phonetic’ です。

基底クラスの CharFilter や TokenFilter を拡張することで,カスタム処理も簡単に追加できるので,よければ活用してみてください。 :)

Show your support

Clapping shows how much you appreciated moco(beta)’s backup 2nd’s story.