オウム返しWebチャットボットにQ&Aコミュニケーション機能を追加する
はじめに
この記事は前回の続きです
https://qiita.com/abemaki/items/cd0bfa99cc2fab4660f5
前回作成した単純オウム返しのWebチャットボットに簡単なQ&Aコミュニケーション機能を追加します
Q&Aコミュニケーションのナレッジベースはエクセルで管理します。
全文検索を用いたマッチ度で質問を判定して、回答を返します。
使用するライブラリ と 導入手順
Sheets.js
エクセルを読みこんで利用するライブラリ
https://www.npmjs.com/package/xlsx
Elasticlunr.js
ブラウザ検索およびオフライン検索用のJavascriptの軽量全文検索エンジン。
http://elasticlunr.com/
導入方法は記事と同様
https://qiita.com/abemaki/items/2f1d5ec7e09ce7371431
エクセル読み込みライブラリ と 全文検索ライブラリ
でQ&Aコミュニケーションボットを実現するためのイメージ図
ソースコード一式 と サンプル画面 と 解説
ソースコード一式
https://github.com/makiabe/easyqnawebbot
サンプル画面
https://ponkotsueasychatbot.herokuapp.com/
解説
knowledgeBaseフォルダ
QANDA.xlsx
Q&Aやコミュニケーションのためのナレッジを保持しています。
登録しているデータは以下の通り。
Question | Answer |
---|---|
こんにちは | こんにちは。 お元気ですか? |
おはよう | 今起きたのですね。 おはようございます。 |
お腹がすいた | 僕もお腹がすきました |
寒いね | 寒いんですか! 風邪ひかないようにしてください。 |
暑いね | 暑いんですか? 僕はロボなので暑さは感じません。 |
おやすみなさい | もう寝るんですか? おやすみなさい。 |
2020年の流行語大賞は? | 2020年の流行語大賞は以下のようになっています。 ■年間大賞 3密(小池百合子さん/東京都知事) ■トップテン 愛の不時着(ヒョンビンさん/俳優) あつ森(あつまれ どうぶつの森)/任天堂株式会社 あつまれ どうぶつの森 開発チームさん アベノマスク(特定非営利活動法人サラダボウルの皆さん) アマビエ(湯本豪一さん) オンライン○○(株式会社 東北新社の皆さん) 鬼滅の刃(吾峠呼世晴さん) GoToキャンペーン(GoToトラベル、イートを活用した皆さん) ソロキャンプ(ヒロシ さん/芸人) フワちゃん(フワちゃん さん/ユーチューバー、芸人) |
ぴえん | 悲しいんですか? 私もぴえんです |
ソーシャルディスタンスってなんですか? | 社会距離拡大戦略は、感染症の拡散を停止または減速させることを目的とした、医薬品を使わない感染抑制のための手段のことです。 |
社会距離拡大戦略ってなんですか? | 社会距離拡大戦略は、感染症の拡散を停止または減速させることを目的とした、医薬品を使わない感染抑制のための手段のことです。 |
libフォルダ
bot.js
botの基本動作を管理するために作成
※LINE BOT用のコードが少し混じっているので、後日削除します。
elasticlunrsearch.js
全文検索ライブラリ・形態素解析ライブラリを活用して
ユーザーからの質問に対し回答を作成するために作成
knowlegeBase.js
エクセルからデータを抽出して、QとAにマッピングするために作成
lunr.jp.js
lunr.stemmer.support.js
検索エンジンを日本語対応させるために必要
TinySegmenterのインスタンス生成処理を若干修正しています
//var segmenter = new lunr.TinySegmenter(); // インスタンス生成
var segmenter = new (require('./tiny_segmenter-0.2.js'))(); // インスタンス生成
tiny_segmenter-0.2.js
日本語トークナイザ
requireできずにエラーになるので最終行に以下を追加しました
module.exports = TinySegmenter;
.env
BOTが質問を理解できないと判断するさいの閾値をデフォルトで25%としています。
BOTの確信度が25%を超えている場合、質問に対する回答を返答。
25%を下回る場合、オウム返し。
BOTが質問を正確に理解するために必要な点は以下の2点
・形態素解析の精度を高める
・ナレッジの精度を高める
上記以外だと中間閾値で複数選択回答をする等のやり方もありますが
Webでこれを実現する場合、複数選択用のデザインを作成しなければいけないため今回は割愛しました。
次回はGoogle Analyticsと連携して
質問の問い合わせの傾向分析 や メンテナンスについて記事を書こうかと思います。