自然言語処理の様々なツールがpythonで試せると聞いたので色々と遊んでみました。
アルゴリズムは全く見えませんが、ほんの数行で面白いことができるのは驚きです。
###実行環境
Google ColabNotebook
#やってみたこと
まずはtransformersをインストールし、必要なものを定義しておきます。
*transformersのソースはこちら
pip install transformers
import torch
from transformers import pipeline
sentiment_analysis = pipeline('sentiment-analysis')
question_answering = pipeline('question-answering')
fill_mask = pipeline("fill-mask")
feature_extraction = pipeline("feature-extraction")
今回は上の4つで遊んでみました。以下でそれぞれ見てみます。
###sentiment-analysis
入力された文のポジティブ・ネガティブ度合いを出力してくれます。
sentiment_analysis("Because of the pandemic, I decided to refrain from going out.")
# => [{'label': 'NEGATIVE', 'score': 0.9692758917808533}]
すごい確率でネガティブ予想されています。
###question-answering
質問文、状況説明文(この中に答えとなる単語がある)を与えると、答えを返してくれます。
question_answering({
'question': 'What is the cause of the pandemic?',
'context' : 'The coronavirus triggered an outbreak, and society was thrown into chaos.'
})
# => {'answer': 'coronavirus', 'end': 15, 'score': 0.6689822122523879, 'start': 4}
正しい答えが出ていますね。
(ただ、他にも色々試したところ誤りを返すこともままあったので、アルゴリズムにとって分かりやすい?文でないと上手くいかなさそうです。)
###fill-mask
文の中に一箇所を入れたものを与えると、その空欄に当てはまりそうな単語を入れて返してくれます。
fill_mask("I have to be in bed all day today because I get <mask>.")
'''
=> [{'score': 0.2714517414569855,
'sequence': '<s> I have to be in bed all day today because I get tired.</s>',
'token': 7428},
{'score': 0.19346608221530914,
'sequence': '<s> I have to be in bed all day today because I get sick.</s>',
'token': 4736},
{'score': 0.07417058944702148,
'sequence': '<s> I have to be in bed all day today because I get headaches.</s>',
'token': 20816},
{'score': 0.05399525910615921,
'sequence': '<s> I have to be in bed all day today because I get insomnia.</s>',
'token': 37197},
{'score': 0.05070624500513077,
'sequence': '<s> I have to be in bed all day today because I get sleepy.</s>',
'token': 33782}]
'''
どれも良さそうですね。
(時節柄、気が滅入りそうな例文ばかりですみません。。)
###feature-extraction
入力した文の特徴を表すベクトルを返してくれます。
上の三つとは違って数値のみの戻り値ですが、これを使えば自作のモデルで文章を扱うのも簡単にできそうだな〜と思ったり。(いつか何かやってみたい)
array = feature_extraction("I catch a cold.")
import numpy as np
np.array(array).shape
# => (1, 7, 768)
array[0][0][:10]
'''
=> [0.3683673143386841,
0.008590285666286945,
0.04184938594698906,
-0.08078824728727341,
-0.20844608545303345,
-0.03908906877040863,
0.19680079817771912,
-0.12569604814052582,
0.010193285532295704,
-1.1207540035247803]
'''
上のような次元、値を持つリスト型を返してくれました。
それにしても、「風邪を引いた」という文一つを理解するのにこんなにデータを使うとは。。
以下ついでにもう一つ。
array = feature_extraction("I catch a cold and I am sleepy.")
import numpy as np
np.array(array).shape
# => (1, 11, 768)
array[0][0][:10]
'''
=> [0.3068505525588989,
0.026863660663366318,
0.17733855545520782,
0.03574731573462486,
-0.12478257715702057,
-0.22214828431606293,
0.2502932548522949,
-0.17025449872016907,
-0.09574677795171738,
-0.9091089963912964]
'''
二番目の次元が変わりました。最後の次元の768というのは変わらないみたいです。