https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sentiment-analysis-for-customer-experience-with-python-and-streamlit/sentiment-analysis_streamlit_1200x600.png

PythonとStreamlitによる顧客体験のためのセンチメント分析

最終更新日 April 19, 2021

所要時間:6 分

VonageメッセージングAPIを活用して、Facebookなどのソーシャルメディア・プラットフォームからのレビュー・フィードバックの照合など、顧客サービスの改善に着手してください。

センチメント分析は、自然言語処理技術を用いて顧客からのフィードバックから洞察を掘り起こし、フィードバックデータが肯定的か、否定的か、中立的かを判断します。ビジネスはセンチメント分析を活用して、製品やブランドのセンチメントをモニターし、顧客のニーズを理解します。

このチュートリアルでは、以下の項目について説明します:

  • VonageのMessages APIサンドボックスを初期化する。

  • フェイスブックを通じて顧客からデータを収集

  • Facebookで顧客からのフィードバックを処理するボットを作成する:

    • このデータをデータベースまたはテキストファイルに保存する。

    • 適切な回答を顧客に返す

  • Streamlitでダッシュボードを作成し、顧客の声をリアルタイムで把握する。

  • 肯定的、否定的、中立的な尺度で顧客の感情を測定する。

  • 可視化により顧客の主要なペインポイントを分析

前提条件

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

Facebookボットの作成

Messages API Sandboxは、企業がWhatsApp、Facebook、Viberなどの様々なソーシャルチャンネルを通じてメッセージを送受信することを可能にする。また、このAPIを通してSMSやMMSを送信することもできます。外部ソーシャルチャネルを通じてメッセージを送信するには、各プロバイダのビジネスアカウントが必要で、Vonage APIアカウントに接続されている必要があります。

このチュートリアルではFacebookを使用するので、テスト用のFacebookアカウントを用意してください。

アプリケーションの作成を開始するには、プロジェクトのディレクトリで以下のコマンドを実行してnodeプロジェクトを初期化し、必要なサードパーティ・ライブラリをインストールします:

npm init -y npm install express body-parser nedb @vonage/server-sdk@beta dotenv

上記のコマンドは package.json, package.lockファイルと node_modulesディレクトリが作成されます。ファイルの中には package.jsonファイル内には、先ほどインストールしたライブラリ expressそして vonage/server-sdk.以下に例を示します:

{
  "name": "facebook-bot",
  "version": "1.0.0",
  "description": "Sign up for a Vonage API account at ${CUSTOMER_DASHBOARD_URL}.",
  "main": "index.js",
  "scripts": {
    "serve": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@vonage/server-sdk": "^2.10.7-beta",
    "body-parser": "^1.19.0",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "nedb": "^1.8.0"
  },
  "devDependencies": {}
}

Facebookからメッセージが届くと、Vonageは事前に設定されたWebhook URLにHTTPリクエストを送信します。あなたのNodeアプリケーションは、それを受信するためにインターネットにアクセスできる必要があります。 Ngrok.

ターミナルで以下のコマンドを実行し、ポートで Ngrok を起動します。 3000(転送 URL は ngrok が再起動するたびに変わるので、ngrok を再起動する場合はその点に注意してください):

npx ngrok http 3000

次に、アプリケーションを ダッシュボード.アプリケーションの目的に関連した名前を追加してください。 Messagesをオンにします。このアプリケーションはMessages APIを使用する必要があります。そして "Generate public and private key "ボタンをクリックします。これでブラウザが private.keyファイルをダウンロードします。このファイルをプロジェクトのルート・ディレクトリに置いてください。最後に Generate new applicationボタンをクリックすると、アプリケーションの表示ページにリダイレクトされます。ページに表示されている Application IDをコピーしておいてください。

このページにいる間に、WebhookのURLを定義する必要があります。WebhookはAPIの拡張ですが、あなたのコードがAPIプラットフォームからデータを要求する代わりに、Vonageがあなたにデータを送信します。データはアプリケーションへのウェブリクエストとして届きますが、それはMessaging APIへの非同期リクエストのような、以前のAPI呼び出しの結果かもしれません(このタイプのウェブフックは "コールバック "とも呼ばれます)。Webhookはまた、受信メッセージをファイルに保存したり、アプリに送信メッセージを送信するなどのイベントをアプリケーションに通知するためにも使用されます。

URLは ダッシュボードを更新する必要があります。 <ngrok URL>に置き換えてください):

  • インバウンド・ウェブフック http://<ngrok URL>/webhooks/inbound

  • ステータスウェブフック http://<ngrok URL>/webhooks/status

に戻る。 メッセージサンドボックスに戻り、FacebookアカウントをFacebook Messenger Sandboxにホワイトリスト登録します。をクリックし Add to sandboxをクリックし、ページに表示される指示に従ってください。

認証情報を .envファイルに保存する。 index.js.

VONAGE_API_KEY=### VONAGE_API_SECRET=### VONAGE_APPLICATION_ID=e0c5d5d8-###

次に index.jsファイルに、express や Vonage server-sdk など、以前にインストールしたモジュールを以下の例のように含めます:

const app = require('express')()
const bodyParser = require('body-parser')
const nedb = require('nedb')
const Vonage = require('@vonage/server-sdk')

次に、ファイル名 messages.db次の行を index.jsファイルに追加します:

const messages = new nedb({ filename: 'messages.db', autoload: true })

ここで、APIキー、APIシークレット、アプリケーションID、private.keyのパスとファイル名で構成される認証情報で、新しいVonageオブジェクトを初期化する必要がある。また、APIのホストURLをサンドボックスURLを指すように設定する必要がある。あなたの index.jsファイルに以下のコードを追加する:

const vonage = new Vonage({
  apiKey: process.env.VONAGE_API_KEY,
  apiSecret: process.env.VONAGE_API_SECRET,
  applicationId: process.env.VONAGE_APPLICATION_ID,
  privateKey: './private.key'
}, {
  apiHost: 'https://messages-sandbox.nexmo.com'
})

という関数を作成します。 sendMessageという関数を作成します。下の例で示す関数の中には tofromがあり、これはAPIへの指示になります。は to(または受信者)は、ホワイトリストに登録されたFacebookアカウントである必要があります。以下の関数を index.jsファイルに追加してください:

function sendMessage(sender, recipient, text) {
  const to = { type: 'messenger', id: recipient }
  const from = { type: 'messenger', id: sender }
  const message = { content: { type: 'text', text: text } }
 
  vonage.channel.send(to, from, message, function(error, result) {
    if(error) { return console.error(error) }
    console.log(result)
  })
}

上の例では vonage.channel.sendというパラメータでメッセージを送信しています。 to, fromとメッセージを送信し、エラーが発生した場合はこのエラーを返し、エラーメッセージをログに記録します。

次に、アプリケーションにウェブフックを追加して、URLのパス /webhooks/inboundをリッスンするために、アプリケーションにウェブフックを追加する必要がある。これは、本文から送信者のメッセンジャーIDを解析して取得し、また、タイムスタンプと一緒に送信されたテキストを取得し、エラーif-elseのいずれかの条件が与えられた応答メッセージに挿入すると、ユーザーのフィードバックを正常に理解することができます。

エラーが発生した場合、送信者に送り返されるメッセージは「Sorry!もう一度お願いします。一方、メッセンジャーが顧客からのメッセージを取得してアプリに送信した場合、そのメッセージは messages.dbに保存され、"Thanks for your feedback and review!"というレスポンスがユーザーに返されます。そこで、以下を index.jsファイルに追加します:

app.post('/inbound', function(request, response) {
  if (request.body.message.content.text.toLowerCase().trim() === 'recap') {
    messages.find({'from.id': request.body.from.id }, function (error, records) {
      if (error) { return console.error(error) }
      const message = records.map(function(record) {
        return record.message.content.text + ' (sent at ' + record.timestamp + ')'
      }).join('\n\n')
      sendMessage(request.body.to.id, request.body.from.id, message)
    })
  } else {
    messages.insert(request.body, function (error, record) {
      if (error) {
        sendMessage(request.body.to.id, request.body.from.id, 'Sorry! Could you repeat?')
        return console.error(error)
      }
      sendMessage(request.body.to.id, request.body.from.id, 'Thanks for your feedback and review!')
    })
  }
 
  response.send('ok')
})

最後に、"ok "というメッセージを返す /webhooks/statusを追加する必要がある。また、リスナー機能も追加する必要がある。これは、アプリケーションを実行し続け、ポート 3000.そこで index.jsファイルの一番下に以下を追加します:

app.post('/status', function(request, response) {
  console.log(request.body)
  response.send('ok')
})
app.listen(3000)

さあ、アプリケーションをテストしましょう!まず、ウェブ・アプリケーションを実行する必要があります。ターミナルで次のコマンドを実行してください:

node index.js

では Facebookメッセンジャーにアクセスし、Vonage Sandboxユーザーを見つけてメッセージを送信します。Messengerに返信が届きます。

ユーザーのフィードバックを分析する

Vonage sandboxを通した顧客のFacebookからのデータは、以下のファイルに保存される。 messages.dbファイルに保存される。シミュレートされたデモンストレーションでは、ユーザーがオーダーメイドの会社の製品とサービスを批評し、データのサンプルが以下のスクリプト例に記録されています。

{"message_uuid":"e6e659be-3cdb-464f-96ef-8597cb307586","from":{"type":"messenger","id":"3819505444810553"},"to":{"type":"messenger","id":"107083064136738"},"message":{"content":{"type":"text","text":"how terrible can this product be, does not solve my pain point"}},"timestamp":"2021-03-15T08:43:30.993Z","_id":"6TdDhlo8CVxEr7tq"}
{"message_uuid":"7775fa83-f073-481c-8866-c60bca28ec97","from":{"type":"messenger","id":"3819505444810553"},"to":{"type":"messenger","id":"107083064136738"},"message":{"content":{"type":"text","text":"how can there be no response for so long on such bad service"}},"timestamp":"2021-03-15T08:44:37.924Z","_id":"GSVzREWsYllKHOlJ"}

それぞれの message_uuidはFacebookボットに送信されるメッセージごとに一意であることがわかる。この fromtoはそれぞれ顧客とボットのIDを指定する。メッセージには、テキストタイプのコンテンツが含まれており、顧客によって提供されたフィードバックが含まれている。このフィードバックを分析するために、TextBlob, WordCloud, Matplotlib, Pandasなどのライブラリを用いて、python Streamlitフレームワークで可視化する。という新しいファイルを作成し dashboard.pyという新しいファイルを作成し、この新しいファイルに以下のコードを追加する:

import streamlit as st
from textblob import TextBlob
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
import pandas as pd
st.set_option('deprecation.showPyplotGlobalUse', False)

ストリームリットは機械学習とデータサイエンスチームのためのオープンソースのアプリフレームワークです。 TextBlobはテキストデータを処理するためのPythonライブラリです。一般的な自然言語処理(NLP)タスクに飛び込むためのシンプルなAPIを提供する。WordCloudは、与えられたテキストの中で最も頻度の高い単語を表示する技術です。 Matplotlibは、Pythonで静的、アニメーション、インタラクティブなビジュアライゼーションを作成するための包括的なライブラリです。 Pandasは、Pythonプログラミング言語上に構築された、高速、強力、柔軟かつ使いやすいオープンソースのデータ分析・操作ツールです。

これらのツールを使って、まず、messages.db に格納されているデータを開き、すべてのユーザーから収集したフィードバックのすべてのレコードを読み込んで処理する。メッセージ/コンテンツを探し、タイムスタンプを削除する。なぜなら、それはフィードバックのセンチメントの分析には必要ないからである。処理されたフィードバックはリストに格納される。

以下の例は、上記の指示を実行するものです。あなたの dashboard.pyファイルの一番下に追加してください:

file1 = open('messages.db', 'r')
Lines = file1.readlines()
feedback_list = list()
for line in Lines:
   feedback = line.split(":")[11]
   feedback = feedback.replace('}},"timestamp"',"")
   feedback_list.append(feedback)

次に、ユーザーからフィードバックされた単語の頻度を可視化するために、ワードクラウドを作成する。ひどい」、「長い」、「悪い」など、特定のキーワードが非常に目立つことがわかる。ワードクラウドは、各単語が顧客から提供されたフィードバックのすべての文章に何回登場したかをカウントするだけです。より良い方法は、顧客の全体的な感情を分析することだろう。

TextBlobの基本的なセンチメント極性分析を使用すると、テキストフィードバックから顧客の感情的な経験を比較的信頼性の高い推定値で推定し、センチメント値の新しいリストに格納することができます。次に dashboard.pyに次のコードを追加します:

sentiment_values = list()
for feedback in feedback_list:
    sentiment_feedback = TextBlob(feedback).sentiment.polarity
    sentiment_values.append(sentiment_feedback)

次に、-1 から 1 の範囲で全体的なセンチメントを表示します。センチメントの極性が0以上の場合、出力は緑色になり、不幸を意味する負の値の場合、センチメントはウェブページ上で赤色で表示されます。以下を dashboard.pyファイルにコピーしてください:

st.title("Overall Sentiment")
if average_sentiment > 0:
   colors = 'green'
else:
   colors = 'red'

現在、全体的なセンチメントは-0.417であり、全体的に多くのフィードバックが当社の製品やサービスを支持していないことを示唆している。各フィードバックセンチメントを表にして、フィードバックを見ることができます。0値の感情はほとんどない。これは、このフィードバックが中立であり、メッセージの否定的な意味合いを理解できないことを意味する。この製品にはかなわない... "や "この製品はタダでもらえる場合しか使わない "は否定的な感情を示唆しているにもかかわらず、結果は中立か肯定的であることがわかる。したがって、このユースケースのセンチメント分析には、より複雑な学習・訓練モデルを開発することができます。さらに、全体的なセンチメント分析は、単純な平均ではなく、より複雑な計算や加重平均になる可能性があります。

Streamlit ウェブダッシュボードアプリは、以下のコマンドで初期化することで起動できます。ウェブダッシュボードをセットアップするには、Streamli がインストールされている必要があります。flask や Django を使った他のデプロイ方法も同様に動作するので、検討してみてください。

streamlit run dashboard.py

最後に、このチュートリアルでは、Vonage Messages APIをセットアップしてFacebookに接続し、顧客からのフィードバックを収集する方法を紹介しました。

シェア:

https://a.storyblok.com/f/270183/312x306/c035eb1226/solomon-soh.png
Solomon Soh

Solomon Soh is a Alteryx and Alibaba Cloud Certified practitioner who focus on developing AI solutions for ad-tech, fintech, and operational business problems.