日本語の自然言語処理が絡んだ作業をする際に、
- 名詞だけ抜き出したい
- 名詞だけ抜き出したいが、接頭詞の「未」「非」とかもくっつけて抜き出したい
- 形容詞を抜き出したいが、否定の「ない」もくっつけて抜き出したい
みたいに形態素解析をしたあとに形態素同士をつなげてフレーズの抽出をしたいシチュエーションがよくあると思う。
そういった特定の品詞の組み合わせをルールを定義することで、フレーズを抜き出せるPythonパッケージ「negima」を作った。
概要
例えば複合名詞を抽出したい場合、このようなルールを定義する。
id | min | max | pos0 | pos1 | pos2 | pos3 | pos4 | pos5 |
---|---|---|---|---|---|---|---|---|
nouns | 0 | 2 | 接頭詞 | |||||
1 | 4 | 名詞 | 一般|サ変接続|数 | |||||
0 | 2 | 名詞 | 接尾 |
このルールをnoun.csv
としてファイルに定義したとすると、
- 0個以上2個以下の接頭詞ではじまり、
- 1個以上4個以下の名詞(一般orサ変接続or数)があり、
- 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するかを確かめている。
詳しいルールの書き方はリポジトリの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 のルールのほうが優先度が高いため、そちらの組み合わせが優先される。
インストール
利用するには
- Python3.4以上
- mecabのインストール
が必要になる。これらを満たせば、
$ pip install negima
でインストールできる。
さいごに
こういうのあるでしょって思って調べたんだけどなかなか見つけられなくて、
仕事で使うために作ったんだけど、結構便利だったのでpypiに登録してみました。
(パッケージ名は可愛い名前の食べ物のなかでpypiにないやつを探した!パーツを組み合わせる感じはねぎまっぽさあると思う!)
不具合等あればissue/PRだしていただければ嬉しいです。
GitHub - cocodrips/negima