レビューデータを分析してみたいです。
このような要望にお応えします。
今回は、感情分析を行いたいと思います。感情分析とは何でしょうか?
感情分析とは与えられた文章がポジティブな意見で構成されているのか、ネガティブな意見なのかを一連の単語から判断し、分類することを目指します。
感情分析は、自社製品、サービスに対する多様な意見を定量化することに役に立ちます。ユーザーはTwitter, Facebook, Instagram等のSNSで自身が持つ肯定、否定の考えを主張し、Amazonにレビューを書き残したり、ポジティブな感情とネガティブな感情の両方を表現していますよね。このような多様な意見を感情値という形で定量化させることで、ユーザエクスペリエンスの向上、ユーザーへの適切な情報推薦、品質改善に役立てることができます。
それでは、感情分析を行いたいと思います。
今回は、感情分析の効率的な実施を支援してくれるPythonで利用可能なhuggingfaceのbert-base-japanese-sentimentを利用したいと思います。
- https://huggingface.co/daigo/bert-base-japanese-sentiment
自然言語技法BERTについて、さらっと触れておきます。
“Bidirectional Encoder Representations from Transformers(BERT)は、Googleが開発した自然言語処理(NLP)の事前学習のための技術である。BERTはGoogleのJacob Devlin氏らによって2018年に作成され、公開された。GoogleはBERTを活用してユーザー検索の理解を深めている。”
(wikipediaより抜粋。https://en.wikipedia.org/wiki/BERT_(language_model))
今回、レビューデータは、書籍コンテンツの口コミを利用します。実行環境としてGoogle Colaboratoryを使用しました。
感情分析で使用する辞書の準備をします。
以下のコマンドを実行することで感情分析で使用するツールをインストールできます。
1 2 3 4 5 6 7 8 9 10 11 |
!apt install mecab libmecab-dev mecab-ipadic-utf8 !pip install mecab-python3 !apt install git make curl xz-utils file !git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git !echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a !ln -s /etc/mecabrc /usr/local/etc/mecabrc !pip install -q transformers !pip install fugashi !pip install ipadic |
以下のプログラムを実行することで、感情分析用のモデルを読み込むことができます。
1 2 3 4 5 6 7 |
from transformers import AutoTokenizer, AutoModelForSequenceClassification from transformers import pipeline tokenizer = AutoTokenizer.from_pretrained("daigo/bert-base-japanese-sentiment") model = AutoModelForSequenceClassification.from_pretrained("daigo/bert-base-japanese-sentiment") |
以下のプログラムを実行することで、感情分析を実施したいテキストデータを入力し、入力データに対して感情分析された結果を取得することができます。
入力データの形式は、以下を想定しています。
1 2 3 4 5 6 |
review_text.txt この度この本を読み、全てが繋がり、娘に悪いことをしたと涙が止まりませんでした。 本を通して娘の考えてることを知ることができました。 とても読んでいて心が癒される本でした。 「こういう行動をすると心が元気になるよ」というリストなのですが、これを参考に行動してみると、深く感動や癒しを得ることができました。 それが!これだ!これだから生きにくかったんだ、と納得。 |
感情分析を実行するプログラムは、以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
filename = input('file path input->') with open(filename) as f: sentence = f.readlines() #print(doc) sentiment_analyzer = pipeline("sentiment-analysis",model="daigo/bert-base-japanese-sentiment",tokenizer="daigo/bert-base-japanese-sentiment") result = list(map(sentiment_analyzer, sentence)) for i, res in enumerate(result): print(sentence[i], result[i]) |
出力結果は、以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
この度この本を読み、全てが繋がり、娘に悪いことをしたと涙が止まりませんでした。 [{'label': 'ネガティブ', 'score': 0.5224444270133972}] 本を通して娘の考えてることを知ることができました。 [{'label': 'ポジティブ', 'score': 0.9795524477958679}] とても読んでいて心が癒される本でした。 [{'label': 'ポジティブ', 'score': 0.9871211647987366}] 「こういう行動をすると心が元気になるよ」というリストなのですが、これを参考に行動してみると、深く感動や癒しを得ることができました。 [{'label': 'ポジティブ', 'score': 0.9553195834159851}] それが!これだ!これだから生きにくかったんだ、と納得。 [{'label': 'ポジティブ', 'score': 0.9380703568458557}] 成功者が書いた本やサイトでは、いつも最後に「どうしたら内向的なあなたも成功するのか」という章があって、「ああ、違う、違う、そうじゃない……」と思っていました。 [{'label': 'ポジティブ', 'score': 0.910343587398529}] だが、それは「敏感」が長く生きているうちに「鈍感」になったという訳でもないのである。 [{'label': 'ネガティブ', 'score': 0.6500207781791687}] 小学校の頃の私を知る人物が今の私を見れば、別人と思うかも知れない。 [{'label': 'ネガティブ', 'score': 0.654662549495697}] 自分の特徴について、ずっと悩んでいました。 [{'label': 'ネガティブ', 'score': 0.5338465571403503}] 自分の特徴を自分自身が受け入れられるようになれたらいいと思います。 [{'label': 'ポジティブ', 'score': 0.9839758276939392}] 神経質、考えすぎ、内気など、他の人と何か違うと思っていたのはこのせいだったのか。 [{'label': 'ネガティブ', 'score': 0.8859879374504089}] これでいいんだ、私はおかしい訳じゃなかった、と納得出来るようになりました。 [{'label': 'ポジティブ', 'score': 0.9664826989173889}] 繊細な人は、この本を読んだら 少し生きやすくなると思います。 [{'label': 'ポジティブ', 'score': 0.9839603900909424}] 具体的な対処方法やアイデアリストも参考になります。 [{'label': 'ポジティブ', 'score': 0.9579178094863892}] 今まで自然にやってきたことも多いですが、これが自分にとってよい方法なんだとエビデンスになります。 [{'label': 'ポジティブ', 'score': 0.9793903827667236}] 外部の刺激に敏感ですぐに疲れてしまう自分を今まで受け入れられずにいて辛いと感じていました。 [{'label': 'ネガティブ', 'score': 0.8108993172645569}] 期待していましたが、あまり共感できませんでした。 [{'label': 'ネガティブ', 'score': 0.8469751477241516}] その性質はすぐに評価されない事が多いかもしれない。 [{'label': 'ネガティブ', 'score': 0.8064734935760498}] 「他の人は、こんな事もわからないのか?」と。 [{'label': 'ネガティブ', 'score': 0.5174255967140198}] |
各レビュー毎のポジティブ、ネガティブの度合いが出力されています。多様な意見を感情値という形で定量化させることができそうですね。
下記を参考にさせていただきました。
- https://qiita.com/toshiyuki_tsutsui/items/604f92dbe6e20a18a17e
- https://huggingface.co/daigo/bert-base-japanese-sentiment
- https://github.com/ydaigo/BERT_HANDSON/blob/master/BERT_HANDS_ON.ipynb