สวัสดีอีกครั้งครับ หวังว่าทุกๆอ่านคงได้อ่านบล็อกก่อนๆที่ผมเขียนวิธีสร้าง Chatbot ไว้แล้วนะครับ บล็อกก่อนๆเนี่ยผมอธิบายพวกวิธีการโหลดดไลบรารี่การใช้งาน และอื่นๆไว้ด้วย แต่ว่าวันนี้ผมจะมาพาเขียน Chatbot จริงๆดูครับ

ผมอัพโหลดโค้ดทั้งหมดไว้ใน Github แล้วนะครับ ถ้าต้องการโค้ดไปลองรันดูสามารถหาได้ ที่ https://goo.gl/iw6zXq ครับ

ก็มาเขียนกันเลยดีกว่า

ในบล็อกครั้งก่อนผมอธิบายวิธีสร้าง Intent Parser ไว้ 3 ตัวคือ

  • HelloIntent ไว้ ทักทาย
  • ByeIntent ไว้ บอกลา
  • แล้วก็ TimeIntent ไว้ถามเวลา
เผื่อใครยังไม่ได้อ่านพาร์ทก่อนๆนะครับ
https://goo.gl/ZssdPW : Part 1
https://goo.gl/pGkCWv : Part 2

เนื่องจากว่าเราไม่ได้มี Intent แค่ตัวเดียวเราจึงไม่ทราบได้ว่าประโยคที่ได้รับมานั้นเป็น Intent ประเภทไหน

ผมเลยประกาศตัวแปร List ตัวนึงชื่อ AllIntent ไว้เพื่อใส่ Intent ทั้งหมด

จากนั้นค่อยเลือก Intent ที่มีค่า Confidence สูงสุดในลิสต์ แล้วทำตาม Intent นั้นๆครับ

แผนผังการทำงาน

มาเขียนโค้ดกันเลยimport intentparser
import datetime
import random

เริ่มจาก import library ตัวตัวเข้ามาก่อนallIntent = []

ประกาศ allIntent ไว้ใส่ Intent ทั้งหมดHelloIntent = intentparser.intentParser({
   'description' : {
                   "type" : 'HelloIntent',
                   "args" : [],
                   "keyword" : [
                   (0, "hello_keyword"),
                   ]},
   'hello_keyword' : ['hello', 'hi'],
})
HelloIntent.teachWords(["Hello, How are you?", "Hi, Mr.John", "Hello, nice to meet you!"])
allIntent.append(HelloIntent)ByeIntent = intentparser.intentParser({
   'description' : {
                   "type" : 'ByeIntent',
                   "args" : [],
                   "keyword" : [
                   (0, "bye_keyword"),
                   ]},
   'bye_keyword' : ['bye'],
})
ByeIntent.teachWords(["Good bye, Watson.", "Bye, Josh.", "Good bye, Be safe."])
allIntent.append(ByeIntent)TimeIntent = intentparser.intentParser({
   'description' : {
                   "type" : 'TimeIntent',
                   "args" : [(1, "scopes")],
                   "keyword" : [
                   (0, "time_keyword"),
                   (1, "scopes")
                   ]},
   'time_keyword' : ['is', 'are', 'what', 'how', 'clock', 'how\'s'],
   'scopes' : [
       "day",
       "time"
       ]
})
TimeIntent.teachWords(["What time is it?", "How's the clock", "What is this day"])
allIntent.append(TimeIntent)

ใส่ Intent ทุกตัวลงไปใน allIntent (ถ้าใครงงสามารถดูพาร์ทก่อนได้ครับ)while True:
   text = input('User said : ')
   temp = []
   for i in allIntent:
       _temp = i.getResult(text)
       try:
           temp.append((_temp['confidence'], _temp['type']))
       except Exception as e:
           pass
   candidate = max(temp)

ใส่ลูปไว้รับ input แล้วใส่ error handling ดูว่าเก็บค่าได้มั้ย ถ้าไม่ได้ก็ผ่าน ถ้าได้ก็จะหาตัวที่ confidence สูงที่สุด (ตั้งชื่อว่า candidate)if candidate[1] == 'HelloIntent':
       print(random.choice(['Chatbot said : Hello!',
                           'Chatbot said : How are you?',
                           'Chatbot said : What\'s up!']))

ถ้า candidate เป็น HelloIntent ตอบอันใดอันหนึ่งในลิสต์elif candidate[1] == 'ByeIntent':
       print(random.choice(['Chatbot said : Good bye!',
                           'Chatbot said : Good Luck!',
                           'Chatbot said : See ya!']))

ถ้า candidate เป็น ByeIntent ตอบอันใดอันหนึ่งในลิสต์elif candidate[1] == 'TimeIntent':
       typeOfTime = TimeIntent.getResult(text)['args']
       typeOfTime = [item for item in typeOfTime if item[0] == 'scopes'][0][1]
       now = datetime.datetime.now()
       if typeOfTime == ['day']:
           print("Today is {}/{}/{}".format(now.day, now.month, now.year))
       else:
           print("now is {}:{}:{}".format(now.hour, now.minute, now.second))
       del typeOfTime, now #ลบตัวแปรที่ไม่ใช้แล้ว

ถ้าเป็น TimeIntent เช็คประเภทก่อน ถ้าเป็น day ก็บอกวัน หรือถ้าเป็นอย่างอื่นก็ให้นับว่าถามเวลาelse:
   print('error')
del text, temp, _temp, candidate

ถ้าหา intent ไม่เจอก็จะบอกว่า error จากนั้นค่อยลบตัวแปรที่เหลือ

มาทดลองดีกว่า

ก็ใช้ได้อยู่

ถ้ามีจุดไหนที่เพิ่มเติมได้ก็คงมี

  • ทำ GUI ให้ใช้งานง่ายขึ้น
  • ทำระบบให้สั่งการด้วยเสียงได้
  • เพิ่มความสามารถให้มากขึ้น

สำหรับวันนี้ผมก็ขอลาไปก่อนแค่นี้แหล่ะครับ ขอบคุณมากครับ