Petea's conference room

エンジニア目線で語ります

MENU

【5日目】Python基礎知識だけで自動応答botを作ってみよう!

Python基礎知識だけしか知らない初心者でも自動応答botが完全自作できるのか!?
苦労しつつも面白いものができました!

 

 

 

皆さん、こんにちは。アラサーサラリーマンです。

 

4日目から期間が空いてしまいましたが、pythonを一から学んだので、

python基礎レベルまで学んだ知識をもとに、めちゃくちゃ簡単な自動応答botを作ってみたいと思います!

 

 

 

1. ここまで学んだPython知識

今回作成したプログラムに使用したものをPython初心者なりにまとめました。

全部書くと情報量が多くなりすぎるので、一部にとどめておきます。

残りはまた別の日に!

面に何かを出力したいとき
print("プログラミング楽しいです")

⇒ プログラミング楽しいです

と表示されます。これは理解しやすいですね。文字通り括弧内をプリントしてくれます。

 

ああしたらこうする、ようなタラレバを言いたいとき
if me == "かっこいい" :
   print("イケメンですね~")
else :
   print("何とも言えませんね")

⇒ イケメンですね~

と表示されます。これは、「もし私がかっこいいならば、イケメンですねと言え」という命令ですので、ここは当然イケメンですねと言われます。

もしかっこよくなかったら、「何とも言えませんね」と言うのですが、ここはそうはなりませんでした。

 

無限ループにはめたいとき
while(True) :
   print("私かっこいい?")
   if me == "かっこいい" :
      print("イケメンですね~")
      break
   else :
      print("何とも言えませんね")

⇒ 『私』がかっこよくて「イケメンですね」と言われるまで、「私かっこいい?」「何とも言えませんね」をループすることになります。
whileループの中に break と書かれた箇所がありますが、break が実行された瞬間無限ループから抜け出せるのです。break に達するためには、if 文の me がかっこよくないといけないわけですね。

脱出ゲームみたいで面白いです。

 

自分だけのルールに名前をつけたいとき
def  self_respect (me) :
   if me == "かっこよくない" :
      new_me = "かっこいい"
   else :
      new_me = me
   return new_me

⇒ self_respect関数(自己肯定感関数)を定義(def)しています。かっこよくなければ、新しい自分(new_me)をかっこよくしてから返している(return)のです。

自分の中で「こうすればかっこよくなる」って思う仕草とかありますかね。それをルール化して名前つけているイメージです。

 

辞書型とかformat()とか面白いので解説したかったのですが、次回にします!

Pythonは本当に覚えやすくて初心者に優しい言語だな~と思いました!

 

2. 簡単な自動応答botって?

今回私が作る自動応答botPython基礎知識を使ってできるものなので、

大層なものではありません。

(さすがに初心者が5日目にビッグデータを活用したAIなんてできないでしょ~)

作りたいのは下記のイメージです!

 

挨拶した後は適当にあしらってくれるbot
 ー「おはよう」と言ったら「おはよう」と返してくれる
 ー時間帯に応じた会話をしようとしてくれる
 ー自分の知っていることに話を持ち込もうとしてくる
 

最初の挨拶はちゃんとしてくれるけど、二言目には適当なことしか言わなくなるちょっとシャイな感じのbotです!

事前にパターンを用意しておくっていうのが、AIには重要なことなんだな~とプログラミングをしていて実感しました。

事前に学習させておくっていうイメージは、このパターンを用意しておくってことに似ていそうですよね!)

 

3. コードを書いてみた!

実際に自分が一からコードを書いてみました!

条件分岐( if文 )を多用していて、まだ全然AIになっていないですけど、Python基礎知識だけでここまで書けるようになったのは感動です!

基本的には、『1.ここまで学んだPython基礎知識』で解説した知識を使ってるので、ぜひ理解してみてください!

# 自動応答クラスの定義
class Autoreply:
  def __init__(self,tz):
    # 時間帯
    self.tz = tz
  
  # 最初の挨拶に対するメソッド
  def greeting(self):
    # 時間帯(tz)に応じて挨拶が自動応答される
    if self.tz == "morning":
      return "おはようございます"
    elif self.tz == "afternoon":
      return "こんにちは"
    elif self.tz == "evening":
      return "こんばんは"
    else:
      return "まずは挨拶を!"
  
  # 二言目以降の応答メソッド
  def kaiwa(self,message2):
    if message2.count("?") > 0 or message2.count("?") > 0:
      return "難しい質問ですね。検討することを検討させてください"
    elif self.tz == "morning":
      return "確かに。{}、ですね。それより私、いつもと違いません?".format(message2)
    elif self.tz == "afternoon":
      foods = {"お腹減りました。":"何か食べたいものありますか?"}
      for key,value in foods.items():
        return "そんなことより"+key+value
    elif self.tz == "evening":
      return "あなたもですか。私もエンドレス残業です。"
    else:
      return "えっ?"
    

# 挨拶から始めることを促す
print("まずは挨拶をしましょう!")
print("ペト:",end="")
message1 = input()

# 挨拶によって時間帯を判別する
while(True):
  if message1 == "おはようございます" or message1 == "おはよう":
    tz = "morning"
    break
  elif message1 == "こんにちは":
    tz = "afternoon"
    break
  elif message1 == "こんばんは":
    tz = "evening"
    break
  else:
    print("正しい挨拶をしましょう!(おはようorこんにちはorこんばんは)")
    print("ペト:",end="")
    message1 = input()

# インスタンス作成(自動応答botの作成)
talk = Autoreply(tz)

# はじめの挨拶を返します
first_reply = talk.greeting()
print("BOT:"+first_reply)

# 二言目以降は適当に返事をします
while(True):
  print("ペト:",end="")
  message2 = input()
  nonchalant_reply = talk.kaiwa(message2)
  print("BOT:"+nonchalant_reply)

 

4. コードを実行した結果は???

自分が作ったコードを実行すると、下記のような会話ができるようになります。

「ペト:○○」が私が入力した言葉で、「BOT:○○」が自動応答文です。

 

まずは挨拶をしましょう!
ペト:こんにちは
BOT:こんにちは
ペト:午前の会議で上司に怒られちゃったよ
BOT:そんなことよりお腹減りました。何か食べたいものありますか?
ペト:え?僕の話無視?もしかして嫌われてる?
BOT:難しい質問ですね。検討することを検討させてください
挨拶まではしっかりしてくれているのですが、二言目からはこっちの話なんか聞いてないです。
最後だけは、私のことを嫌っているかのような返答が奇跡的に成立しています。

『2.簡単な自動応答botって?』で定義した作りたいイメージ通りのものになっているのですが、

まだこれくらいしか作れなかったというのが本音です。

 

話がきれいに成立する自動応答botのレベルの高さを実感しました。

多くの会話パターンを学習させる必要があると感じましたし、

ワードから何を言いたいのかを予測させる技術が必要だなとも感じました。

 

もう少し技術が身に付いたら「入力ワードから連想語を出してくれるbot」を作ってみたいと思います。

これができるようになったら、私が本当にやりたい自動文章生成も、

連想語の技術を応用して作れる気がしているのです。

 

引き続き頑張ります!