自然言語処理って何?今、流行りの技術を触ってみた!


ご挨拶

こんにちは。
早いもので入社から半年、あっという間に今年も終わってしまいますね。
この記事は、21卒エンジニアの深尾がお送りしてまいります。

最初はくどくど説明しておりますので、やり方だけ知りたい方はここまで飛ばしてください


そもそも、自然言語処理って何?

ざっくばらんに言ってしまえば、
私たちが日常的に使う言葉をコンピューターに処理させよう!
という事です。

例えば、検索エンジンで検索する際に、誤字をしてしまった経験ありませんか?
でも、そんな時、検索エンジン側で勝手に判断して、こんな風に調べてくれますよね?

これこそ自然言語処理の技術なのです。


軽率に遊んでみる。

ここからは実際に遊んでみましょう。

近年、SNSでは選択肢を選んでいって自分の情報をグラフ化・数値化する事が流行っていますし、「自分の言葉がどれくらいプラスに近い言葉なのか」を数値化してみたいと思います。

この数値が高ければ高いほど、自分がプラスの発言が出来ているという事です!


まずは形態素解析から!

え、今まで自然言語処理の話してましたよね?

と思われるかもしれませんが、形態素解析も自然言語処理の一つなのです。

コンピューターに自然言語を処理させるとき、文章で処理させるより、文を品詞単位まで分解して計算に不要なノイズとなる情報を削った方が効率が良いからです。

皆さんも検索エンジンを使うとき、

「Windows11のメリットとデメリットが知りたい」

ではなく、

「Windows11 メリット デメリット」

の様に、文章から単語単位にまで分解して検索しますよね?
それと同じです。


使っていくツール一覧

  • Python3
  • Anaconda(仮想環境)
  • PyCharm(Editor)
  • janome (形態素解析)
  • 日本語 Wikipedia エンティティベクトル (学習済み単語ベクトルデータ)

さて、お待たせしましたが、今から始めていきます!

最初は文章を分解していきます。

tokenizer = Tokenizer()
words = tokenizer.tokenize("形態素解析したい文字列"):

for word in words:
    print(str(word))

実行結果はこんな感じ。

形態素 名詞,一般,,,,,形態素,ケイタイソ,ケイタイソ
解析 名詞,サ変接続,,,,,解析,カイセキ,カイセキ
し 動詞,自立,,,サ変・スル,連用形,する,シ,シ
たい 助動詞,,,,特殊・タイ,基本形,たい,タイ,タイ
文字 名詞,一般,,,,,文字,モジ,モジ
列 名詞,一般,,,,*,列,レツ,レツ

文章の分解が出来たので、分解した後の品詞を整形して

for word in words:
    print(str(word))
    base_form_words.append(word.base_form)

print(base_form_words)
形態素	名詞,一般,*,*,*,*,形態素,ケイタイソ,ケイタイソ
解析	名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たい	助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
文字	名詞,一般,*,*,*,*,文字,モジ,モジ
列	名詞,一般,*,*,*,*,列,レツ,レツ
['形態素', '解析', 'する', 'たい', '文字', '列']

最後に、どれだけプラスに近いのか数値化してみます。

tokenizer = Tokenizer()
model_dir = '../entity_vector/entity_vector.model.bin'
model = KeyedVectors.load_word2vec_format(model_dir, binary=True)

text = "形態素解析したい文字列"

words = tokenizer.tokenize(text)
base_form_words = []
score_list = []

for word in words:
    score = model.similarity(word.base_form, "プラス")
    score_list.append(score)
    base_form_words.append(word.base_form)

print(base_form_words)
print(score_list)

result = 0

for score in score_list:
    result += score

result = ('"' + text + '"' + "のプラス度は、" + str(result / len(score_list)) + "でした!")

print(result)

そして気になる結果ですが、

['形態素', '解析', 'する', 'たい', '文字', '列']
[0.10550548, 0.09879947, 0.108565584, 0.20253469, 0.16754162, 0.14075953]
"形態素解析したい文字列"のプラス度は、0.1372843955953916でした!

1が最高なので0.1だと、実質マイナスですねw

勿論、プラスと入れると結果はこうなりますよ?

['プラス']
[1.0]
"プラス"のプラス度は、1.0でした!

以上、新卒エンジニアの深尾がお送りいたしました!

おまけ

ところで今回プラスの近さだけしか試していませんが、マイナスからの近さで試すとどうなるのでしょう?

['プラス']
[0.67812616]
"プラス"のマイナス度は、0.6781261563301086でした!

あれ?プラスの反対だから0に近くになると思いきや0.6!?

['plus']
[0.51167214]
"plus"のプラス度は、0.5116721391677856でした!

プラスと同じplusなのに0.5!?

何故なんでしょうか?それは、単語ベクトルという概念が絡んでくるお話になるのですが、またの機会に…。

利用させて頂いた画像

関連記事

プロジェクトストーリー

技術

コメント

この記事へのコメントはありません。

カテゴリー

TOP
TOP