ルールベースモデルのチャットボットを作ってみよう

所要時間

60分

学ぶコト

・ルールベースモデルのチャットボット(単語回答ボット)

ここからのレッスンでは実際にPythonでチャットボットを実装していきます。

このレッスンでは

Google Colaboratory

を使っていきます。

ルールベースモデルのチャットボット(単語回答bot)

まずはルールベースモデルのチャットボットを作っていきましょう。

最初にユーザーの入力文に固有名詞があったらそれをWikipediaで調べて回答する”単語回答bot“を作ります。

この実装でのポイントは以下になります。

  • ユーザーの文章を形態素解析で単語単位で分割する
  • 固有名詞の可否に応じた回答ルールを作る
  • 固有名詞が含まれていたら、その単語をwikipediaで検索して、内容を要約して返答する
  • 挨拶されたら挨拶を返す

形態素解析とは文章を言語の意味を持つ最小の単位まで分割する作業を指します。詳しくは「自然言語処理コース」で解説しているので受講してみて下さい!

まずは必要なライブラリをインストールします。

!pip install janome
!pip install wikipedia

janome」はPythonで利用できるオープンソースの形態素解析ツールです。

テキストデータのトークン化や解析、単語の分類など、多くの自然言語処理タスクで利用されていて、日本語対応しているのが特徴です。

wikipedia」はWikipediaが公開している「MediaWiki API」をラップしたものでWikipediaの情報を簡単にアクセス・解析できるPythonライブラリです。

では応答ルールの部分を作っていきます。

from janome.tokenizer import Tokenizer
import wikipedia

# Janomeのインスタンスを作成
tokenizer = Tokenizer()
# 言語を日本語に設定
wikipedia.set_lang("jp")
# 挨拶用語
greetings=["こんにちは","おはよう","こんばんは"]

def search_meaning(keyword):
    # ウェキペディアで単語を検索
    keyword = wikipedia.search(keyword)
    if not keyword:
      return "わかりませんでした。"
    else:
    #検索ワードがヒットすれば要約を返答
      return wikipedia.summary(keyword)

“search_meaning関数”では、固有名詞をWikipediaで検索して、検索結果があれば要約した内容を返しています。

文字通りwikipedia.searchでwikipedia内で対象のワードをクエリ検索し、wikipedia.summaryで概要を取得しています。

続いてユーザーの入力処理の部分を見ていきましょう。

# ユーザー入力の処理
def get_response(user_input):
    #メッセージをトークンに分割
    tokens = tokenizer.tokenize(user_input)
    # トークンごとにルールをチェック
    for token in tokens:
      if token.part_of_speech.split(",")[1] == "固有名詞": # 固有名詞が含まれる場合はその固有名詞を質問するルール
        meaning = search_meaning(token.surface)
        return f"{meaning}"
      elif token.surface in greetings:# 挨拶が含まれる場合は挨拶と同じ言葉を返すルール
        return f"{token.surface}!何か知らない単語はありますか?"
    return "何か知らない言葉はありますか?"

“get_response関数”ではユーザーの入力した文章を解析して、解析した結果をルールに当てはめています。

形態素解析の結果、固有名詞がある場合、挨拶用語が含まれる場合、それ以外と応答ルールを設定しています。

janomeでは形態素解析した単語(tokenオブジェクト)に以下の情報を持っています。

  • surface(表層形):文字列で使われている形
  • part_of_speech(品詞):品詞,品詞細分類1,品詞細分類2,品詞細分類3という文字列で、固有名詞の場合「名詞,固有名詞」になる
  • infl_type(活用型)
  • infl_form(活用形)
  • base_form(基本形)
  • reading(読み)
  • phonetic(発音)

そのため、固有名詞かどうかの判定はpart_of_speechで行っているというわけですね。

ルール部分の次はユーザーとの対話処理の部分を実装していきましょう。

# メインの対話ループ
print("ボット: 私は単語回答botです!知らない単語を質問してください!")
while True:
    user_input = input("ユーザー: ")
    if user_input.lower() == "終了":
        print("チャットを終了します。")
        break

    response = get_response(user_input)
    print(f"ボット: {response}")

会話部分はシンプルで、ユーザーの入力文章を”get_response関数”に投げて、返ってきた内容を回答文として回答しています。

実際のやり取り例は以下になります

ルール通りの会話が出来ていそうですね!

ルールベースのチャットボットはユーザーに対して意図した回答ができるのが良いですね!

課題

・固有名詞ではなく一般名詞を聞かれたら回答するBotを作ってみよう!