Domanda

Sono consapevole di SOUNDEX e (doppio) Metaphone, ma questi non mi permetta di prova per la somiglianza delle parole nel loro complesso - per esempio "Ciao" suona molto simile a "Bye", ma entrambi questi metodi li segnerà come completamente diverso.

Ci sono biblioteche in Ruby, o qualsiasi metodo si sappia, che sono in grado di determinare la somiglianza tra due parole? (O un booleano è / non è simile, o numerico 40% simile)

modifica: in più punti bonus se c'è un metodo semplice per 'drop in' un dialetto o una lingua diversa

!
È stato utile?

Soluzione

Credo che si sta descrivendo distanza Levenshtein. E sì, ci sono gemme per questo. Se siete in puro Rubino andare per la gemma di testo.

$ gem install text

La documentazione hanno ulteriori dettagli, ma ecco il punto cruciale di esso:

Text::Levenshtein.distance('test', 'test')    # => 0
Text::Levenshtein.distance('test', 'tent')    # => 1

Se sei ok con estensioni native ...

$ gem install levenshtein

E 'utilizzo è simile . E 'prestazioni sono molto buone. (Gestisce ~ 1000 di ortografia correzioni al minuto sui miei sistemi.)

Se avete bisogno di sapere come simile due parole sono, usa distanza su lunghezza di parola.

Se si desidera un semplice test somiglianza, prendere in considerazione qualcosa di simile:

Non testato, ma dritto in avanti:

String.module_eval do
   def similar?(other, threshold=2)
    distance = Text::Levenshtein.distance(self, other)
    distance <= threshold
  end
end

Altri suggerimenti

Si potrebbe prima pre-elaborare i termini che utilizzano un database thesaurus, che convertirà le parole con significato simile alla stessa parola. Ci sono varie banche dati thesaurus là fuori, purtroppo non sono riuscito a trovare uno libero decente per l'inglese ( http: / /www.gutenberg.org/etext/3202 è quella che ho trovato, ma questo non mostrare ciò che i rapporti le parole specifiche hanno (come simile; opposto; significato alternativo, ecc), quindi tutte le parole sul stessa linea hanno alcuni relazione, ma voi non sanno cosa quel rapporto è)

Ma per esempio per ungherese c'è una buona base di dati thesaurus gratuito, ma non avete soundex / metaphone per i testi ungheresi ...

Se avete il database scrivere un programma che preprocessa i testi non è troppo difficile (in ultima analisi, si tratta di una semplice ricerca-sostituzione, ma si potrebbe desiderare di pre-elaborazione del database utilizzando thesaurus simplex o methaphone troppo)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top