Pythonで文章から複合名詞や「〇〇の〇〇」といったフレーズを抽出する

複合名詞や「〇〇の〇〇」といったフレーズを、文章から取り出したい場面は多くあります。 この記事ではPythonを使ってそれらを抽出する方法を2つ紹介します。

  1. janomeのTokenFilterを使う
  2. negimaを使う

janomeのTokenFilterを使う

Janomeは@moco_betaさんが開発したPython製の形態素解析器です。 Janomeの後処理機能であるTokenFilterを使用する方法を説明します。

複合名詞用に関してはすぐに利用が可能です。 それ以外の品詞を指定してフレーズを探す場合には、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が圧倒的に使いやすい