สวัสดีอีกครั้งครับ หวังว่าทุกๆอ่านคงได้อ่านบล็อกก่อนๆที่ผมเขียนวิธีสร้าง 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 ให้ใช้งานง่ายขึ้น
- ทำระบบให้สั่งการด้วยเสียงได้
- เพิ่มความสามารถให้มากขึ้น
สำหรับวันนี้ผมก็ขอลาไปก่อนแค่นี้แหล่ะครับ ขอบคุณมากครับ