自然言語処理のアドベントカレンダーが埋まっていなかったので、僭越ながら最近自分で書いて使っている形態素解析済みの単語をリストとして持つ文書のリストからストップワードを除去するというプログラムをpypl(pip)に登録して皆さんに共有したいと思います。
はじめに
もしかすると、すでに便利なライブラリがあるのかもしれませんが、普段使っているscikit-learnには英語のストップワードを除去する機能はあるけど日本語はないです。
なのでいつも自分で実装しているのですが、だったらpyplに登録してpipでインストールすれば楽なんじゃないのかと思った次第です。
いや、別に大したコードじゃないんでその都度書けばいいんですけど、十数行にはなるのでもしpipで公開したら使ってくれる人いるのかもしれないと思いました。
普通にpythonでlistを展開して、ストップワードのリストと照らし合わせて削除するだけのコードなので、実行速度が速くなるみたいな機能はないです。
ただ、今日はちょっと暇だったので品詞別にストップワードのリストの中身を変える機能を搭載させました。
というのも、文章の特性によって削除する単語の品詞って変えたほうがいいと思うんですよね。
例えば、SNSの投稿とニュースサイトの記事は品詞ごとの単語の役割ってちょっと違っていると思います。
でも、ストップワードの中身を変えたところで大してモデルの精度に影響はないような気もしますけど・・・。
削除する品詞ごとの単語は、wikipediaやミエルカAI-日本語ストップワードの考察【品詞別】、slothlibあたりを参考にさせてもらって選びました(各品詞ごとに30~50って感じです)。
使い方
pipでインストールできます。依存しているライブラリはscikit-learnだけです。
pip install ja_stopword_remover
後は普通にimportするだけです。
from ja_stopword_remover.remover import StopwordRemover
注意するところは、**"形態素解析済みの単語をもつリストとして持つ文のリストを投げると、ストップワードを削除して返してくる"**というところです。
StopwordRemover
クラスからインスタンスを用意して、remove()
メソッドの引数に単語のリストの分のリストを指定して呼び出せば、結果のリストが返されます。
サンプルコード
from ja_stopword_remover.remover import StopwordRemover
import pprint
# 多田なの(@ohta_nano)さんの詩です。
text_list = [[ "僕", "たち", "は", "プラネタリウム", "に", "立て籠もり", "夜明け", "の", "シーン", "だけ", "繰り返す",],
[ "桜", "って", "「", "さくら", "」", "って", "読む", "って", "あなた", "から", "教えて", "もらう", "人", "に", "なりたい",],]
stopwordRemover = StopwordRemover()
text_list_result = stopwordRemover.remove(text_list)
pprint.pprint(text_list_result)
stopwordRemover = StopwordRemover()
text_list_result = stopwordRemover.remove(text_list)
pprint.pprint(text_list_result)
もし、一文だけからストップワードを除去したい場合は、その文をさらにリストに詰めてください。
削除する品詞を指定する
品詞を指定したい場合はtest_choose_parts()
の引数で指定して下しさい。
パラメータ名 | 品詞名 |
---|---|
demonstrative | 指示語 |
pronoun | こそあど言葉 |
symbol | 記号 |
verb | 動詞 |
one_character | 一字 |
postpositional_particle | 助詞 |
adjective | 形容詞 |
auxiliary_verb | 助動詞 |
slothlib | slothlib収録語 |
こんな感じです。この場合はslothlib収録語のみ消去されます。
stopwordRemover.choose_parts(
demonstrative=False,
symbol=False,
verb=False,
one_character=False,
postpositional_particle=False,
slothlib=True,
auxiliary_verb=False,
adjective=False
)
test_choose_parts()
を使用しない場合はデフォルトですべての品詞の単語が消去されます。でも、test_choose_parts()
の引数のデフォルト値はFalseなのでslothlib収録語のみ消去したい場合はtest_choose_parts(slothlib=True)
でOKです。
scikit-learnのパイプラインで使う場合
scikit-learnのパイプラインで使う場合はSKStopwordRemover
クラスを利用して下しさい。
こちらも使い方はシンプルで、インスタンスをstep
に登録するだけで使えます。
sKKStopwordRemover = SKStopwordRemover()
step = [("StopwordRemover", sKKStopwordRemover)]
pipe = Pipeline(steps=step)
pipe.fit(text_list)
text_list_result = pipe.transform(text_list)
品詞を指定する場合はインスタンスを生成する際に引数で削除したくない品詞を一つづつ指定してくださいSKStopwordRemover(one_character=False)
※こちらはデフォルトがTrueになているのですが、slothlibにはすべての品詞が含まれているためのデフォルトがFalseになっています(ややこしくてごめんなさい)。
終わりに
言葉と機械学習ってすごく面白いと思うんですが、いまいち学習が進まないです・・・。
公私共にバリバリAIで文章を解析したり、生成したりしたいのですが勉強あるのみですね。