【コード公開】【Python】あなたにもSiriが作れる?! チャットボットを作成しよう

みなさんはチャットボットをご存知でしょうか?

これはチャットが交わせるボット(ロボット)という意味で、ユーザーが入力した言葉を読み取って、あたかも会話しているかのように反応を返すプログラムのことです。聞きなれない言葉かもしれません。しかしこの記事にたどり着けているみなさんであれば、必ず一度は使ったことがあるはずです。

SiriやGoogleアシスタントなどの対話型AIは、あまりにも自然に会話ができるので意識しにくいかもしれませんが、実はこのチャットボットという技術がもとになっています。これらのサービスは、チャットボットと音声認識技術の合わせ技で実現しています。

仕事やプライベートの連絡のためのツールは、メールからLINEなどのチャットに移行しました。チャットといえば人間対人間のコミュニケーションを思い浮かべる方が多いと思いますが、AI技術の進歩した今、必ずしもそうとは言えなくなってきています。

この記事では、今注目されつつあるチャットボットが実際にどのような形で利用されているのかを紹介します。そして実践編として、Pythonを使った簡単なチャットボットのコードを掲載し、実際にどんな仕組みで動いているのかを体験してもらいたいと思います。

1. Pythonのチャットボットとは何か

1-1. Pythonのチャットボットとは会話できるプログラムである


日本語の文章は単語毎に別れておらず、そのままではコンピューターが単語間の関係や品詞を判別することはできません。そこでPythonの提供しているJanomeのようなライブラリを利用し、分かち書き(単語ごとに分ける)をした上でそれぞれの単語の品詞を判別することで、文章の意味を読み取らせます。

この作業のことを、形態素解析と呼びます。

「私はPythonを学ぶ」→「私」「は」「Python」「を」「学ぶ」


それではコンピューターが文章の意味を理解できるとして、それが具体的にどのような形でチャットボットに利用されているのでしょうか? Siriを例にして説明したいと思います。


「Hey, Siri」と声をかけることでSiriが起動します。


この後例えば、「Aさんに日程変更を伝えるメールを出して」と指示を出した時のことを考えてみましょう。

1−2. PythonのチャットボットをSiriを例にして解説

まずiPhoneのマイクによって感知された音声をもとに、音声認識によってテキストデータに変換します。このテキストデータはスマートフォンの画面に表示されます。そしてこのテキストデータを形態素解析して文章の意味を読み取るわけですが、ここで大事な点が一つあります。

試しにiPhoneを機内モードにしてみてください。Siriが使用できなくなるはずです(Androidでも同様)。

これはどういうことかというと、Siriがテキストデータを解析するためにAppleのサーバーにアクセスするからです。

Siriの文章解析には、AIが使われています。そのAIは、みなさんがお持ちのスマートフォンの中にあるわけではありません。AIの計算には高性能のコンピューターが必要となるため、中心的なサーバーを用意して、ユーザーがそれを使うタイミングでそこへアクセスするという仕組みになっています。iPhoneの通信を断つとSiriが使えなくなるのはその為です。

iPhoneに表示されたテキストデータは一旦Appleのサーバへと送られ、そこで形態素解析されます。試しにJanomeを使って例文を解析すると、以下のようになります。

Aさんに日程変更を伝えるメールを出して


A 名詞,固有名詞,組織,*,*,*,A,*,*
さん 名詞,接尾,人名,*,*,*,さん,サン,サン
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
日程 名詞,一般,*,*,*,*,日程,ニッテイ,ニッテイ
変更 名詞,サ変接続,*,*,*,*,変更,ヘンコウ,ヘンコー
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
伝える 動詞,自立,*,*,一段,基本形,伝える,ツタエル,ツタエル
メール 名詞,サ変接続,*,*,*,*,メール,メール,メール
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
出し 動詞,自立,*,*,五段・サ行,連用形,出す,ダシ,ダシ
て 助詞,接続助詞,*,*,*,*,て,テ,テ

MACのターミナルに出力された結果をそのまま出しているので、少々読みづらいかもしれませんが、単語毎の品詞が表示されています。

こうして解析された単語の中からAppleのサーバーにあるプログラムは、”メール”という名詞に注目して、ユーザーがメールの送信をしてほしいのだということを認識します。

そして、iPhoneに”メールのアプリを起動せよ”という命令を出すわけです。

これはSiriの例ですが、あらゆるサービスに使われているチャットボットに共通するものになります。テキストデータを解析してその中の単語を一つ一つ調べ、ユーザーが何をしてほしいのかを読み取ってそれに応じた情報を返しているのです。

1−3. Pythonのチャットボットが使われているサービス

Pythonのチャットボットは、既に社会のあらゆる場所に溶け込んでいます。チャットボットという言葉がまだ広まっていないだけです。

例えば、消費者の問い合わせをチャットボットで受け付けていたり、IT系のヘルプデスク業務をチャットボットで代替したりなどがあります。

AIが特に強いのは、特定の傾向が多く見られる問題に適切な解答を返すことです。例えば上記のような問い合わせ業務の従事者は、よくあるQ&Aのページを見れば解決するような問い合わせをいくつも対応することになります。基本的にITに疎い人ほど、電話の方が安心するなどといった理由でいきなり電話をしてしまいがちですよね。

こういった特定の質問に対して適切な解答を返すのは、AIの得意分野です。問い合わせのフォームに入力された問い合わせの内容を解析し、よくある質問のパターンに該当するものがないかをチェックします。そして該当するものがあればパターン化された解答を返し、該当するものがなければ人間のオペレーターに繋ぎます。これだけでオペレーターの負担を大幅に減らすことができます。

また最近はこれとは違った形で、チャットボットを導入している企業もあります。その1つは会話型広告です。

例えばエンジニアの求人などで寄せられる問い合わせをチャットボットで受け付け、ユーザーの求める条件などをヒアリングしていきます。その条件に合った求人情報を返し、ユーザーが気に入ればエージェントが実際に求人を紹介するというサービスがあります。

ユーザーが求めているサービスをチャットによって特定し、それを契約に結びつける。こういった形の広告を導入する企業は増えつつあります。

この会話型広告をメインビジネスとしている株式会社ZEALSは、4.2億円の資金調達をしたことで話題になりました。またこのZEALSはサイバーエージェントが筆頭株主にもなっています。起業家や投資家も、チャットボットに目をつけ始めているということがわかります。

2. Pythonでチャットボットを作ろう

2−1. Pythonのチャットボットの仕組み

それでは、Pythonを使ってシンプルなチャットボットを作成してみたいと思います。サンプルコードは基本的に、MacのPython3で記述したものを掲載します。エディタはAtomを使っています。環境によって記述が異なる場合がありますので、ご了承ください。

まず、今回作成するチャットボットの仕様を簡単に説明します。

今回はコマンドラインで入力した文章に対して、反応を返すプログラムを作成します。そのため、入力された文章に含まれた単語毎にどんな反応を返すのか、という解答パターンを用意する必要があります。

そしてこのプログラムは会話形式の機能となるので、一度呼び出したら特定の条件を満たすまでは、メッセージを処理し続けることにしたいと思います。特定の条件ですが、今回は”さようなら”というお別れの言葉を入力したらプログラムが終了するようにします。

ちなみに、このようにプログラムを作成する前にその仕様を明確に決めておくことを仕様検討と呼びます。

2−2. Pythonのチャットボットのコード作成

まず前章でも言及したように、チャットボットの解答パターンを用意します。今回はテキストデータとしてそれを用意し、プログラムに読み込ませることにしましょう。dictionaly.txtというファイル名で以下の内容のファイルを作成してください。また、このテキストファイルは、この後記述するPythonファイルと同じディレクトリに置いてください。

解答パターンのテキストですが、1行ごとに以下のフォーマットで記述してあります。

[認識する単語]:[解答]

dictionaly.txt

こんにちは:こんにちわ!良い天気ですね!
おはよう:おはようございます!
げんき:私は元気です!
Python:Pythonって最高だよね!

次からがPythonのコードになります。

まずテキストファイルを読み込み、そのデータを整形してリストに保存するようにします。そのままではテキストファイルは全て繋がっているので、行ごと、および単語と解答パターンごとに分割してbot_dictというリストに格納しておきます。

単語と解答パターンは”:”で区切られているので、それを利用してsplit()メソッドで分割しています。

with open('dictionaly.txt') as open_file:
   all_data = open_file.read()


# 各行のリストを作る
line_list = all_data.splitlines()


#読み込んだデータを辞書に追加する
bot_dict = {}


for line in line_list:
   orig,trans = line.split(':')
   bot_dict[orig] = trans

次に、コマンドラインによる入力を受け付ける準備をします。

while Trueを記述することで、breakするまでプログラムが入力を処理し続けます。そしてinput()メソッドによって入力を受け付けます。

while True:
   command = input('メッセージを入力; ')


   responce = ""

そして入力された文章の中に、解答パターンのある単語が含まれているかをチェックします。bot_dictというリストにある単語全てと照合するために、for文を使ってループ処理をさせています。

#辞書のキーが含まれているかチェック
   for key in bot_dict:
       if key in command:
           responce = bot_dict[key]
           break

今回は、文章なしの入力があった際の解答も用意しようと思います。以下のようなメッセージを返すようにしました。

# 空文字の判定
   if not responce:
       responce = 'あなたとお話がしたいです!なんでも聞いてください!'

最後に解答を出力します。そして仕様検討した通りに、さようならという単語が入力された際にプログラムを終了させるためにbreakを使います。

 print(responce)


   if 'さようなら' in command:
       break

以下にコードの全体を記載しておきます。


chatbot.py

with open('dictionaly.txt') as open_file:
   all_data = open_file.read()


# 各行のリストを作る
line_list = all_data.splitlines()


#読み込んだデータを辞書に追加する
bot_dict = {}


for line in line_list:
   orig,trans = line.split(':')
   bot_dict[orig] = trans


while True:
   command = input('メッセージを入力; ')


   responce = ""


   #辞書のキーが含まれているかチェック
   for key in bot_dict:
       if key in command:
           responce = bot_dict[key]
           break


   # 空文字の判定
   if not responce:
       responce = 'あなたとお話がしたいです!なんでも聞いてください!'


   print(responce)


   if 'さようなら' in command:
       break

それでは実際に動かしてみましょう。

2−3. Pythonのチャットボットと会話してみよう

ターミナルを起動してプログラムを呼び出します。”メッセージを入力”と表示されるので、試しに”Pythonが好き”と入力してみます。

メッセージを入力; Pythonが好き
Pythonって最高だよね!

反応が返ってきました! 成功ですね。

メッセージを入力; こんにちわ
こんにちわ!良い天気ですね!
メッセージを入力; おはよう
おはようございます!
メッセージを入力; げんき?
私は元気です!
メッセージを入力; 
あなたとお話がしたいです!なんでも聞いてください!
メッセージを入力; さようなら

他の解答についても、正常に返ってくることがわかります。仕様通りに、”さようなら”と入力するとプログラムは終了します。

今回のプログラムは導入のためにシンプルさを意識し、文章に特定の単語が含まれているかどうかのみを判断してメッセージを返す仕組みなので、形態素解析は使っていません。また漢字とひらがなの違いや、大文字と小文字の違いで正しい反応が返らなくなったりします。

しかし、会話は十分成り立っていることがわかると思います。解答パターンを増やせば、より人間らしい挙動を示すようになります。

ここから更に発展すると、解答バターンをテキストファイルではなくデータベースに登録したり、ユーザーの入力した文章を形態素解析してパターン化し、プログラムが自身でボキャブラリーを増やすようにするといったアップデートが考えられます。またLINEのAPIを利用することで、チャットボットをLINEのアプリに組み込むことも可能です。

3. まとめ

いかがだったでしょうか?

実際にプログラムを動かしてみると、よりチャットボットを身近に感じられたのではないでしょうか? Siriなどをイメージすると、とても複雑なシステムなのかとハードルが上がり過ぎてしまいますが、基礎となるプログラムは上記のようなシンプルな形なのです。ここにAIの最適化アルゴリズムを加えるとより複雑なシステムとなり、できることも増えていきます。

ぜひみなさんも好きな解答パターンを読み込ませ、自分好みのチャットボットを作ってみてください!

それでは、ここまで読んでいただきありがとうございました。

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

見る目あるよ
12

ベナオBlog

Twitterで活動してます! https://twitter.com/benao_blog フリーランスエンジニア・ライター LINEBot、Python開発者 Pythonistaサロン運営
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。