2010-10-06 24 views
7

Sto usando sia il soundexing di Daitch-Mokotoff che Damerau-Levenshtein per scoprire se una voce utente e un valore nell'applicazione sono "uguali".Calcolo di una distanza relativa di Levenshtein - ha senso?

La distanza di Levenshtein dovrebbe essere utilizzata come valore assoluto? Se ho una parola di 20 lettere, una distanza di 4 non è così male. Se la parola ha 4 lettere ...

Quello che sto facendo ora è prendere la distanza/lunghezza per ottenere una distanza che rispecchi meglio la percentuale della parola è stata cambiata.

È un approccio valido/comprovato? O è semplicemente stupido?

+0

Questo non è un approccio molto stupido, è stato utilizzato prima con un certo successo. Ci sono misure migliori, però. –

+0

Quali sono quelli secondo te? –

risposta

6

La distanza di Levenshtein dovrebbe essere utilizzata come valore assoluto?

Sembra che dipenderebbe dalle vostre esigenze. (Per chiarire: la distanza di Levenshtein è un valore assoluto, ma come indicato dall'OP, il valore grezzo potrebbe non essere così utile come per una determinata applicazione come una misura che tiene conto della lunghezza della parola. sono in realtà più interessati a somiglianza della distanza di per sé.)

sto usando sia Daitch-Mokotoff soundexing e Damerau-Levenshtein per scoprire se una voce utente e un valore nell'applicazione sono "lo stesso ".

Suona come si sta cercando di determinare se l'utente destinato il loro ingresso per essere lo stesso di un determinato valore di dati?

Stai facendo il controllo ortografico? o conforme input non valido a un set noto di valori? Quali sono le tue priorità?

  • minimizzare i falsi positivi (Proviamo a assicurarci che tutte le parole suggerite sono molto "simili", e la lista dei suggerimenti è breve)
  • minimizzare i falsi negativi (cercano di fare in modo che la stringa l'utente previsto è nella elenco di suggerimenti, anche se si fa la lista lunga)
  • massimizzare l'accuratezza corrispondente media

si potrebbe finire utilizzando la distanza Levenshtein in un modo per determinare se una parola dovrebbe essere offerto in un elenco di suggerimenti; e un altro modo per determinare come ordinare l'elenco dei suggerimenti.

Mi sembra, se ho dedotto correttamente il tuo scopo, che la cosa principale che vuoi misurare è somiglianza piuttosto che la differenza tra due stringhe. Come tale, è possibile utilizzare Jaro or Jaro-Winkler distance, che tiene conto della lunghezza delle corde e il numero di caratteri in comune:

Il Jaro distanza dj di due date stringhe s1 e s2 è

(m/|s1| + m/|s2| + (m - t)/m)/3 

dove:

  • m è il numero di caratteri corrispondenti
  • t è il numero di trasposizioni

Jaro-Winkler distanza usa un prefisso scala p che dà più favorevoli feedback per le stringhe che corrispondono dalla inizio per una lunghezza prestabilita del prefisso l.

+0

Come voglio scoprire come due parole simili sono (la velocità non è un problema), Jaro Winkler sembra un buon suggerimento. –

+0

@Joseph: Sembra una buona applicazione per Jaro-Winkler, che ha la bella proprietà che va da 0 (nessuna somiglianza) a 1 (corrispondenza esatta), quindi puoi dire ad es. qualcosa di più di 0.9 somiglianza è abbastanza vicino. È quindi possibile modificare tale soglia in base al test dell'utente. – LarsH

0

La distanza di levenshtein è un valore relativo tra due parole. Confrontando il LD alla lunghezza non è rilevante per es

cat -> scat = 1 (75% simile ??)

differenza -> differenze = 1 (90% simile ??)

Entrambi questi le parole hanno una differenza di lev di 1, cioè differiscono di un carattere, ma se confrontate con le loro lunghezze, il secondo set sembra essere "più" simile.

che uso soundexing classificare parole che hanno lo es stessa distanza lev

cat e fat entrambi hanno un LD di 1 rispetto al kat, ma la parola è più probabile che sia kat di grasso quando utilizza soundex (supponendo la parola è scritta in modo non corretto, non digitata in modo errato!)

Quindi la risposta breve è semplicemente utilizzare la distanza di lev per determinare la somiglianza.

+0

Non vedo come il tuo esempio dimostri il tuo punto che "Il confronto tra LD e lunghezza non è rilevante." "cat" e "scat" sono più diversi da "differenza" e "differenze" anche se hanno lo stesso LD – Davy8

+0

Penso che nel mio caso faccia la differenza. Soprattutto perché uso soundexing ... (vedi il mio commento alla risposta di LarsH qui sotto). –