Alteryxで感情分析をやってみた #Alteryx

はじめに

どうも。DI部@大阪オフィスのtamaです。

Alteryxの情報収集をしていたところ、簡単にテキストの感情分析できるツールが開発されていたことを発見したので、ちょっと使ってみました。

Score Sentimentについて

The Information Lab社のBen Moss氏が作成されたAnalytics Appです。指定したファイルのテキストを解析して、各感情に関するスコアリングを行ってくれます。

とりあえず使ってみた

このツールはどういった仕組みで感情分析するものなのか…というのは後で見るとして、まずは使ってみます。

環境

  • Windows 10 Pro(Mac上のVM ware)
  • Alteryx Designer 2019.1

事前準備

  • Alteryx Predictive Toolsをインストールしておく
  • R言語のsyuzhetパッケージをインストールしておく

Rのパッケージのインストール方法は色々ありますが、私はAlteryxインストールディレクトリ配下にあるRディレクトリのR.exeを直接起動して、直接インストールコマンドを叩きました。

使用するデータ

Twitter上の「#AAPL」や「@apple」が含まれたツイートのデータです。ツイート以外にも色々な項目が含まれていますが、今回はツイートのテキスト以外は使いません。

Analytics Appとして実行

上記のAlteryx Galleryからツールをダウンロードします。Alteryxパッケージの形式になっているので、ダウンロードしたファイルをダブルクリックしてインポートします。

まずはAnalytics Appとして実行してみましょう。画面右上の魔法ステッキみたいなアイコンを選択します。

Appを使用するためのダイアログが出てきました。

基本的には、分析したいファイルとカラム、後は結果を出力するファイルの名称を指定して実行するだけです。デフォルトでは.yxdb形式で出力されます。

というわけで、上記のAppleに関するツイートデータを読み込みます。このデータのツイート本文を感情分析するので、指定するカラムはtextです。

出力ファイル名は適当につけて、実行!結果が出てきます。

結果を確認

.yxdbファイルをその場で確認してみます。

textが先程指定した分析対象カラムです。そして、それより右に付与されている列が、感情分析の結果(スコア)となります。それぞれどういう意味なのかは、後で見ます。

どういう処理が行われているのか

テキストの感情分析が手軽に実行できたので、次はこのツール(ワークフロー)の中身を見てみます。

実体はR言語による処理

色々な処理を行っているワークフローではありますが、このワークフローのキモは真ん中のRツールです。感情分析自体は、R言語で行われています。R言語でどういった処理が行われているのか、簡単に見ていきましょう。

syuzhetパッケージ

library(syuzhet)

最初にsyuzhetパッケージをロードしています。何を隠そう、このsyuzhetというパッケージで感情分析を行っています。

syuzhetは、テキストから感情を算出するためのRパッケージです。簡単に言うと、「この単語の感情はxxである」ということが、単語毎に設定されている「辞書」があり、それを使用して文章全体の感情を決める、というような感じです。詳細は以下をどうぞ。

データの読み込み〜変換

tab <-read.Alteryx(“#1″, mode=”data.frame”)
tab$text <- as.character(tab$text)

read.Alteryx関数で、Rツールに接続されているデータを、データフレーム形式でtabに格納しています。また、syuzhetは、対象データの形式を文字列ベクトルにする必要があるため、変換を行っています。

感情スコアを算出

tab$afinn = get_sentiment(tab$text, method=”afinn”)
tab$bing = get_sentiment(tab$text, method=”bing”)
tab$nrc = get_sentiment(tab$text, method=”nrc”)
tab$syuzhet = get_sentiment(tab$text, method=”syuzhet”)

write.Alteryx(tab,1)

テキストデータの読み込みと変換が無事完了したところで、get_sentiment関数を使用して、感情スコアを算出します。syuzhetパッケージは4つの感情辞書(syuzhet, afinn, bing, nrc)を使用することができますが、このワークフローでは、4つ全てを算出しています。

  • syuzhetは、ネブラスカ文学研究所のMatthew L.Jockers氏の指導のもとに開発された辞書です。
  • afinnは、Finn Arup Nielsen氏が、「AFINN WORD DATABASE」として開発した辞書です。
  • bingは、Minqing Hu氏とBing Liu氏が、「OPINION LEXICON」として開発した辞書です。
  • nrcは、Mohammad,Saif M氏とTurney,Peter D氏が、「NRC EMOTION LEXICON」として開発した辞書です。

それぞれ算出した感情スコアを、write.Alteryx関数で、Rツールの出力アンカー1に出力します。

ただし、このRツール以降に配置されているSelectツールで、syuzhet以外は省かれています。もし、他の結果を使用したい場合は、選択ツールの設定を変更しましょう。

get_nrc_sentiment

上記とは別に、get_nrc_sentimentを使用した感情スコアも算出しています。

emotions <- get_nrc_sentiment(tab$text)

get_nrc_sentimentは、Saif Mohammad氏のNRC Emotion辞書を使用します。Mohammad氏によれば、「NRCの感情辞書は、単語とそれらの8つの感情(怒り、恐れ、期待、信頼、驚き、悲しみ、喜び、嫌悪)と2つの感情(負と正)との関連リストである」とのこと。各カラムに、それぞれの感情のタイプについての感情価が含まれています。

これらの値もwrite.Alteryx関数で出力アンカー2に出されています。

その他

このワークフローは、読み込んだ元データのカラムもそのまま残してくれます。そのためにRツール以前で一意のIDを付与した上でテキスト本体と分離し、Rツール以降で元データと感情スコアをジョインして、元々のデータ+感情スコアという形で最終出力されるようになっています。

Analytics Appである以上、中身をいじることもできる

このツール(ワークフロー)は、デフォルトでは.yxdbとして出力されますが、もちろんワークフローをいじることができるので、出力形式を変更することができます。

例えば、出力をhyperにして、Tableauで可視化するなんてこともできますね(今回のエントリ中ではやりません…)。

感情分析は結果の解釈が難しい(と個人的に感じた)

AlteryxとこのAnalytics Appがあれば、非常に簡単に感情分析を行うことができます。しかし、この算出したスコアを解釈するのは、一筋縄では行かないのではないか、と私は感じております。

上記は、著者とガールフレンドがWhatAppメッセンジャーでやり取りしたテキストを感情分析した、という内容の記事です。

感情分析を実施したところ「自分は彼女より”嫌悪”や”怒り”という感情が多く出ているという結果が出ました。 では、この著者は彼女に対して、たくさんのネガティブな言葉を言っているのかといえば、そうではありません。

例えば「damn(ちくしょう的な意味)」が多く使われていれば、スコア上は「嫌悪」の度合いが強まるかもしれませんが、著者曰く、「今日自分のPCが壊れちまったぜちくしょう!」みたいな会話をしているだけであって、本当に嫌悪感を相手にぶつけているわけではありません。

また、スコア上は相対的に彼女は明るい文章を書いている結果となっています。これは「ceremony(式典)」や「engagement(婚約)」といった言葉が使われてるため、そのような結果になっていますが、実は、職場の人間の会話が結婚の話ばかりで辟易している…というのが本当の背景でした。

前述したように、これらの感情分析は、感情辞書をもとに、各単語毎に感情のポジネガを出して、それらを計算しているに過ぎません。その単語の本当の背景を、数値だけで判断することはできません。ですので、感情分析を実際のビジネス(自社商品のレビューの分析など)に活かすためには、感情辞書の理解や、そのテキストが発生した背景まで読み取る必要があり、かなり腰を入れた分析プロジェクトを回す必要があると思います。

おわりに

…とまあ、小難しいことを書きましたが、このAnalytics Appを使えばすごく簡単に感情分析できるので、ぜひお試し下さい。