
ThoughtSpotとSnowflakeで感情分析を行う
AkimasaKajitaniです。今回はThoughtSpotとSnowflakeの合せ技をご紹介します。こちらは「Mastering Sentiment Analysis with ThoughtSpot 」というYouTubeで公開されているビデオからのご紹介となります。
ThoughtSpotで感情分析を行う場合は、Analyst Studioを使ってPython上で行うこともできますが、今回は別のアプローチを取りたいと思います。
DWHの関数をそのまま使えるThoughtSpotのパススルー関数
ThoughtSpotではデータウェアハウス側の関数をそのまま使えるパススルー関数が用意されています。これを使えばデータウェアハウス側がSQL関数で準備している機能をそのまま使うことができます。以前の記事「【ThoughtSpotTips】similar_to関数とsimilarity関数の違いについて」でもsimilarity関数の機能を実現するためにこの機能を使いました。
SnowflakeのSENTIMENT関数
ところで、Snowflakeには感情分析を行うために、SENTIMENT関数が用意されています。構文は以下の通りで非常に簡単です。
SNOWFLAKE.CORTEX.SENTIMENT(<text>)
この関数を使うと、戻り値が-1から1の間の浮動小数点の数値で感情スコアが得られます。
しかしながら、ドキュメントによると「指定された英語の入力テキストに対する感情スコアを返します。」とあります。なるほど、英語なのね・・・。
しかし、ここで諦めてはいけません。
SnowflakeのTRANSLATE関数
なんと、Snowflakeには翻訳するための関数「TRANSLATE」が準備されています。
構文は以下のとおりです。
SNOWFLAKE.CORTEX.TRANSLATE(<text>, <source_language>, <target_language>)
言語指定は英語ならen、日本語ならjaです。
ThoughtSpotのパススルー関数で実装してみる
順序立ててやってみましょう。まず日本語の文章を英語に翻訳するところからスタートします。
翻訳する
TRANSLATE関数で翻訳すると、もちろん得られるのは文字列です。つまり、返り値は文字列型なので、sql_string_op関数を使います。この関数は以下のような書式です。
sql_string_op("SQL関数名({0})", 外部関数に渡す値)
実際に使ってみた方がわかりやすいので実例で紹介します。
今回であれば、Sentenceという項目をSnowflakeの関数で翻訳したいので、Snowflake上で表現するなら以下のようになります(SQLの全体は省いています)。
SNOWFLAKE.CORTEX.TRANSLATE(Sentence,'ja','en')
ThoughtSpotのパススルー関数上では、このSentenceという部分は{0}と記載してパススルー関数の2つ目の引数に指定する必要があります。つまり、ThoughtSpot上では以下のようになります。
sql_string_op("SNOWFLAKE.CORTEX.TRANSLATE({0},'ja','en')",Sentence)
これを「英文」という項目名をつけて保存しましょう。
感情分析を行う
次に、先程の「英文」という項目を使って感情スコアを得てみましょう。
今回は戻り値が浮動小数点型なので、sql_double_opというパススルー関数を使います。使い方は先程のsql_string_opと同じです。
sql_double_op("SQL関数名({0})", 外部関数に渡す値)
これもSnowflakeの関数を使うと以下のようになります。
sql_double_op ("SNOWFLAKE.CORTEX.SENTIMENT({0})",英文)
これを「感情スコア」という名称で項目として保存します。
実は、以下のように2つの関数を入れ子にして書くこともできます。
sql_double_op ("SNOWFLAKE.CORTEX.SENTIMENT(SNOWFLAKE.CORTEX.TRANSLATE({0},'ja','en'))",英文)
これを使ったライブボードを作ってみました
今回使用したデータはTIS株式会社さんが無償で公開している「chABSA-dataset」です。これは、上場企業の有価証券報告書(2016年度)をベースに作成されたデータセットです。ライセンスとしてはCreative Commons Attribution 4.0 License で公開されています。
データはJSON形式で公開されているので、Alteryxを用いて加工してからSnowflakeに投入しています。Alteryxでは以下のように簡易的なデータ加工を行っています。
これにより以下のようなライブボードを作成してみました。
左下の部分にレポートの本文に対して感情スコアを散布図で表示するようにしています。0.7を超えれば緑色、-0.7を超えれば赤色になるように設定しています。
確かに、感情スコアが0.76の文章は肯定的ですね。順調に売上が伸びた、というのがしっかりプラスの感情として認識されています。
一方で、感情スコアが-0.37の文章は売上減少というのが否定的としてちゃんと判断されています。
まとめ
今回、SnowflakeのSENTIMENT関数を直接ThoughtSpotから呼び出し、感情分析を行いました。ライブボードに組み込むことで文章が否定的なのか肯定的なのかぱっとすぐわかるので、注目すべきポイントが一目でわかるのが非常に便利ですね。
参考にしたビデオの中ではSpotterと組み合わせて自然言語で色々としていたので、Spotterと組み合わせて使うのも面白そうです(なにかいいシナリオを思いついたらまたご紹介いたします)。
こういう機械学習チックな機能の組み込みをDWHで行うのか、ETL時に行うのか、BIで行うのか、判断は難しいところですが、さくっと実装してみて有用かどうかの検証目的であればBI側でやるのはアリかな、と思います。
参照ドキュメント
※ThoughtSpot バージョン 10.9.0.cl-65時点の情報です(2025/06/09)