ฉันจะจัดกลุ่มสตริงตามธีมทั่วไปได้อย่างไร


10

ฉันกำลังพยายามจัดกลุ่มเช่นสตริงเกี่ยวกับการเขียนโปรแกรมกับสตริงอื่น ๆ เกี่ยวกับการเขียนโปรแกรมสตริงเกี่ยวกับฟิสิกส์กับสตริงอื่น ๆ เกี่ยวกับฟิสิกส์ ฯลฯ สำหรับหัวข้อที่หลากหลาย แม้จะมีแง่มุมทางภาษาที่ชัดเจนทางทฤษฎีของปัญหา แต่ฉันกำลังมองหาที่จะทำสิ่งนี้โดยใช้การเขียนโปรแกรม / ซอฟต์แวร์

บทสรุป:ด้วยสตริงจำนวนมากฉันจะจัดกลุ่มตามธีมความหมายได้อย่างไร

แอปพลิเคชันเฉพาะ:ฉันมีคำถามแบบไม่สำคัญประมาณ 200,000 คำถามที่ฉันต้องการจัดหมวดหมู่เป็นกลุ่มร่วมกัน (รถยนต์คอมพิวเตอร์การเมืองแคนาดาอาหารบารักโอบา ฯลฯ )

สิ่งที่ฉันได้ดู: Wikipedia มีรายการชุดเครื่องมือประมวลผลภาษาธรรมชาติ (สมมติว่าสิ่งที่ฉันพยายามทำจริง ๆ แล้วเรียกว่า NLP) ดังนั้นฉันจึงดูบ้าง แต่ดูเหมือนไม่มีใครทำอะไรที่คล้ายกับความต้องการของฉัน

หมายเหตุ:มีการชี้ให้เห็นว่าการทำเช่นนี้ต้องใช้ความรู้เพิ่มเติม (เช่น Porsche เป็นรถยนต์ส่วน C ++ เป็นภาษาโปรแกรม) ฉันคิดว่าจำเป็นต้องใช้ข้อมูลการฝึกอบรม แต่ถ้าฉันมีเพียงรายการคำถามและคำตอบฉันจะสร้างข้อมูลการฝึกอบรมได้อย่างไร จากนั้นฉันจะใช้ข้อมูลการฝึกอบรมอย่างไร

หมายเหตุเพิ่มเติม:หากการจัดรูปแบบปัจจุบันของความช่วยเหลือ Q & As ของฉัน (แม้ว่าจะดูเหมือนว่า JSON มันเป็นไฟล์ข้อความดิบ):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

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

และหมายเหตุเพิ่มเติม:ฉันไม่รู้จริง ๆ ว่าจะต้องมีกี่หมวดหมู่ (อย่างน้อย 10-20) เพราะฉันไม่ได้อ่านคำถามทั้งหมดด้วยตัวเอง ฉันคาดหวังว่าจะมีการ จำกัด จำนวนอย่างใดในระหว่างการจัดหมวดหมู่ ไม่ว่าในกรณีใดฉันสามารถสร้างหมวดหมู่ได้ด้วยตนเองหลายครั้ง


คุณใช้แครอทอย่างไร จากการอ่านสั้น ๆ ของฉันเกี่ยวกับมันดูเหมือนว่าควรจัดการ 200k บันทึกได้อย่างง่ายดาย

ใช้เวลานานกว่าที่ฉันคิดไว้มากและบังคับให้ฉันเพิ่มการจัดสรรหน่วยความจำเริ่มต้นของ JVM เป็น 1024m และเพิ่มหน่วยความจำสูงสุดเป็น 2048m มันไม่ได้เลวร้ายอย่างที่ฉันอาจจะทำเสียงนั้น

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

เอ๊ะคุณกำลังทำการประมวลผลจำนวนมาก การให้ JVM ไม่ใช่ปัญหาจริงๆ ใช้เวลานานแค่ไหน? คุณโหลดเอกสารจากที่ใด แหล่งที่กำหนดเอง?

ฉันใช้เวลาประมาณ 10 นาที แต่ฉันเห็นด้วยว่าการประมวลผลจำนวนมากนั้นใช้เวลานานและต้องใช้หน่วยความจำมาก แม้ว่าการพูดสำลักทั้งหมดเกี่ยวกับการสำลักไม่ใช่ปัญหา แต่มีข้อความเพิ่มเติม

คำตอบ:


4

นี่เป็นปัญหาที่ค่อนข้างเป็นมาตรฐานใน NLP และคำศัพท์ Google ที่คุณกำลังมองหาคือ "การสร้างแบบจำลองหัวข้อ" แม้ว่าสายอักขระของคุณจะค่อนข้างสั้นคุณอาจประสบความสำเร็จในการจัดสรร Latent Dirichletหรือวิธีการที่คล้ายกัน มีการโพสต์บล็อกที่ดีโดย Edwin Chen ที่นี่ซึ่งวางแนวคิดทั่วไปเบื้องหลังอัลกอริทึม รายละเอียดของการดำเนินการครอบคลุมอยู่ในหมายเหตุนี้โดย Yi Wang

หากคุณกำลังมองหาวิธีแก้ปัญหาแบบ off-the-shelf ฉันขอแนะนำให้ลองใช้topicmodelsแพ็คเกจสำหรับ R เนื่องจากเป็นอินเทอร์เฟซที่ดีพอสมควรสำหรับทั้ง LDA และรูปแบบหัวข้อความสัมพันธ์ที่ซับซ้อนยิ่งขึ้น นอกจากนี้ยังมีรายการที่ดีของการใช้งานการเก็บรักษาโดยเดวิด Mimno ที่นี่


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

ฉันใช้แพ็คเกจ R topicmodels แล้ว แน่นอนผมอยากแนะนำให้มันมากกว่ากลิ้งรหัสของคุณเอง - มีเอกสารบางอย่างกับเป็นตัวอย่างที่ทำงานที่cran.r-project.org/web/packages/topicmodels/vignettes/... การจัดรูปแบบเฉพาะของแต่ละเอกสารนั้นไม่สำคัญเลยเพราะทุกอย่างจะลดลงเป็นการนำเสนอ "คำศัพท์" เพียงแค่ใส่ข้อความที่เกี่ยวข้องทั้งหมดไว้ในสายเดียว
Martin O'Leary

4

คุณกำลังพยายามแก้ไขปัญหาที่สองที่นี่

ปัญหาที่ 1: จัดหมวดหมู่สตริงคำถามในหมวดหมู่ที่เหมาะสม

ปัญหาที่ 2: สร้างหมวดหมู่ที่เหมาะสม

ปัญหาแรกสามารถทำได้โดยเรียกว่าอัลกอริทึมภายใต้การดูแลตัวแยกประเภทจำนวนมากสามารถให้ความแม่นยำและประสิทธิภาพที่ดีมาก อย่างไรก็ตามปัญหาที่ 2 การสร้างหมวดหมู่จากอากาศบาง (ข้อมูลจำนวนมาก) นั้นค่อนข้างยุ่งยากกว่ามาก นี่เป็นปัญหาที่ไม่ได้รับอนุญาตเนื่องจากมีข้อมูลจำนวนมากที่คอมพิวเตอร์ตัดสินใจโดยอัตโนมัติตามหมวดหมู่ที่กำหนดเกณฑ์บางอย่าง ตามหลักการแล้วเกณฑ์เหล่านี้และอัลกอริทึมควรจัดระเบียบข้อมูลของคุณเป็นกลุ่มอย่างเรียบร้อย สิ่งเหล่านี้อาจมีป้ายกำกับ อย่างไรก็ตามเนื่องจากเป็นงานที่ยากกว่านี้มากฉันจึงบอกว่าไม่มีวิธีการแบบดรอปดาวน์ที่ยอมรับได้ซึ่งจะให้ผลลัพธ์ที่ดีโดยไม่ต้องใช้ความพยายามในการปรับแต่งมากมายซึ่งน่าจะต้องใช้ผู้เชี่ยวชาญมากที่สุด

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

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

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

นี่แปลว่าคุณต้องติดแท็ก 500 คำถามด้วยมือจริงหรือ ใช่และไม่. มีความเป็นไปได้ที่จะใช้ผลลัพธ์ระดับกลางและความชาญฉลาดของตัวแยกประเภท "bootstrap" มันยังคงทำงานด้วยตนเองและเมื่อคุณคิดว่ามัน 500 คำถามจะใช้เวลาไม่นานในการติดแท็ก ความฉลาดที่นี่สามารถให้ผลลัพธ์ที่แย่กว่าการขยันหมั่นเพียร

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

TL; DR

สรุปนี่คือวิธีที่ฉันจะทำมัน

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

คำถามเล็ก ๆ ข้อหนึ่ง: คุณพูดว่า "ประมาณ 500 คำถาม" สำหรับข้อมูลการฝึกอบรมและการติดแท็กด้วยตนเอง แต่ยัง "ฉันอาจถูกปิดด้วยลำดับความสำคัญ" ดังนั้นถ้าฉันจะใช้คำถาม 5k หรือ 50k แทนฉันจะยังคง ติดแท็กด้วยตนเองที่มีจำนวนมาก?

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

ลำดับความสำคัญฉันหมายถึง 50-500-5000 ฉันไม่คิดว่าคุณจะต้องจำแนก 50k นั่นคือ 1/4 ของคลังทั้งหมดของคุณ! หากคำถาม 500 ข้อนั้นน้อยเกินไปก็เป็นไปได้ที่จะบูตตัวแยกประเภท ความคิดที่นี่คือคุณฝึกอบรมตัวจําแนกในคลังเริ่มต้นขนาดเล็ก (เช่น 500 ของคุณ) แล้วติดแท็กส่วนที่เหลือ ตอนนี้คุณสามารถใช้บางกรณีที่ตัวจําแนกมีความมั่นใจมากที่จะฝึกลักษณนามลักษณนามใหม่ที่มีขนาดใหญ่ขึ้น

อีกสิ่งสำคัญที่ควรคำนึงถึง; ประสิทธิภาพของตัวจําแนกจำนวนมากไม่เชิงเส้นในปริมาณข้อมูลการฝึกอบรม แต่โดยทั่วไปแล้วจะเป็น sigmoid เหมือนเส้นโค้ง นั่นหมายความว่าคำถาม 500 ข้อที่ติดแท็กอาจเป็นประโยชน์ที่ดีพอ ๆ กับ 5,000 คำแนะนำของฉันคือการทำงานในขั้นตอนเล็ก ๆ

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