İki kelime arasındaki benzerlik


15

İki kelime veya cümle arasındaki benzerliği belirlememe yardımcı olan bir Python kütüphanesi arıyorum.

Bir İngilizce sözlük veya sözlük olmayan sözcük (ler) (Bu bir Kişi veya Şirket adı olabilir) ile sonuçlanacak Ses-Metin dönüştürme yapacağım Bundan sonra, bilinen bir kelime veya kelime ile karşılaştırmak gerekir.

Misal:

1) Metin ses sonucuna: America Expansion'ı aradığınız için teşekkürler American Express ile karşılaştırılacaktır .

Her iki cümle de bir şekilde benzer ancak aynı değil.

Görünüşe göre kaç karakter paylaştıklarına bakmam gerekebilir. Herhangi bir fikir harika olacak. Google arama "demek istediniz" özelliği gibi bir işleve benziyor.

Yanıtlar:


14

En yakını Jan'ın bu cevabında bahsettiği gibi, Levenstein'ın mesafesini (halk arasında düzenleme mesafesi olarak da bilinir).

Bilgi teorisi ve bilgisayar bilimlerinde Levenshtein mesafesi, iki dizi arasındaki farkı ölçmek için bir dizi metriktir. Gayri resmi olarak, iki kelime arasındaki Levenshtein mesafesi, bir kelimeyi diğerine değiştirmek için gereken minimum tek karakterli düzenleme sayısıdır (yani, ekleme, silme veya değiştirme).

Benzer kelimeleri tanımlamak için yaygın olarak kullanılan bir metriktir. Nltk, mesafe ölçüm metriği için şu şekilde çağrılabilecek bir uygulamaya zaten sahip:

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

Yukarıdaki kod 1, iki kelime arasında yalnızca bir harf farklı olduğu için geri dönecektir .


2
Lavenshtien'in mesafesi, NLP yapmak istediğiniz şeyse kullanabileceğiniz en kötü algoritmadır. 2 eşanlamlı farklı bir karakter kümesine sahipse, LD bu durumlarda çok kötü performans gösterir.
Bu bir tuzak

8

Buradaki çok iyi yanıtların yanı sıra, difflib python kütüphanesinde SequenceMatcher'ı deneyebilirsiniz.

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

Şimdi aşağıdaki kodu düşünün:

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

Şimdi benzerliği değerlendirmek için d değerini karşılaştırabilirsiniz.


1
Seq.ratio () yavaş olduğunu düşünüyorsanız, seq.quick_ratio ()
Nabin

6

Sözlüğünüz çok büyük değilse, ortak bir yaklaşım Levenshtein mesafesini almaktır, bu temelde bir kelimeden diğerine kaç değişiklik yapmanız gerektiğini sayar. Değişiklikler arasında bir karakteri değiştirme, bir karakteri kaldırma veya bir karakter ekleme yer alır. Wikipedia'dan bir örnek :

lev (kedi yavrusu, oturma) = 3

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

İşte Wikibooks'ta bazı Python uygulamaları.

Ancak bu mesafeleri hesaplamak için kullanılan algoritma ucuz değildir. Bunu büyük ölçekte yapmanız gerekiyorsa, aynı anda çok sayıda kelime için eşleşme bulmanız gerekiyorsa, çok daha hızlı ve dağıtımı kolay olan bi-gram vektörlerde kosinüs benzerliğini kullanmanın yolları vardır. Ancak bunlar sadece bu mesafeye bir yaklaşımdır.


(+1) için Lev. mesafe ölçüsü. nltk hazır bir uygulama ile birlikte gelir. Kosinüs benzerliği iyi bir dize benzerlik ölçüsü değildir IMHO :)
Dawny33

Levenshtein mesafesinden çok daha kötü olduğunu kabul ediyorum, ancak milyonlarca 2 veri kümesi arasında bulanık eşleşmeye ihtiyacınız varsa, bunu bazı hileler artı matris çarpımı gerektiğinden makul bir süre içinde yapabilirsiniz
Jan van der Vegt

1
@ Dawny33 Katılmıyorum. Kosinüs benzerliği benim için çok hızlı değil, aynı zamanda doğru n-gramın kullanıldığı göz önüne alındığında da çok doğru çalıştı.
Mohit Motwani

3

Karşılaştırma için eski ve iyi bilinen bir teknik Soundex algoritmasıdır. Fikir, kelimelerin kendilerini değil, nasıl telaffuz edildiklerini karşılaştırmaktır. Bunun aslında bilmediğim sonuçların kalitesini ne ölçüde artırdığı.

Bununla birlikte, konuşmadan metne tanıma motorunun sonuçlarına Soundex gibi bir şey uygulamak biraz garip geliyor. Önce kelimelerin nasıl telaffuz edildiği hakkında bilgi atarsınız, daha sonra tekrar eklemeye çalışırsınız. Bu iki fazı birleştirmek daha iyi olur.

Bu nedenle, bu alandaki en son teknolojinin bunu yapmasını ve örneğin sinir ağlarına dayanan bir tür uyarlanabilir sınıflandırma olmasını bekliyorum. Google, Sinir Ağları ile Konuşma Tanıma konusundaki son araştırmaları geri döndürmektedir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.