Petch Kruapanich
readmoreth
Published in
2 min readApr 23, 2018

--

Dialogflow: บอกชื่อแล้วไม่เข้าใจ Entity ช่วยท่านได้

ถ้าใครทำบอทที่ต้องถามชื่อผู้ใช้ และเลือกใช้ @sys.given-name เป็น parameters น่าจะเคยเจอปัญหาว่าพิมพ์ชื่อบางชื่อไป แล้ว Dialogflow ไม่เข้าใจ จนหลายๆครั้งต้องยอมถอดใจไปใช้ @sys.any แทน ซึ่งก็ดันไปสร้างปัญหาในอีกรูปแบบนึงแทน

ถ้าเรามองไปที่สาเหตุ จะพบว่าชื่อบางชื่อ โดยเฉพาะชื่อไทย ไม่ถูกจับด้วย @sys.given-name ก็เป็นเพราะ Corpus ที่ Dialogflow เตรียมไว้สำหรับชื่อต้น ยังไม่มีชื่อดังกล่าวอยู่ ดังนั้นแนวทางการแก้ทางหนึ่ง ที่หลายๆคนนิยมทำกันก็คือสร้างเป็น Namelist Entity ขึ้นมา

แต่อย่างไรก็ตามก็ต้องขอออกตัวก่อนนะว่า วิธีนี้ไม่ใช้วิธีที่ดีที่สุดในการแก้ปัญหาการจับชื่อ นามสกุล เพราะยังมีอีกหลายวิธีที่สามารถเอาไปประยุกต์เพื่อแก้ปัญหานี้ได้ แต่วิธีนี้จะเป็นวิธีที่จะช่วยให้เห็นประโยชน์ของการใช้งาน Entity ได้ค่อนข้างดีอันนึงเลย แต่ก่อนจะถึงตรงนั้นเรามาดูกันก่อน ว่าข้อจำกัดของ Entity มีอะไรบ้าง

  • 1 Agent สามารถมี Entities ได้สูงสุด 250 อัน
  • 1 Entity Element สามารถมี synonyms ได้สูงสุด 100 อัน
  • 1 Entity สามารถมีได้ สูงสุด 30,000 Elements
  • รองรับ Entities combination สูงสุด 4 อัน

Step 1 : สร้าง Namelist Entity
ขั้นแรก เริ่มต้นสร้าง Namelist Entity ขึ้นมา จากนั้นระบุ @sys.given-name:given-name ลงไปใน Element เหมือนเป็นการ inherit given-name ที่ Dialogflow มีอยู่ในระบบ จากนั้นลองเพิ่มชื่อซักชื่อนึงลงไปเช่น “คชา

จากนั้นไปปรับ Intent ที่ทำหน้าที่รับ Parameters ชื่อ โดยไปที่ Section Action and parameters จากนั้นแก้ไข Entity ของ Parameter Name จาก @sys.given-name ให้เป็น Entity @Namelist ที่เราสร้างไปเมื่อสักครู่แทน

ซึ่งเมื่อเราลองใช้งานจะพบว่า จากเดิมถ้าเราพิมพ์ชื่อว่า “คชา” ลงไป แชทบอทจะจับไม่ได้ว่าชื่อนี้คือ Given-name แต่ตอนนี้มันจะรู้แล้วดังภาพ เย้!!!

Step 2 : เพื่มคลังชื่อไทยใส่ Entity
หลังจากเราลอง Proof of concept แล้วว่าการเพิ่ม Namelist Entity สามารถแก้ปัญหานี้ได้ ทีนี้เราจะลองเอาชื่อภาษาไทยเข้ามาใส่เพิ่มขึ้น เท่าที่ลองหามา ตอนนี้ก็เจอ Git นึงที่รวบรวม Lexicon ภาษาไทย เอาไว้ทำ National Language Processing ซึ่งก็มีชื่อไทยด้วยตั้ง 5 แสนชื่อเลยนะ (Lexicon-thai) ยังไงลองเอาไปใช้กันดูได้ครับ ส่วนถ้าใครสนใจช่วย Contribute ก็เข้าไปเติมชื่อกันได้

จากข้อจำกัด เราจะพบว่า Entity ใน Dialogflow มันรับได้แค่ 30,000 Elements ต่อ 1 Entity แต่เรามีชื่อมากกว่า 30,000 ดังนั้นเราเลยต้องทำการแยก เป็น Entity ย่อยๆ แล้วค่อยเอา Entity ย่อยๆ ดังกล่าวมายัดเข้า Namelist ที่เป็น Entity หลักที่ผูกกับ Parameters เอาไว้ตามรูป

นอกจากการแก้ปัญหาเรื่องการจับชื่อไม่ได้ Entity ยังสามารถเอาไปทำอะไรได้อีกเยอะแยะเลยนะ ถ้าอยากศึกษาเพิ่มเติม ก็ลองเข้าไปดูตัวอย่าง และรายละเอียดของ Entity แต่ละประเภทได้ที่ Dialogflow เลยฮะ :)

--

--

Petch Kruapanich
readmoreth

Full time Developer, Part time writer, Vinyl lover