【超入門】自然言語処理でネガポジ判定してみよう!

nlp-icatch

「自然言語処理」という言葉を聞いて、皆さんはどのようなイメージを持たれるでしょうか?機械学習を学んだことがない場合、「聞いたことはあるがどのようなものなのかはわかっていない」、「なんとなく難しそう」等のイメージを持たれる方が多いのではないかと思います。今回は自然言語処理が実際にどのように使われているかというところから、自然言語処理を用いてテキストのネガティブ・ポジティブ度を数値化するところまでをまとめていきたいと思います。コードはpythonで書いていきます。

自然言語処理をなんとなく理解しよう

そもそも自然言語処理とは?

そもそも自然言語処理とはどのようなものなのでしょうか。

Wikipediaには

「自然言語処理(しぜんげんごしょり、英語: natural language processing、略称:NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。」

とあります。しかし、「自然言語をコンピュータに処理させる」と言われてもなかなかピンとこないと思います。ここで言われている処理というのは、テキストデータを単語単位に分割したり、大量のテキストデータを学習して単語同士の関係を推測したりすることです。今回行っていくネガポジ判定では、ネガティブなワードとポジティブなワードの辞書を作り、判定するデータがどれだけ辞書にある単語を含んでいるかを調べて点数をつけていきます。このような処理をコンピュータに命令して処理させるのが自然言語処理です。

こんなところで使われている!

代表的なものにGoogle翻訳などの自動翻訳や、アレクサ、GoogleHome等のスマートスピーカー、TwitterやLINEのチャットボットなどが挙げられます。身近な業務への応用としては、お客様からの問い合わせの対応を自動化したり、受信したメールをカテゴリや目的別に自動で振り分けたりすることができます。

機械学習を使わないネガポジ判定で自然言語処理入門する!

工程を確認しよう!

自然言語処理がどのようなものなのか、ざっくりと理解できたところで早速自然言語処理に入門していきましょう。今回はテキストのネガティブ・ポジティブの判定をしていきます。これは自然言語処理の世界では「感情分析」という分野に入ります。一般的に自然言語処理は機械学習を用いて行いますが、今回は超入門編ということで機械学習はせずに基本的な処理のみで行っていきます。

これから行う工程をまとめると、

① ネガティブ、ポジティブなワードの単語辞書を作る

② 評価する対象になるデータを用意する

③ 評価対象のデータを処理し、評価する

という流れになります。

判定に使う辞書を作ろう!

今回は東北大学 乾・岡崎研究室が公開している「日本語評価極性辞書(用言編)」と「日本語評価極性辞書(名詞編)」を使います。ネガティブなワードは「n」、ポジティブなワードは「p」、ニュートラルなワードは「e」で表現していきます。

「日本語評価極性辞書(用言編)」, 「日本語評価極性辞書(名詞編)」

この辞書を判定に使うために整形していきます。例えば名詞の方を見ると、各ワードに活用形や説明が書かれています。今回は「悲しい,n」、「楽しい,p」のような形の辞書を作っていきたいのでこれらはカットします。

成形前の名詞辞書
整形前の名詞の辞書

用言の方は「n,疲れる」の他に「n,疲れ,が,ある」という内容も含まれてしまっています。これはどう処理すべきか悩ましいところですが、今回は評価するテキストがどれだけ辞書にある単語を含んでいるのかを調べたいので、助詞や助動詞の部分はカットして「n, 疲れ」というように整形します。このように整形していくと「n,可哀相,だ」と「n,可哀相,です」がどちらも「n, 可哀相」になってしまうので、名詞の辞書と結合した後に重複している単語を削除します。これで辞書は完成です!

成形前の用言の画像
整形前の用言の辞書
完成した辞書
完成した辞書

評価するデータを用意しよう!

次に評価するデータを用意します。今回のような練習目的の場合はオープンソースのテキストや、Twitterから取得したツイートなどを利用するのがおすすめです。今回は自分で適当なテキストを用意し、以下のような配列にしておきます。

texts= ["今日は楽しくて良い一日だった。ランチに行ったお店がとても美味しかった。", "今日は天気が悪くて大変だった。とても疲れた。", "今日は天気が悪かったから、家で読書をした。こういう日も悪くない。"]

評価してみよう!

ではいよいよテキストを評価していきます。評価方法はいたってシンプルで、評価するテキストを単語単位に分割し、単語の原型を取得します。さらに助動詞と助詞を除いて動詞・名詞・形容詞のみを残します。残った単語が辞書に含まれているかを調べて、ネガティブな単語の場合-1点、ポジティブな単語の場合+1点、ニュートラルな単語の場合0点で点数を計算します。このようにテキストを単語が意味を持つ最小の単位に分解して解析することを「形態素解析」と言います。形態素解析を行う際に非常によく使われるのがMeCabという形態素解析エンジンです。自然言語処理の世界では知らない人はいないと言っても過言ではないくらいメジャーなツールで、今回もMeCabを使ってテキストを分解していきます。

では先ほど用意した評価用データをMeCabを使って単語単位に分解してみます。

import MeCab

#MeCab準備
tagger = MeCab.Tagger()

#用意した評価用テキスト
texts= ["今日は楽しくて良い一日だった。ランチに行ったお店がとても美味しかった。", "今日は天気が悪くて大変だった。とても疲れた。", "今日は天気が悪かったから、家で読書をした。こういう日も悪くない。"]

#ループで1つずつ処理
for text in texts:
#     MeCabのTaggerオブジェクト
    mecab_result = tagger.parse(text)
    print(mecab_result)
    print("-------------------------------------------------------------------------------------------------------")

ここでは文章を単語単位に分割する際に便利なTaggerオブジェクトを使っています。以下の画像がひとつめの評価用テキストの実行結果です。

形態素解析の結果
形態素解析の結果

ここから単語の原型と品詞を取得し、先ほど説明した評価方法に従って点数をつけていきます。

import pickle
import MeCab

# 辞書読み込む
word_dic = pickle.load(open("word_dic.pickle", "rb"))
#MeCab準備
tagger = MeCab.Tagger()

#ファイル読み込む
texts= ["今日は楽しくて良い一日だった。ランチに行ったお店がとても美味しかった。", "今日は天気が悪くて大変だった。とても疲れた。", "今日は天気が悪かったから、家で読書をした。こういう日も悪くない。"]
for text in texts:
    print("評価するテキスト:", text)
    point = 0
#     MeCab
    s = tagger.parse(text)
    
#         スペースで分割して品詞側を取得
    for line in s.split("\n"):
#         EOSだったらループを抜ける
        if line == "EOS": break
#         さらにカンマで分割
        params = line.split("\t")[1].split(",")
#         品詞を取得
        hinshi = params[0]
#         単語の原型を取得
        word = params[6] 
        if not (hinshi in ['名詞', '動詞', '形容詞']): continue
#             取得した単語の原型が辞書に含まれているか調べて点数をつける
        if word in word_dic:
            negaposi = word_dic[word]
            if negaposi == 'n':
                point -= 1
            elif negaposi == 'p':
                point += 1
            else:
                point += 0
            print(word, negaposi)
    
    print("score:", point)
    print("形態素解析結果")
    print(s)
    print("---------------------------------------------------------------------------------------------------------")

ひとつめのテキストの結果がこちら。

scoreが2なのでポジティブな文章だと評価されていると言えます。

評価結果1
評価結果その1

ふたつめのテキストの結果がこちら。

scoreが-3なのでネガティブな文章だと判定されていると言えます。

評価結果2
評価結果その2

しかし問題なのが3つめのテキストです。文章自体のニュアンスはポジティブに近いにも関わらず、「悪い」というワードが多いためにscoreが-2になってしまっています。

評価結果3
評価結果その3

このような少し複雑な表現がされているテキストは機械学習で大量のテキストデータを学習して性能の良いモデルを作ったり、助動詞まで加味して評価する必要があります。

まとめ

いかがでしたでしょうか。自然言語処理は難しいもののようなイメージを持たれがちですが、実は今回のような基本的な作業だけでも感情分析ができます。

これを機に自然言語処理の世界に少しでも興味を持っていただけると嬉しいです。

関連記事