LoginSignup
41
65

More than 3 years have passed since last update.

[Python]自然言語処理で遊んでみた ~transformers~

Last updated at Posted at 2020-06-25

自然言語処理の様々なツールがpythonで試せると聞いたので色々と遊んでみました。
アルゴリズムは全く見えませんが、ほんの数行で面白いことができるのは驚きです。

実行環境

Google ColabNotebook

やってみたこと

まずはtransformersをインストールし、必要なものを定義しておきます。
*transformersのソースはこちら

pip install transformers
lang.py
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

入力された文のポジティブ・ネガティブ度合いを出力してくれます。

lang.py
sentiment_analysis("Because of the pandemic, I decided to refrain from going out.")
# => [{'label': 'NEGATIVE', 'score': 0.9692758917808533}]

すごい確率でネガティブ予想されています。

question-answering

質問文、状況説明文(この中に答えとなる単語がある)を与えると、答えを返してくれます。

lang.py
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

文の中に一箇所を入れたものを与えると、その空欄に当てはまりそうな単語を入れて返してくれます。

lang.py
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

入力した文の特徴を表すベクトルを返してくれます。
上の三つとは違って数値のみの戻り値ですが、これを使えば自作のモデルで文章を扱うのも簡単にできそうだな〜と思ったり。(いつか何かやってみたい)

lang.py
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]
'''

上のような次元、値を持つリスト型を返してくれました。
それにしても、「風邪を引いた」という文一つを理解するのにこんなにデータを使うとは。。

以下ついでにもう一つ。

lang.py
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というのは変わらないみたいです。

41
65
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
65