今回は自然言語について学びます。
空白で単語が区切られている英語等と違い、日本語の文章は区切りがありません。そのため文章を 単語に区切る必要があります。その技術を形態素解析といいます。代表的な形態素解析の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,*,*
記号,空白,*,*,*,*, ,*,*
サービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービス
の 助詞,連体化,*,*,*,*,の,ノ,ノ
開発 名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
について 助詞,格助詞,連語,*,*,*,について,ニツイテ,ニツイテ
学ん 動詞,自立,*,*,五段・バ行,連用タ接続,学ぶ,マナン,マナン
だ 助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
。 記号,句点,*,*,*,*,。,。,。
自然言語処理を使用して、その文章が悲観的(negative)、楽観的(positive)か判定することができます。 文章を判定することで、その文章を書いた人の状態を自動的に知ることができるので、 社員の日報を分析するツールとかも発売されています。
①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についてはもう少し自分で調べて、自主的に勉強します。'}
単語をベクトル化(数値化)することで、
「王様」-「男」+「女」=「女王」
のようなことが実現できます。(実際はこんなに単純じゃないけど、、)
以下の例は参考書の例の実行結果をそのまま張ったので、荻野も理解できていないので、参考程度に眺めてもらえればと思います。
気になった方は、本屋さんで眺めてみてください。
コーディングにあきたら、以下のサイトでAIの事例で気になったものを見てください
良く小さい会社ではデータが手に入らないからAIなんか無理だって思っている人がいるかもしれませんが、 以下の例を見てください。素人さんが自分で画像を取ってシステム化した事例です。(荻野の大好きな動画です)