オウム返しWebチャットボットにQ&Aコミュニケーション機能を追加する

#オウム返しWebチャットボットにQ&Aコミュニケーション機能を追加する

##はじめに


###この記事は前回記事の続きです
https://qiita.com/abemaki/items/cd0bfa99cc2fab4660f5
説明が細かくなりすぎないように今回の記事は完成品のソースコードと
各ソースコードに対して簡易な説明を入れるようにしています。

　
###完成品のサンプル画面はこちら
※herokuなので初回立ち上げ少し遅いです。
https://ponkotsueasychatbot.herokuapp.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/7f0b9801-882e-1bf7-5a61-5dce07857a3b.png)


　
###すべて無料で実現できる
ので、お勉強や検証やアイディア創出に最適かと思います。

 
　
　
###この記事でやること
前回作成した単純オウム返しのWebチャットボットに簡単なQ&Aコミュニケーション機能を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/ebc2d359-e41c-e037-de80-e04b88e44f06.png)

Q&Aコミュニケーションのナレッジベースはエクセルで管理します。
全文検索を用いたマッチ度で質問を判定して、回答を返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/c7c20099-366a-742f-139b-11647b5afb36.png)


##使用するライブラリ　と　導入手順

###Sheets.js
エクセルを読みこんでプログラム上で利用するために活用するライブラリ。
https://www.npmjs.com/package/xlsx

###Elasticlunr.js
ブラウザ検索およびオフライン検索用のJavascriptの軽量全文検索エンジン。
http://elasticlunr.com/

導入方法は前に書いた以下の記事と同様
https://qiita.com/abemaki/items/2f1d5ec7e09ce7371431
※今回は完成品ソースコードを公開しているので、細かい導入手順は割愛。
　各ソースに対して簡易な説明を書いています。
　

　
###エクセル読み込みライブラリ と 全文検索ライブラリでQ&Aコミュニケーションボットを実現するためのイメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/f27c0f97-5124-8d86-0313-5cec2546c887.png)





##ソースコード一式 と 解説

###ソースコード一式
https://github.com/makiabe/easyqnawebbot

 　
　
　
###解説
**今回追加したファイル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/ca701a6e-6b0f-b57a-c0f3-b7984a56b4d8.png)

 
**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%を下回る場合、オウム返し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/558b493e-1647-9f50-a2f8-5f0a01aa9e5f.png)

BOTが質問を正確に理解するために必要な点は以下の2点
・形態素解析の精度を高める
・ナレッジの精度を高める

上記以外だと中間閾値で複数選択回答をする等のやり方もありますが
Webでこれを実現する場合、複数選択用のデザインを作成しなければいけないため今回は割愛しました。



次回はGoogle Analyticsと連携して
質問の問い合わせの傾向分析 や メンテナンスについて記事を書こうかと思います。