Somiglianza tra due parole


15

Sto cercando una libreria Python che mi aiuti a identificare la somiglianza tra due parole o frasi.

Farò la conversione da audio a testo che si tradurrà in un dizionario inglese o parole non di dizionario (potrebbe essere il nome di una persona o di un'azienda). Successivamente, devo confrontarlo con una o più parole conosciute.

Esempio:

1) Testo al risultato audio: grazie per aver chiamato America Expansion verrà confrontato con American Express .

Entrambe le frasi sono in qualche modo simili ma non uguali.

Sembra che potrei aver bisogno di esaminare quanti caratteri condividono. Qualsiasi idea sarà fantastica. Sembra una funzionalità come la funzione di ricerca "volevi dire" di Google.

Risposte:


14

Il più vicino sarebbe come Jan ha menzionato nella sua risposta, la distanza di Levenstein (anche popolarmente chiamata la distanza di modifica).

Nella teoria dell'informazione e nell'informatica, la distanza di Levenshtein è una metrica di stringa per misurare la differenza tra due sequenze. Informalmente, la distanza di Levenshtein tra due parole è il numero minimo di modifiche a carattere singolo (ovvero inserzioni, cancellazioni o sostituzioni) necessarie per cambiare una parola nell'altra.

È una metrica molto comunemente usata per identificare parole simili. Nltk ha già un'implementazione per la metrica di modifica della distanza, che può essere invocata nel modo seguente:

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

Il codice sopra riportato restituisce 1, poiché solo una lettera è diversa tra le due parole.


1
La distanza di Lavenshtien è l'algoritmo peggiore che puoi usare se la PNL è ciò che intendi fare. Se 2 sinonimi hanno un set di caratteri diverso, LD funzionerà molto male in questi casi.
È una trappola il

8

Oltre alle ottime risposte qui, puoi provare SequenceMatcher nella libreria difflib di 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

Ora considera il codice seguente:

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

Ora puoi confrontare il valore d per valutare la somiglianza.


1
Se ritieni che seq.ratio () sia lento, puoi utilizzare seq.quick_ratio ()
Nabin il

6

Se il tuo dizionario non è troppo grande, un approccio comune è prendere la distanza di Levenshtein, che in sostanza conta quante modifiche devi fare per passare da una parola all'altra. Le modifiche includono la modifica di un personaggio, la rimozione di un personaggio o l'aggiunta di un personaggio. Un esempio da Wikipedia :

lev (gattino, seduto) = 3

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

Ecco alcuni strumenti Python su Wikibooks.

L'algoritmo per calcolare queste distanze non è tuttavia economico. Se hai bisogno di farlo su larga scala, ci sono modi per usare la somiglianza del coseno sui vettori bi-grammo che sono molto più veloci e facili da distribuire se devi trovare corrispondenze per molte parole contemporaneamente. Sono tuttavia solo un'approssimazione a questa distanza.


(+1) per il Lev. metrica della distanza. nltk viene fornito con un'implementazione già pronta. La somiglianza del coseno non è una buona misura della somiglianza delle stringhe IMHO :)
Dawny33

Sono d'accordo che è molto peggio della distanza di Levenshtein ma se hai bisogno di una corrispondenza fuzzy tra 2 set di dati di milioni, puoi effettivamente farlo in un tempo ragionevole a causa della necessità di alcuni trucchi più la moltiplicazione della matrice
Jan van der Vegt

1
@ Dawny33 Non sarei d'accordo. Non solo la somiglianza del coseno ha funzionato molto rapidamente per me, ma anche con molta precisione dato che è stato usato il n-grammo giusto.
Mohit Motwani,

3

Una tecnica antica e ben nota per il confronto è l' algoritmo Soundex . L'idea è di confrontare non le parole stesse ma approssimazioni di come sono pronunciate. In che misura questo effettivamente migliora la qualità dei risultati che non conosco.

Tuttavia, è un po 'strano applicare qualcosa come Soundex ai risultati di un motore di riconoscimento vocale. Prima butti via le informazioni su come sono pronunciate le parole, quindi provi ad aggiungerle di nuovo. Sarebbe meglio combinare queste due fasi.

Quindi, mi aspetto che la tecnologia più avanzata in quest'area lo faccia ed sia una qualche forma di classificazione adattativa, ad esempio basata su reti neurali. Google restituisce recenti ricerche sul riconoscimento vocale con le reti neurali .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.