8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

日本語のストップワードを削除するモジュールをpyplに上げたのでその共有

自然言語処理のアドベントカレンダーが埋まっていなかったので、僭越ながら最近自分で書いて使っている形態素解析済みの単語をリストとして持つ文書のリストからストップワードを除去するというプログラムを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

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で文章を解析したり、生成したりしたいのですが勉強あるのみですね。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
8
Help us understand the problem. What are the problem?