ดึงข้อมูลจากประโยค


11

ฉันกำลังสร้าง chatbot ง่าย ๆ ฉันต้องการรับข้อมูลจากการตอบกลับของผู้ใช้ ตัวอย่างสถานการณ์:

Bot : Hi, what is your name?
User: My name is Edwin.

ฉันต้องการแยกชื่อ Edwin ออกจากประโยค อย่างไรก็ตามผู้ใช้สามารถตอบสนองได้หลายวิธีเช่น

User: Edwin is my name.
User: I am Edwin.
User: Edwin. 

ฉันพยายามพึ่งพาความสัมพันธ์ระหว่างคำ แต่ผลลัพธ์ไม่ดี

ความคิดเกี่ยวกับเทคนิคใดที่ฉันสามารถใช้เพื่อแก้ไขปัญหานี้

[UPDATED]

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

User: my name is edwin.

NER ส่วนใหญ่ไม่สามารถรับรู้สิ่งนี้


สิ่งนี้อธิบายว่าบอทแชทสมัยใหม่นั้นถูกสร้างขึ้นได้อย่างไร แต่ฉันจะไม่เรียกมันว่าเรียบง่าย คุณสามารถเรียนรู้เพิ่มเติมโดยค้นหา "การตอบคำถาม"
Emre

ฉันชอบวิธีที่ผู้คนถามคำถามและรับคำตอบทำเครื่องหมายคำตอบว่าเป็นที่ยอมรับ: P
chewpakabra

คำตอบ:


7

คุณอาจจะสามารถใช้การรวมกันของชื่อ Entity การรับรู้และการวิเคราะห์การสร้างประโยค - ในขณะที่คำว่าเอ็ดวินแน่นอนพยุงจินตนาการสถานการณ์ที่ชื่อเป็นเอ็ดเวิร์ดฟิลิป Martel NER ตรวจจับแต่ละคำว่าเป็นเอนทิตีที่แยกจากกัน (ดังนั้นเอนทิตีที่แตกต่างกัน 3 รายการ) - ดังนั้นคุณจะต้องต่อสายเข้าด้วยกันตามตรรกะบางอย่าง ยิ่งไปกว่านั้นในกรณีที่มีชื่อหลายชื่อปรากฏอยู่จะทำให้ยากต่อการเข้าใจผิด (ตัวอย่างเช่นJohn & Ramsey ทานอาหารที่ Winterfell )

นี่คือที่การวิเคราะห์ไวยากรณ์ประโยคจะช่วยด้วย (สมมติว่าผู้ใช้ป้อนประโยคที่ค่อนข้างสอดคล้องกันและเหมาะสม - หากใช้คำสแลงและข้อความสั้น ๆ แม้แต่ Stanford NLP ก็สามารถช่วยได้ในระดับหนึ่งเท่านั้น)

วิธีหนึ่งของการใช้ประโยชน์จากการวิเคราะห์ไวยากรณ์ / การแยกและ NER อยู่ในตัวอย่างต่อไปนี้ -

 1. User: Edwin is my name.
 2. User: I am Edwin.
 3. User: My name is Edwin.

ในแต่ละกรณี (ตามปกติกรณีเช่นกัน) ชื่อเอนทิตี (นามเฉพาะ / คำนาม) มีความสัมพันธ์ใกล้เคียงกับกริยา ดังนั้นหากคุณแยกประโยคก่อนเพื่อตัดสินคำกริยาแล้วนำ NER ไปใช้กับคำที่อยู่รอบ ๆ (+/- 1 หรือ 2) คุณอาจมีวิธีที่เหมาะสมในการแก้ไขปัญหา การแก้ปัญหานี้จะขึ้นอยู่กับกฎไวยากรณ์ที่คุณสร้างเพื่อระบุ NER เช่นเดียวกับหน้าต่างรอบคำกริยา


2
คุณอาจจะใช้ 'ออปติคัลไฟไนต์แบบไม่ จำกัด ' ซึ่งแต่ละประโยคเป็นการตอบสนองที่รูปแบบยอมรับ มีการใช้ไวยากรณ์บางอย่างในลักษณะนี้ (NLP / มัธยม) หากคุณต้องการวิธีการนี้ให้ดูที่เฟรมเวิร์กstanfordnlp.github.io/CoreNLP
Intruso

5

คุณควรใช้ Named Entity Recognition ตัวอย่างเช่นจาก NLTK, http://www.nltk.org/book/ch07.html <- คุณสามารถค้นหาตัวอย่างการใช้งานได้ที่นั่น มันจะใช้ได้กับกรณีที่คุณอธิบายไว้ค่อนข้างดี


4

สามารถทำได้อย่างง่ายดายด้วยCRF s คุณสามารถใช้การเข้ารหัสBIOเพื่อติดแท็กประโยคของคุณ จากนั้นส่งผ่านไปยัง CRF คุณเพียงแค่ต้องสร้างประโยคที่ติดแท็กเพื่อการฝึกอบรมดังต่อไปนี้

 I am Edwin.
 O O  B-NAME

 You can call me Alfred
 O   O    O    O B-NAME

 My name is  Edwin   thomas
 O  O     O  B-NAME  I-NAME

CRFsuiteและCRF ++เป็นบางส่วนของการใช้งานที่ดี CRFsuite มีตัวห่องูหลามที่เรียกว่าpycrfsuiteซึ่งค่อนข้างง่ายต่อการนำไปใช้ ตรวจสอบสมุดบันทึก ipython นี้หรือโค้ดขนาดสั้นนี้บน githubเพื่อการใช้งาน NER แบบ end-to-end

ตรวจสอบโครงการโอเพนซอร์สแชทบอทบน gitHub กับ NER และการจำแนกความตั้งใจเขียนในหลาม พวกเขามี UI การฝึกอบรมที่ใช้งานง่ายซึ่งคุณสามารถฝึกอบรม bot ของคุณเพื่อดึงข้อมูลจากประโยค


0

เพื่อที่จะปฏิบัติงานดังกล่าวด้วยความแม่นยำสูงฉันขอแนะนำให้คุณสร้างโมเดล LSTM ด้วยคำว่า embeddings ด้วยความช่วยเหลือของ word2vec LSTM สามารถช่วยในการดึงข้อมูลจากประโยคเช่นเดียวกับการคาดเดาตัวละครหรือคำถัดไปที่ได้รับชุดของคำที่มีอยู่แล้วในประโยค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.