เหตุใดจึงใช้ n-gram ในการระบุภาษาข้อความแทนที่จะเป็นคำ?


12

ในไลบรารีการระบุภาษาที่ได้รับความนิยมสองเครื่อง Compact Language Detector 2 สำหรับ C ++ และเครื่องตรวจจับภาษาสำหรับ Java ทั้งคู่ใช้ (ตามอักขระ) n-grams เพื่อแยกคุณลักษณะข้อความ ทำไมไม่ใช้ถุงแบบคำ (คำเดียว / พจนานุกรม) และข้อดีและข้อเสียของถุงแบบคำและ n-g คืออะไร

นอกจากนี้การใช้แบบจำลอง n-grams อื่น ๆ ในการจำแนกข้อความมีประโยชน์อะไรบ้าง?

โอ้โห ดูเหมือนว่ามีคำถามที่คล้ายกันที่นี่: เกี่ยวกับการใช้แบบจำลอง Bigram (N-Gram) เพื่อสร้างเวกเตอร์คุณลักษณะสำหรับเอกสารข้อความ

แต่ใครบางคนสามารถให้คำตอบที่ครอบคลุมมากขึ้น? ในกรณีที่มีการระบุภาษาดีกว่า

(หวังว่าฉันจะได้ความหมายของ n-gg และถุงของคำถูกต้องฮ่าฮ่าถ้าไม่ได้โปรดช่วยฉันด้วย)

คำตอบ:


20

ฉันคิดว่าคำตอบที่ละเอียดที่สุดสามารถพบได้ในงานที่กว้างขวางของ Mehryar Mohri ในหัวข้อ นี่คือลิงค์ไปยังหนึ่งในสไลด์บรรยายของเขาในหัวข้อ: http://www.cims.nyu.edu/~mohri/amls/lecture_3.pdf

ปัญหาการตรวจจับภาษาคือภาษามนุษย์ (คำ) มีโครงสร้าง ตัวอย่างเช่นในภาษาอังกฤษมันเป็นเรื่องธรรมดามากสำหรับตัวอักษร 'u' ที่จะตามตัวอักษร 'q' ในขณะที่นี่ไม่ใช่กรณีที่เป็นตัวแปลภาษาอาหรับ ทำงานได้โดยการจับโครงสร้างนี้ ดังนั้นการผสมตัวอักษรบางตัวจึงมีแนวโน้มในบางภาษามากกว่าภาษาอื่น ๆ นี่คือพื้นฐานของการจำแนก n-gram

ในทางตรงกันข้ามคำที่ขึ้นอยู่กับการค้นหาผ่านพจนานุกรมขนาดใหญ่และการจับคู่แม่แบบเป็นหลัก มีข้อเสียเปรียบหลักสองประการ: 1) แต่ละภาษาจะต้องมีพจนานุกรมที่ครอบคลุมของคำในไฟล์ซึ่งจะใช้เวลาค่อนข้างนานในการค้นหาผ่านและ 2) การเรียงคำจะล้มเหลวหากไม่มีคำใน ชุดฝึกอบรมจะรวมอยู่ในชุดทดสอบ

สมมติว่าคุณกำลังใช้ bigrams (n = 2) และมี 26 ตัวอักษรในตัวอักษรของคุณจากนั้นมีเพียง 26 ^ 2 = 676 bigrams ที่เป็นไปได้สำหรับตัวอักษรนั้นซึ่งหลายแห่งจะไม่เกิดขึ้น ดังนั้น "โปรไฟล์" (เพื่อใช้คำของเครื่องตรวจจับภาษา) สำหรับแต่ละภาษาต้องมีฐานข้อมูลขนาดเล็กมาก ลักษณนามของ bag-of-words ในทางกลับกันจำเป็นต้องมีพจนานุกรมฉบับเต็มสำหรับภาษา EACH เพื่อรับประกันว่าสามารถตรวจจับภาษาได้ตามประโยคที่ได้รับ

ดังนั้นในระยะสั้น - แต่ละโปรไฟล์ภาษาสามารถสร้างขึ้นได้อย่างรวดเร็วด้วยพื้นที่ฟีเจอร์ที่ค่อนข้างเล็ก น่าสนใจเพียงแค่ n-gg เท่านั้นเพราะตัวอักษรไม่ได้ถูกวาดในภาษา - นี่เป็นการยกระดับอย่างชัดเจน

หมายเหตุ: สมการทั่วไปสำหรับจำนวน n-grams สำหรับคำคือ l ^ n โดยที่ l คือจำนวนตัวอักษรในตัวอักษร


ฉันเดาว่าสำหรับบางภาษาที่ใกล้เคียงการใช้รายการคำนอกเหนือจาก n-g จะช่วยได้ ฉันเคยเห็นบางครั้งข้อความภาษานอร์เวย์แปลว่าเดนมาร์ก ฉันสงสัยว่า n-grams เป็นวิธีที่ดีในการแยกความแตกต่างระหว่างสองภาษาเหล่านี้
kjetil b halvorsen

ขอบคุณสำหรับคำตอบโดยละเอียด อย่างไรก็ตามฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้ก่อนอื่นคุณสามารถอธิบายได้ว่า 'กระเป๋าคำจะล้มเหลวถ้าไม่มีคำใดในชุดฝึกอบรมที่รวมอยู่ในชุดทดสอบ'? และประการที่สองทำไม CLD2 ใช้ 4 กรัมซึ่งจะส่งผลให้รายการ 456976 สำหรับภาษาอังกฤษเมื่อใช้วิธีการพจนานุกรมอาจทำให้ขนาดของโปรไฟล์ประมาณครึ่งหนึ่ง ( oxforddictionaries.com/words/ เป็นต้น )?
dennis97519

1
@ dennis97519 อีกครั้ง: "bag-of-words ... " สมมติว่าพจนานุกรมของคุณประกอบด้วยคำว่า {"dog", "cat", "turtle", "animal"} สำหรับภาษาอังกฤษและ {"perro", "gato" , "tortuga", "animal"} สำหรับภาษาสเปน พจนานุกรมของคุณจะไม่สามารถจำแนกประโยคต่อไปนี้: "ลาเป็นสัตว์" เพราะคำว่า "สัตว์" ปรากฏในพจนานุกรมทั้งสอง แต่ไม่มีคำอื่น ๆ อยู่ นี่เป็นตัวอย่างที่ดี Re 4-grams: 1) จำไว้ว่าคุณจำเป็นต้องใช้พจนานุกรมสำหรับแต่ละภาษา 2) n-gg มีแนวโน้มที่จะกระจัดกระจาย (ค้นหาได้เร็วขึ้น) และ 3) ตามที่ Dougal กล่าวพวกเขาสามารถแสดงได้เพียงไม่กี่ไบต์
justanotherbrain

1
@loretoparisi - มีการแลกเปลี่ยนสองอย่าง: สิ่งแรกคือระหว่างความซับซ้อนของแบบจำลอง (ขนาดใหญ่ N = ซับซ้อนมากขึ้น) และข้อผิดพลาดการวางนัย (คุณทำได้ดีแค่ไหนในชุดทดสอบบางชุด) - คุณไม่ต้องการให้มากเกินไป การแลกเปลี่ยนที่สองคือความซับซ้อนในการคำนวณ ความซับซ้อนของหน่วยความจำเพิ่มขึ้นแบบทวีคูณเมื่อใช้ N. การฝึกอบรมมักจะเป็นเส้นตรงกับจำนวนคำในข้อความดังนั้นการมีข้อความที่ยาวมากมักไม่ใช่ปัญหา ดังกล่าวข้อความขนาดใหญ่มักจะหมายถึงคำในพจนานุกรมของคุณ D ดังนั้นอีกครั้งความซับซ้อนของหน่วยความจำคือ O (D ^ N) ในทางปฏิบัติมักจะใช้ N ขนาดใหญ่ที่สุดเท่าที่จะทำได้
justanotherbrain

1
@loretoparisi - ติดตามอย่างที่กล่าวไว้ก่อนหน้านี้ N-grams มีแนวโน้มที่จะกระจัดกระจาย แต่นี่ไม่เป็นความจริงเสมอไป หากข้อความของคุณกระจัดกระจายการตรวจสอบความถูกต้องด้วย N ต่างกันเป็นวิธีที่ดีที่สุดในการค้นหา N ที่ดีที่สุด (อีกครั้งด้วยข้อ จำกัด ด้านการคำนวณ)
justanotherbrain

3

ใช้ตัวอักษร N-g แทนคำหลายสาเหตุ:

1) รายการคำศัพท์ที่จำเป็นสำหรับภาษาหนึ่ง ๆ นั้นมีขนาดค่อนข้างใหญ่บางทีอาจเป็น 100,000 ถ้าคุณพิจารณาว่าเร็วเร็วเร็วที่สุดเร็วที่สุดเร็วเร็วถือศีลอด ... เป็นคำที่แตกต่างกันทั้งหมด สำหรับ 80 ภาษาคุณต้องใช้คำศัพท์ประมาณ 80 เท่าใช้พื้นที่มาก - 50+ เมกะไบต์

2) จำนวนทริกเกอร์ตัวอักษรสำหรับตัวอักษร 26 ตัวคือ 26 ** 3 หรือประมาณ 17,000 และสำหรับรูปสี่เหลี่ยม (N = 4) ประมาณ 450,000 ครอบคลุมภาษาทั้งหมดที่ใช้ตัวอักษรนั้น ตัวเลขที่คล้ายกัน แต่ค่อนข้างใหญ่สำหรับ N-grams เป็นตัวอักษรใหญ่กว่า 30-100 ตัวอักษร สำหรับภาษา CJK ที่มีตัวอักษรมากกว่า 4,000 ตัวในสคริปต์ฮัน unigrams (N = 1) เพียงพอ สำหรับสคริปต์ Unicode บางภาษามีเพียงหนึ่งภาษาต่อสคริปต์ (กรีก, อาร์เมเนีย) ดังนั้นจึงไม่จำเป็นต้องใช้ตัวอักษรผสมกัน (เรียกว่า nil-grams N = 0)

3) ด้วยคำพูดคุณไม่มีข้อมูลเลยเมื่อให้คำที่ไม่ได้อยู่ในพจนานุกรมในขณะที่ด้วยตัวอักษร N-GG คุณมักจะมีตัวอักษรที่มีประโยชน์อย่างน้อยสองสามตัวรวมกันภายในคำนั้น

CLD2 ใช้ quadgrams สำหรับสคริปต์ Unicode ส่วนใหญ่ (ตัวอักษร) รวมถึงละติน, Cyrillic และอาหรับ, unigrams สำหรับสคริปต์ CJK, nilgrams สำหรับสคริปต์อื่น ๆ และยังมีจำนวน จำกัด ของคำที่สมบูรณ์ที่ค่อนข้างโดดเด่นและค่อนข้างทั่วไปและคู่คำสำหรับแยกความแตกต่าง ภายในกลุ่มที่มีภาษาที่คล้ายคลึงกันทางสถิติเช่นอินโดนีเซียและมาเลย์ที่ยากลำบาก ตัวอักษรขนาดใหญ่และตรีโกณมิติอาจมีประโยชน์สำหรับการแยกความแตกต่างระหว่างภาษาจำนวนเล็กน้อย (ประมาณแปดภาษาดูhttps://docs.google.com/document/d/1NtErs467Ub4yklEfK0C9AYef06G_1_9NHL5dPuKIH7k/edit) แต่ไม่มีประโยชน์สำหรับการแยกแยะหลายภาษา ดังนั้น CLD2 จึงใช้รูปสี่เหลี่ยมเชื่อมโยงกับชุดค่าผสมแต่ละตัวของภาษาที่เป็นไปได้มากที่สุดสามอันดับแรกที่ใช้ชุดค่าผสมนั้น สิ่งนี้ช่วยให้ครอบคลุม 80 ภาษาด้วยตารางประมาณ 1.5 MB และ 160 ภาษาโดยละเอียดยิ่งขึ้นโดยมีตารางประมาณ 5MB

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