2022年4月春研修


自然言語研修

今回は自然言語について学びます。

1.AIにおける自然言語の位置づけ

(1)AIの分類



(2)機械学習・ディープラーニングの分類



2.自然言語処理

(1)形態素解析

空白で単語が区切られている英語等と違い、日本語の文章は区切りがありません。そのため文章を 単語に区切る必要があります。その技術を形態素解析といいます。代表的な形態素解析のpythonの ライブラリとしては、mecabやjanomeが上げられます

①mecabのコーディング例

#Mecabのインストール
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7

※textはなんでも好きな文章を入れてみてください。

import MeCab
text = "先週に引き続きJunitの課題とSpringBootの教材を進めた。"
text += "Junitの課題は新たに追加されたものを解いていった。"
text += "SpringBootの教材は3章のSpringBootによるWebアプリ開発を進めていき、REST Web サービスの開発について学んだ。"

mecab = MeCab.Tagger('-Ochasen')
rtn = mecab.parse(text)
print(rtn)

【実行結果】

先週	センシュウ	先週	名詞-副詞可能		
に	ニ	に	助詞-格助詞-一般		
引き続き	ヒキツヅキ	引き続く	動詞-自立	五段・カ行イ音便	連用形
Junit	Junit	Junit	名詞-一般		
の	ノ	の	助詞-連体化		
課題	カダイ	課題	名詞-一般		
と	ト	と	助詞-並立助詞		
SpringBoot	SpringBoot	SpringBoot	名詞-一般		
の	ノ	の	助詞-連体化		
教材	キョウザイ	教材	名詞-一般		
を	ヲ	を	助詞-格助詞-一般		
進め	ススメ	進める	動詞-自立	一段	連用形
た	タ	た	助動詞	特殊・タ	基本形
。	。	。	記号-句点		
Junit	Junit	Junit	名詞-一般		
の	ノ	の	助詞-連体化		
課題	カダイ	課題	名詞-一般		
は	ハ	は	助詞-係助詞		
新た	アラタ	新た	名詞-形容動詞語幹		
に	ニ	に	助詞-副詞化		
追加	ツイカ	追加	名詞-サ変接続		
さ	サ	する	動詞-自立	サ変・スル	未然レル接続
れ	レ	れる	動詞-接尾	一段	連用形
た	タ	た	助動詞	特殊・タ	基本形
もの	モノ	もの	名詞-非自立-一般		
を	ヲ	を	助詞-格助詞-一般		
解い	トイ	解く	動詞-自立	五段・カ行イ音便	連用タ接続
て	テ	て	助詞-接続助詞		
いっ	イッ	いく	動詞-非自立	五段・カ行促音便	連用タ接続
た	タ	た	助動詞	特殊・タ	基本形
。	。	。	記号-句点		
SpringBoot	SpringBoot	SpringBoot	名詞-一般		
の	ノ	の	助詞-連体化		
教材	キョウザイ	教材	名詞-一般		
は	ハ	は	助詞-係助詞		
3	サン	3	名詞-数		
章	ショウ	章	名詞-接尾-助数詞		
の	ノ	の	助詞-連体化		
SpringBoot	SpringBoot	SpringBoot	名詞-固有名詞-組織		
による	ニヨル	による	助詞-格助詞-連語		
Web	Web	Web	名詞-固有名詞-組織		
アプリ	アプリ	アプリ	名詞-一般		
開発	カイハツ	開発	名詞-サ変接続		
を	ヲ	を	助詞-格助詞-一般		
進め	ススメ	進める	動詞-自立	一段	連用形
て	テ	て	助詞-接続助詞		
いき	イキ	いく	動詞-非自立	五段・カ行促音便	連用形
、	、	、	記号-読点		
REST	REST	REST	名詞-固有名詞-組織		
Web	Web	Web	名詞-一般		
サービス	サービス	サービス	名詞-サ変接続		
の	ノ	の	助詞-連体化		
開発	カイハツ	開発	名詞-サ変接続		
について	ニツイテ	について	助詞-格助詞-連語		
学ん	マナン	学ぶ	動詞-自立	五段・バ行	連用タ接続
だ	ダ	だ	助動詞	特殊・タ	基本形
。	。	。	記号-句点

②janomeのコーディング例

形態素解析には、janomeもよく使用されるので、試してみます。こちらもコーディングは簡単ですね。

#janomeのインストール
!pip install janome

※textはなんでも好きな文章を入れてみてください。

from janome.tokenizer import Tokenizer
# Tokenizerインスタンスの生成 
tokenizer = Tokenizer()

text = "先週に引き続きJunitの課題とSpringBootの教材を進めた。"
text += "Junitの課題は新たに追加されたものを解いていった。"
text += "SpringBootの教材は3章のSpringBootによるWebアプリ開発を進めていき、REST Web サービスの開発について学んだ。"

# 形態素解析の実施
tokens = tokenizer.tokenize(text)

# 解析結果の出力:複数の結果が入っておりループ処理で順番に出す
for token in tokens:
  print(token) # 各単語の全情報

【実行結果】

先週	名詞,副詞可能,*,*,*,*,先週,センシュウ,センシュー
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
引き続き	動詞,自立,*,*,五段・カ行イ音便,連用形,引き続く,ヒキツヅキ,ヒキツズキ
Junit	名詞,一般,*,*,*,*,Junit,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
課題	名詞,一般,*,*,*,*,課題,カダイ,カダイ
と	助詞,並立助詞,*,*,*,*,と,ト,ト
SpringBoot	名詞,一般,*,*,*,*,SpringBoot,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
教材	名詞,一般,*,*,*,*,教材,キョウザイ,キョーザイ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
進め	動詞,自立,*,*,一段,連用形,進める,ススメ,ススメ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
Junit	名詞,一般,*,*,*,*,Junit,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
課題	名詞,一般,*,*,*,*,課題,カダイ,カダイ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
新た	名詞,形容動詞語幹,*,*,*,*,新た,アラタ,アラタ
に	助詞,副詞化,*,*,*,*,に,ニ,ニ
追加	名詞,サ変接続,*,*,*,*,追加,ツイカ,ツイカ
さ	動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ	動詞,接尾,*,*,一段,連用形,れる,レ,レ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
もの	名詞,非自立,一般,*,*,*,もの,モノ,モノ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
解い	動詞,自立,*,*,五段・カ行イ音便,連用タ接続,解く,トイ,トイ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いっ	動詞,非自立,*,*,五段・カ行促音便,連用タ接続,いく,イッ,イッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
SpringBoot	名詞,一般,*,*,*,*,SpringBoot,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
教材	名詞,一般,*,*,*,*,教材,キョウザイ,キョーザイ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
3	名詞,数,*,*,*,*,3,サン,サン
章	名詞,接尾,助数詞,*,*,*,章,ショウ,ショー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
SpringBoot	名詞,固有名詞,組織,*,*,*,SpringBoot,*,*
による	助詞,格助詞,連語,*,*,*,による,ニヨル,ニヨル
Web	名詞,固有名詞,組織,*,*,*,Web,*,*
アプリ	名詞,一般,*,*,*,*,アプリ,*,*
開発	名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
進め	動詞,自立,*,*,一段,連用形,進める,ススメ,ススメ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いき	動詞,非自立,*,*,五段・カ行促音便,連用形,いく,イキ,イキ
、	記号,読点,*,*,*,*,、,、,、
REST	名詞,固有名詞,組織,*,*,*,REST,*,*
 	記号,空白,*,*,*,*, ,*,*
Web	名詞,固有名詞,組織,*,*,*,Web,*,*
 	記号,空白,*,*,*,*, ,*,*
サービス	名詞,サ変接続,*,*,*,*,サービス,サービス,サービス
の	助詞,連体化,*,*,*,*,の,ノ,ノ
開発	名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
について	助詞,格助詞,連語,*,*,*,について,ニツイテ,ニツイテ
学ん	動詞,自立,*,*,五段・バ行,連用タ接続,学ぶ,マナン,マナン
だ	助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
。	記号,句点,*,*,*,*,。,。,。

(2)感情分析

自然言語処理を使用して、その文章が悲観的(negative)、楽観的(positive)か判定することができます。 文章を判定することで、その文章を書いた人の状態を自動的に知ることができるので、 社員の日報を分析するツールとかも発売されています。

>>> 営業支援・顧客管理&日報ツール feels

①BERTのコーディング例

感情分析の実習として、GoogleのBERTを試してみます。最近Google検索が賢くなっているとおもいませんか?実はGoogleは検索エンジンにBERTを使用するように変更しています。

改善事例① ■検索ワード:”parking on a hill with no curb”(縁石のない坂道に駐車)

■BERT導入前:それぞれの単語を個別に理解する従来のNLPでは、”curb” (縁石)の直前の”no”がどの単語にかかるのかを理解できないため、「縁石のあり/なし」に関係なく、「上り坂と下り坂の駐車方法の違い」を説明するページを上位表示させる。

■BERT導入後:まず”no”を”curb” (縁石)にかかる語として認識し、”no curb”(縁石のない)の意味を汲み取れます。その結果、「縁石のあり/なし」における駐車方法の違いを説明したページを上位表示させる。

【実習】

#必要なライブラリのインストール
!pip install jax
!pip install tensorflow
!pip install transformers
!pip install fugashi
!pip install ipadic

【例1】よくわからないけど、ポジティブらしい

from transformers import pipeline 
from transformers import AutoModelForSequenceClassification 
from transformers import BertJapaneseTokenizer 

TARGET_TEXT = "誰でもできる感情分析です。簡単であるので、気軽に試してみましょう。"

model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 

print(nlp(TARGET_TEXT))

【実行結果】

[{'label': 'ポジティブ', 'score': 0.9750074148178101}]

【例2】明らかにネガティブな文章

from transformers import pipeline 
from transformers import AutoModelForSequenceClassification 
from transformers import BertJapaneseTokenizer 

TARGET_TEXT = "あー今日は最悪の日だった。むかつく"

model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 

print(nlp(TARGET_TEXT))

【実行結果】

[{'label': 'ネガティブ', 'score': 0.9861066341400146}]

【例3】明らかにポジティブな文章

from transformers import pipeline 
from transformers import AutoModelForSequenceClassification 
from transformers import BertJapaneseTokenizer 

TARGET_TEXT = "明日も頑張ろう!"

model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 

print(nlp(TARGET_TEXT))

【実行結果】

[{'label': 'ポジティブ', 'score': 0.966618001461029}]

②ML-ASKのコーディング例

BERT以外にも感情分析のライブラリはあるので、紹介しておきます。 ただこのML-ASKはネガティブとポジティブを設定した辞書を用意する必要があり、辞書になければ何も判定はしてれません。

使い物にならないじゃんと思うかもしれませんが、BERTはいかんせんブラックボックスで何をしてるのかわからないので 自分で感情分析をコントロールしたい場合には、「辞書方式」もいいかもしれませんね。(個人の感想です^^;)

#必要なライブラリのインストール
!pip install pymlask
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
from mlask import MLAsk
emotion_analyzer = MLAsk()
emotion_analyzer.analyze('こんな朝にはただただ世界が好きでたまらないという気がしない?')

【結果】好きというポジティブな単語を見つけたので、ポジティブと判定している

{'activation': 'NEUTRAL',
 'emoticon': None,
 'emotion': defaultdict(list, {'suki': ['好き']}),
 'intensifier': {},
 'intension': 0,
 'orientation': 'POSITIVE',
 'representative': ('suki', ['好き']),
 'text': 'こんな朝にはただただ世界が好きでたまらないという気がしない?'}
emotion_analyzer.analyze('ああ、生きているってありがたいこと。家へ帰るってうれしいものね')

・辞書にない場合の例(テキストは実際の日報の例です)

from mlask import MLAsk
emotion_analyzer = MLAsk()
emotion_analyzer.analyze('全体会議 春の研修初のリモートワークでした。専門学校の授業も一時期リモートだったのですが、それとはまた違う雰囲気でした。初めてPythonを使ったり久しぶりにGitやherokuを触ったりしましたが、まだ理解できていません。Pythonについてはもう少し自分で調べて、自主的に勉強します。')
{'emotion': None,
 'text': '全体会議 春の研修初のリモートワークでした。専門学校の授業も一時期リモートだったのですが、それとはまた違う雰囲気でした。初めてPythonを使ったり久しぶりにGitやherokuを触ったりしましたが、まだ理解できていません。Pythonについてはもう少し自分で調べて、自主的に勉強します。'}

(3)単語の反対語 単語のベクトル化

単語をベクトル化(数値化)することで、

「王様」-「男」+「女」=「女王」

のようなことが実現できます。(実際はこんなに単純じゃないけど、、)

以下の例は参考書の例の実行結果をそのまま張ったので、荻野も理解できていないので、参考程度に眺めてもらえればと思います。

気になった方は、本屋さんで眺めてみてください。



単語の反対語(単語のベクトル化)の例

(4)AIの事例研究

コーディングにあきたら、以下のサイトでAIの事例で気になったものを見てください

AI事例1

AI事例2

AI事例3

良く小さい会社ではデータが手に入らないからAIなんか無理だって思っている人がいるかもしれませんが、 以下の例を見てください。素人さんが自分で画像を取ってシステム化した事例です。(荻野の大好きな動画です)

AIで創る未来 - 地方の人手不足を解決するために。あるクリーニング店の挑戦。

AIで創る未来 - 農業を次世代につなげるために。ある農家の挑戦。