好きな品詞の組み合わせのフレーズを抜き出すPythonパッケージ「negima」を作った

日本語の自然言語処理が絡んだ作業をする際に、

  • 名詞だけ抜き出したい
  • 名詞だけ抜き出したいが、接頭詞の「未」「非」とかもくっつけて抜き出したい
  • 形容詞を抜き出したいが、否定の「ない」もくっつけて抜き出したい

みたいに形態素解析をしたあとに形態素同士をつなげてフレーズの抽出をしたいシチュエーションがよくあると思う。

そういった特定の品詞の組み合わせをルールを定義することで、フレーズを抜き出せるPythonパッケージ「negima」を作った。

概要

例えば複合名詞を抽出したい場合、このようなルールを定義する。

id min max pos0 pos1 pos2 pos3 pos4 pos5
nouns 0 2 接頭詞
1 4 名詞 一般|サ変接続|数
0 2 名詞 接尾

このルールをnoun.csvとしてファイルに定義したとすると、

  1. 0個以上2個以下の接頭詞ではじまり、
  2. 1個以上4個以下の名詞(一般orサ変接続or数)があり、
  3. 0個以上2個以下の名詞(接尾)を持つ

ような、フェーズを以下のコードで抽出することができる。

sample.py

from negima import MorphemeMerger
mm = MorphemeMerger()
mm.set_rule_from_csv('noun.csv')

words, _ = mm.get_rule_pattern('約5000人が国立競技場に駆けつけた')
print(words)
$ python sample.py
['約5000人', '国立競技場']

内部的には、定義されたルールから以下のような木構造を作成し、matchするかを確かめている。 f:id:cocodrips:20180820144644p:plain

詳しいルールの書き方はリポジトリREADME.mdに書いてあるが、 ルールファイルはcsv/tsv/エクセルで定義することが可能で、複数のルールを同時に定義することができる。

ルールの定義順は関係なく、id列につけたルールの名前によりsortされ、小さい順に優先度が高いルールとなる。

例えば以下のような複数のルール定義する。

id min max pos0 pos1 pos2 pos3 pos4 pos5
999_noun 名詞
100_set 1 4 名詞
助詞 格助詞 係助詞
形容詞 自立
0 助動詞 特殊・ナイ
200_verb 動詞 自立
0 助動詞 特殊・ナイ

レベルが低すぎてボスに勝てない という文章から抽出を行うと、

  • レベルが低い: 100_set
  • ボス: 999_noun
  • 勝てない: 200_verb

の3パーツになる。 レベルは名詞なので 999_noun のルールにも引っかかるが、100_set のルールのほうが優先度が高いため、そちらの組み合わせが優先される。

インストール

pypiに登録してみた。 pypi.org

利用するには

  • Python3.4以上
  • mecabのインストール

が必要になる。これらを満たせば、

$ pip install negima

でインストールできる。

さいごに

こういうのあるでしょって思って調べたんだけどなかなか見つけられなくて、 仕事で使うために作ったんだけど、結構便利だったのでpypiに登録してみました。
(パッケージ名は可愛い名前の食べ物のなかでpypiにないやつを探した!パーツを組み合わせる感じはねぎまっぽさあると思う!)

不具合等あればissue/PRだしていただければ嬉しいです。
GitHub - cocodrips/negima