複合名詞や「〇〇の〇〇」といったフレーズを、文章から取り出したい場面は多くあります。 この記事ではPythonを使ってそれらを抽出する方法を2つ紹介します。
- janomeのTokenFilterを使う
- negimaを使う
janomeのTokenFilterを使う
Janomeは@moco_betaさんが開発したPython製の形態素解析器です。 Janomeの後処理機能であるTokenFilterを使用する方法を説明します。
- Welcome to janome's documentation! (Japanese) — Janome v0.3 documentation (ja)
- Python janomeのanalyzerが便利 - け日記
複合名詞用に関してはすぐに利用が可能です。
それ以外の品詞を指定してフレーズを探す場合には、TokenFilter
クラスを継承して新しいFilterを自前で実装する必要があります。
利用が簡単な複合名詞を得る例を紹介します。CompoundNounFilter
を使います。
from janome.tokenizer import Tokenizer from janome.analyzer import Analyzer from janome.tokenfilter import CompoundNounFilter def main(): tokenizer = Tokenizer() token_filter = [CompoundNounFilter()] analyzer = Analyzer(tokenizer=tokenizer, token_filters=token_filter) with open('sample.txt') as lines: for line in lines: for token in analyzer.analyze(line): print(token) if __name__ == '__main__': main()
negimaを使う
negimaは@cocodripsさんさんが開発している品詞パターンマッチングライブラリです。
下記のようなマッチングのルールを記載したrule.csvを用意します。
id,min,max,pos0,pos1,pos2,pos3,pos4,pos5 0_xxない,1,5,名詞,,,,, ,1,5,形容詞,自立,,,, 5_xxがyy,1,5,名詞,,,,, ,1,5,助詞,格助詞,,,, ,1,5,名詞,,,,, 6_xxのyy,0,2,接頭詞,名詞接続,,,, ,1,5,名詞,,,,, ,1,5,助詞,連体化,,,, ,1,5,名詞,,,,, 999_複合名詞,2,6,名詞,,,,,
上記のルールファイルを保存したら、下記のスクリプトで該当するフレーズを抽出してみましょう。
※まだnegimaをインストールしていない場合は、実行前にpip install -U negima
が必要です。
from negima import MorphemeMerger mm = MorphemeMerger() mm.set_rule_from_csv('rule.csv', sep=',') with open('sample.txt') as lines: for line in lines: words, _ = mm.get_rule_pattern(line) print(words)
複合名詞や「〇〇の〇〇」といったフレーズが抽出できていることがわかります。
'暴君ディオニス', '娘さん', '邪智暴虐の王', '村の牧人', 'メロスの裸体'
negimaは品詞を列記するだけで、文字列中から該当するフレーズを簡単に抽出することができます。
まとめ
- 後処理を細かく実装したいならJanomeの
TokenFilter
が選択肢になる - 品詞のパターンマッチングに関してはnegimaが圧倒的に使いやすい