ความคล้ายคลึงกันระหว่างสองคำ


15

ฉันกำลังมองหาห้องสมุด Python ที่ช่วยฉันระบุความเหมือนกันระหว่างสองคำหรือประโยค

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

ตัวอย่าง:

1) ข้อความที่จะส่งผลเสียง: ขอขอบคุณสำหรับการโทรขยายอเมริกา จะได้รับเมื่อเทียบกับอเมริกันเอ็กซ์เพรส

ทั้งสองประโยคมีความคล้ายคลึงกัน แต่ไม่เหมือนกัน

ดูเหมือนว่าฉันอาจต้องดูจำนวนตัวอักษรที่พวกเขาแบ่งปัน ความคิดใด ๆ ที่จะดี ดูเหมือนว่าฟังก์ชั่นเช่นการค้นหาของ Google "คุณหมายถึง" คุณสมบัติ

คำตอบ:


14

ที่ใกล้เคียงที่สุดจะเป็นเหมือนแจนพูดถึงคำตอบของการหายใจระยะทางของ Levenstein (เรียกอีกอย่างว่าการแก้ไขระยะทาง)

ในทฤษฎีข้อมูลและวิทยาการคอมพิวเตอร์ระยะทาง Levenshtein เป็นตัวชี้วัดสตริงสำหรับการวัดความแตกต่างระหว่างสองลำดับ อย่างไม่เป็นทางการระยะทาง Levenshtein ระหว่างสองคำคือจำนวนขั้นต่ำของการแก้ไขอักขระเดียว (เช่นการแทรกการลบหรือการแทนที่) ที่จำเป็นในการเปลี่ยนคำหนึ่งไปเป็นอีกคำหนึ่ง

มันเป็นตัวชี้วัดที่ใช้กันมากสำหรับการระบุคำที่คล้ายกัน Nltk มีการนำไปใช้แล้วสำหรับการวัดระยะทางแก้ไขซึ่งสามารถเรียกใช้ด้วยวิธีต่อไปนี้:

import nltk
nltk.edit_distance("humpty", "dumpty")

โค้ดด้านบนจะกลับมา1เนื่องจากมีเพียงหนึ่งตัวอักษรที่แตกต่างกันระหว่างสองคำ


1
ระยะทางของ Lavenshtien เป็นอัลกอริทึมที่แย่ที่สุดที่คุณสามารถใช้ได้หาก NLP เป็นสิ่งที่คุณตั้งใจจะทำ หากคำพ้องความหมาย 2 คำมีชุดอักขระที่แตกต่างกัน LD จะทำงานได้ไม่ดีนักในกรณีเหล่านี้
มันคือกับดัก

8

นอกเหนือจากการตอบสนองที่ดีมากที่นี่คุณอาจลอง SequenceMatcher ในไลบรารี difflib python

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

พิจารณารหัสด้านล่าง:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

ตอนนี้คุณอาจเปรียบเทียบค่า d เพื่อประเมินความคล้ายคลึงกัน


1
หากคุณรู้สึกว่า seq.ratio () ช้าคุณสามารถใช้ seq.quick_ratio () ได้
Nabin

6

หากพจนานุกรมของคุณไม่ใหญ่เกินไปวิธีการทั่วไปคือการใช้ระยะทางของ Levenshtein ซึ่งโดยทั่วไปจะนับจำนวนการเปลี่ยนแปลงที่คุณต้องทำเพื่อให้ได้มาจากคำหนึ่งไปอีกคำหนึ่ง การเปลี่ยนแปลงรวมถึงการเปลี่ยนอักขระลบอักขระหรือเพิ่มอักขระ ตัวอย่างจากWikipedia :

lev (ลูกแมว, นั่ง) = 3

  • k itten -> s itten
  • sitt e n -> sitt i n
  • sittin -> sittin g

นี่คือบางส่วนของ Python ที่ใช้ใน Wikibooks

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


(+1) สำหรับ Lev การวัดระยะทาง nltk มาพร้อมกับการติดตั้งพร้อมใช้งาน โคไซน์คล้ายคลึงกันไม่ได้เป็นดีสตริงคล้ายคลึงกันวัด IMHO :)
Dawny33

ฉันยอมรับว่ามันเลวร้ายยิ่งกว่าระยะทางของ Levenshtein แต่ถ้าคุณต้องการการจับคู่แบบคลุมเครือระหว่าง 2 ชุดข้อมูลนับล้านมันสามารถทำได้ในเวลาที่เหมาะสมเนื่องจากต้องการเทคนิคและการคูณเมทริกซ์
Jan van der Vegt

1
@ Dawny33 ฉันจะไม่เห็นด้วย ความคล้ายคลึงกันของโคไซน์ไม่เพียงทำงานได้อย่างรวดเร็วมากสำหรับฉัน แต่ยังแม่นยำมากเนื่องจากใช้ n-gram ที่เหมาะสม
Mohit Motwani

3

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

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

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

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