เข้าใจคำสั่งเสียงของคุณ ค้นหาข่าวสารและแหล่งความรู้ และสรุปและอ่านเนื้อหาให้คุณฟัง
ลองชมวิดีโอสาธิต
นิตยสาร Chatbots นำเสนอบทความ Delbot ของฉันในบทความ 100 อันดับแรกในนิตยสาร Chatbots
python app.py
ใน command prompt เพื่อเปิดบริการเว็บบอทยังคงเป็นประเด็นร้อน ทุกคนกำลังพูดถึงพวกเขา
แล้วการสร้างหนึ่งตั้งแต่เริ่มต้นล่ะ? สิ่งเรียบง่ายที่เราจะสร้างในวันนี้จะเข้าใจและตอบคำถามเช่น:
เป้าหมายของเราคือการเขียนโค้ดบอทตั้งแต่พื้นฐานและใช้การประมวลผลภาษาธรรมชาติ (NLP) ในขณะที่ทำเช่นนั้น
นอกจากนี้ บอทของเราจะเปิดใช้งานด้วยเสียงและทำงานบนเว็บ หากคุณกรอกข้อมูลในส่วนแอปพลิเคชันเว็บด้วย ส่วนที่ดีที่สุดคือเราไม่จำเป็นต้องทำอะไรแฟนซีในการรู้จำและการสังเคราะห์เสียงพูด: เราจะใช้ความสามารถในตัวของเว็บเบราว์เซอร์สมัยใหม่
ในระดับสูง เราต้องการที่จะเข้าใจข้อความค้นหาแบบกว้างๆ สองประเภท ต่อไปนี้เป็นผังงาน
เราอาจขอ ข่าวสาร เช่น:
มีอะไรล่าสุดเกี่ยวกับ Fantastic Beasts in the Guardian?
บอทจะค้นหา API ของแหล่งข่าวที่ร้องขอ (New York Times หากไม่มีการระบุ) และสรุปผลลัพธ์:
[...] เมื่อเปรียบเทียบภาพยนตร์แฮร์รี่ พอตเตอร์เรื่องแรก (แฮร์รี่ พอตเตอร์กับศิลาอาถรรพ์ ในปี 2544) กับภาคสุดท้าย (แฮร์รี่ พอตเตอร์กับเครื่องรางยมทูต ภาคสอง ในปี 2554) ค่อนข้างจะคล้ายกับการเปรียบเทียบแบมบี้กับสุนัขอ่างเก็บน้ำ เราพบเขาครั้งแรกในปี 1920 ที่นิวยอร์ก เกือบ 60 ปีก่อนที่แฮร์รี่จะเกิดด้วยซ้ำ ที่ที่เขาอยู่ [...]
(ที่มา: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
เราอาจถามคำถาม ความรู้ เช่น:
RDF ทริปเปิ้ลคืออะไร?
และบอทจะตอบว่า:
ความหมายสามหรือสามเท่าคือเอนทิตีข้อมูลอะตอมมิกใน Resource Description Framework nรูปแบบนี้ช่วยให้สามารถแสดงความรู้ในลักษณะที่เครื่องอ่านได้ โดยเฉพาะอย่างยิ่ง ทุกส่วนของ RDF triple สามารถระบุที่อยู่แยกกันได้ผ่าน URI ที่ไม่ซ้ำกัน u2014 ตัวอย่างเช่น ข้อความสั่งที่สองข้างต้นอาจแสดงเป็น RDF เป็น http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/ รู้ http://example.name#JohnDoe34
(ที่มา: https://en.wikipedia.org/wiki/Semantic_triple)
เรากำหนดกฎง่ายๆ ในการจัดหมวดหมู่อินพุต: หากข้อความค้นหามีคำว่า news หรือ latest จะเป็น ข้อความค้นหาข่าว มิฉะนั้นจะเป็น แบบสอบถามความรู้
ฟังก์ชัน predict
ของคลาส QueryAnalyzer
เป็นจุดเริ่มต้นหลักสำหรับบอทของเรา มันดำเนินการจัดหมวดหมู่ข้างต้น มันเรียกใช้ฟังก์ชันอื่น ๆ เพื่อ
สุดท้ายจะส่งคืนเอาต์พุตและแฟล็กที่ระบุว่ามีข้อผิดพลาดหรือไม่
เราถือว่าข้อมูลเข้าเป็นหนึ่งในรูปแบบต่อไปนี้
ข่าวล่าสุด เกี่ยวกับ Star Wars ใน New York Times คืออะไร?
อ่านข้อมูลล่าสุด เกี่ยวกับ Brexit ให้ฉันฟัง
ขอแจ้งข่าวสาร เกี่ยวกับ ภาพยนตร์ Marvel Cinematic Universe ในปี 2017 จาก Guardian
โทเค็น | ให้ | ฉัน | ที่ | ล่าสุด | ข่าว | บน | โดนัลด์ | ทรัมป์ | จาก | ที่ | ใหม่ | ยอร์ก | ครั้ง | - |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
จุดขาย | กริยา | พรอน | เดต | ADJ | คำนาม | เอดีพี | พร็อพพีน | พร็อพพีน | เอดีพี | เดต | พร็อพพีน | พร็อพพีน | พร็อพพีน | พันช์ |
แท็ก | วีบี | พีอาร์พี | ดีที | เจเจ | เอ็นเอ็น | ใน | เอ็นเอ็นพี | เอ็นเอ็นพี | ใน | ดีที | เอ็นเอ็นพี | เอ็นเอ็นพี | เอ็นเอ็นพี | - |
มีรูปแบบในประโยคที่มีโครงสร้างดังข้างต้น และคำบุพบทเป็นกุญแจสำคัญ
หัวข้อการค้นหาอยู่ระหว่างคำบุพบทแรกและคำบุพบทสุดท้าย แหล่งที่มาที่ร้องขออยู่ท้ายคำบุพบทสุดท้าย ส่วนคำนามสุดท้ายคือแหล่งที่มา
ในกรณีที่ไม่ได้ระบุแหล่งที่มา ดังตัวอย่างที่สอง ทุกอย่างที่อยู่หลังคำบุพบทแรกจะถือว่าเป็นหัวข้อในการค้นหา
Adpositions พูดง่ายๆ ก็คือ คำบุพบท และ postpositions
ในภาษาที่ใช้อักษรนำหน้า เช่น ภาษาอังกฤษ คำคุณศัพท์มักจะอยู่หน้าคำนามวลี เช่น ตัวละคร จาก จักรวาลภาพยนตร์มาร์เวล ในขณะที่เป็นภาษาหลักเช่นคุชราต คำคุณศัพท์จะเป็นไปตามคำนามวลี สิ่งเหล่านี้เป็นการเลื่อนตำแหน่ง เช่น માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો ซึ่งแปลคำต่อคำเป็น: Marvel Cinematic Universe ของตัวละคร
เราเรียกใช้ get_news_tokens
จากคลาส QueryExtractor
ซึ่งจะแยก แหล่งที่มา และ แบบสอบถาม จากอินพุต ภายในระบบจะเรียก _split_text
เพื่อแยกคำนาม ส่วนของคำพูด และข้อความที่แยกวิเคราะห์ทั้งหมดออกจากอินพุต เราย่อคำศัพท์ในแบบสอบถาม
ต่อไป เราจะเรียกใช้ฟังก์ชัน get_news
โดยใช้ แบบสอบถาม กับหนึ่งในคลาส Aggregator
ใน media_aggregator.py ตาม แหล่งที่มา ซึ่งจะส่งคืนรายการบทความข่าวที่ API ข่าวส่งมาเป็นการตอบกลับ ขณะนี้เรารองรับ The Guardian API และ The New York Times API
สุดท้าย เราเลือกรายการแรก (โดยค่าเริ่มต้น) จากรายการ ตอบกลับ และสรุปโดยใช้ฟังก์ชัน shorten_news
เราถือว่าข้อมูลเข้าเป็นหนึ่งในรูปแบบต่อไปนี้
จอห์น เดียร์
โจนออฟอาร์ค
โดนัลด์ ทรัมป์ คือ ใคร?
เจอาร์อาร์ โทลคีน คือ ใคร?
วัตถุภาคแสดงประธาน คือ อะไร?
บอก ฉัน เกี่ยวกับฟิสิกส์ของอนุภาค
โทเค็น | อะไร | เป็น | หนึ่ง | มูลนิธิ กศน | สามเท่า | - |
---|---|---|---|---|---|---|
จุดขาย | คำนาม | กริยา | เดต | พร็อพพีน | คำนาม | พันช์ |
แท็ก | ดับบลิว | วีบีแซด | ดีที | เอ็นเอ็นพี | เอ็นเอ็น | - |
โทเค็น | บอก | ฉัน | เกี่ยวกับ | เขา | - | ผู้ชาย | และ | ที่ | อาจารย์ | ของ | ที่ | จักรวาล | - |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
จุดขาย | กริยา | พรอน | เอดีพี | พรอน | พันช์ | คำนาม | คอนเจ | เดต | คำนาม | เอดีพี | เดต | คำนาม | พันช์ |
แท็ก | วีบี | พีอาร์พี | ใน | พีอาร์พี | ไฮฟ์ | เอ็นเอ็น | ซีซี | ดีที | เอ็นเอ็นเอส | ใน | ดีที | เอ็นเอ็น | - |
หากเราพบกริยาช่วย เราจะถือว่าทุกสิ่งหลังจากเกิดขึ้นครั้งแรกเป็นแบบสอบถาม ดังนั้นใน ตัวอย่างที่ 1 แบบสอบถามคือ RDF triple
มิฉะนั้น เราจะถือว่าคำนามทั้งหมดที่อยู่หลังคำแรกเป็นแบบสอบถาม ดังนั้นใน ตัวอย่างที่ 2 คำถามคือ มนุษย์เป็นนายแห่งจักรวาล
เราเรียกใช้ get_knowledge_tokens
จากคลาส QueryExtractor
ซึ่งจะแยก ข้อความค้นหา
เราส่งต่อสิ่งนี้ไปยังฟังก์ชัน get_gkg
ซึ่งจะสอบถาม Wikipedia API ผ่านแพ็คเกจ wikipedia Python และส่งกลับผลสรุป 5 ประโยคของผลลัพธ์อันดับต้น ๆ
ฉันใช้คลาส FrequencySummarizer
จากการสรุปข้อความด้วย NLTK หรือคุณสามารถใช้ sumy
นอกจากแพ็คเกจ re , bs4 , ร้องขอ , โอเปอเรเตอร์ , collections , heapq , string และ nltk เราจะใช้สิ่งต่อไปนี้
spaCy : โปรดตั้งค่าตามที่กำหนดในเอกสารการติดตั้ง spaCy spaCy จะช่วยเราทำ NLP อย่างรวดเร็ว เราสามารถใช้ NLTK ได้ แต่ spaCy จะช่วยให้คุณทำงานได้เร็วขึ้น เราใช้ spaCy ในโครงการนี้
Wikipedia : สิ่งนี้ช่วยค้นหา Wikipedia API คุณสามารถอ่านเอกสารของแพ็คเกจ Wikipedia Python ได้ที่นี่
สรุป : อันที่ฉันใช้ยืมมาจากบล็อก The Glowing Python ที่เขียนโดย JustGlowing เป็นการสรุปเนื้อหาที่มีความยาว หรือคุณสามารถใช้ sumy
Flask-RESTful, Flask (ทางเลือก) : สิ่งเหล่านี้มีไว้สำหรับสร้างเว็บแอปและใช้งานบอทของเราผ่านบริการเว็บ RESTful
เราเพิ่มหน้าเว็บเจ๋งๆ ที่คุณสามารถสั่งการด้วยเสียงและให้เบราว์เซอร์อ่านเนื้อหาตอบกลับได้ เราใช้ Web Speech API สำหรับสิ่งนี้
เราได้รับบริการเว็บ REST ที่ใช้ Flask และทำงานโดยใช้โค้ดไม่เกิน 20 บรรทัด คลาส QueryService
จัดการคำขอ
ณ ตอนนี้ เราต้องการเพียงการเรียกใช้บริการเพียงครั้งเดียวเพื่อส่งข้อมูลจากเว็บแอปไปยังบอทของเรา ซึ่งทำได้ผ่านฟังก์ชัน post
ของคลาส QueryService
post
ในทางกลับกันจะเรียกใช้ฟังก์ชัน predict
ซึ่งเป็นจุดเริ่มต้นหลักตามที่กล่าวไว้ข้างต้น
ฉันสร้างหน้าเว็บพื้นฐานเพื่อสาธิตบอท ใช้ Web Speech API เพื่อรับอินพุตเสียงและอ่านเนื้อหา คุณสามารถค้นหาไฟล์ index.html ได้ในโฟลเดอร์เทมเพลต ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งแพ็คเกจและไลบรารีที่จำเป็นทั้งหมดแล้ว และบริการบนเว็บนั้นเปิดใช้งานและทำงานอยู่ก่อนที่คุณจะเปิดเว็บไซต์
บอทธรรมดาของเราเข้าใจคำขอในขอบเขตที่จำกัด ไม่สามารถเข้าใจคำขอประเภทอื่น ๆ เช่นดังต่อไปนี้
การร้องขอความรู้ที่มีโครงสร้างแตกต่างกัน
อธิบายให้ฉันฟังว่าการรวม bootstrap คืออะไร
บอกฉันบางอย่างเกี่ยวกับประสาทวิทยาการคำนวณ
คำขอข่าวสารที่มีโครงสร้างแตกต่างออกไป
New York Times พูดอะไรเกี่ยวกับนัดล่าสุดของ Roger Federer?
เกิดอะไรขึ้นในโลกของเทนนิส?
การขอความรู้ประเภทอื่นๆ
ชีสทำอย่างไร?
เจ.เค.โรว์ลิ่งเกิดที่ไหน?
เราสามารถสร้างเมืองลอยฟ้าบนดาวศุกร์ได้หรือไม่?
การปฏิวัติฝรั่งเศสเกิดขึ้นเมื่อใด?
ทำไมดาวพฤหัสบดีจึงมีจุดแดงใหญ่?
คำถามติดตามผลและบริบท
อธิบายให้ฉันฟังว่าการรวม bootstrap คืออะไร
แล้ว: มันเกี่ยวข้องกับป่าสุ่มอย่างไร?
การทำความเข้าใจสิ่ง ที่ อ้างถึงในคำถามติดตามผลอยู่ภายใต้สิ่งที่เรียกว่าการแก้ปัญหาแบบอะนาโฟรา มันเป็นส่วนหนึ่งของการทำความเข้าใจบริบททั้งหมด คำที่ต่างกันหมายถึงสิ่งต่าง ๆ ในบริบทที่ต่างกัน แม้ว่ามนุษย์จะมีความเข้าใจที่ลึกซึ้งเกี่ยวกับสิ่งเหล่านี้ แต่การสอนเครื่องจักรแบบเดียวกันนั้นยากกว่าอย่างเห็นได้ชัด
เราบรรลุเป้าหมายในการสร้างบอทตามกฎบางอย่างที่เรากำหนดไว้ เรายังใช้เทคนิค NLP บางอย่างอีกด้วย ในที่สุด เราก็ปรับใช้บอทของเราบนเว็บแอปพลิเคชัน อย่างไรก็ตาม บอทของเรามีข้อจำกัดประเภทคำถามที่สามารถเข้าใจและตอบได้ เหตุใดขอบเขตความเข้าใจจึงแคบนัก?
โดยทั่วไปแล้ว การทำให้คอมพิวเตอร์ เข้าใจ ภาษาอย่างแท้จริงถือเป็นปัญหาหนักของ AI มีสาขาที่เรียกว่า NLU (ความเข้าใจภาษาธรรมชาติ) ภายใน NLP ที่ทุ่มเทให้กับสิ่งนี้
เราสามารถใช้โซลูชันที่ใช้การเรียนรู้ของเครื่องเพื่อให้บอทของเราสามารถเข้าใจคำขอได้หลากหลายมากขึ้น
โปรดอย่าลืมอ่านข้อกำหนดการใช้งาน API ที่ใช้ที่นี่