Domanda

Ho un sito che è ricercabile tramite Lucene. Ho notato da tronchi che a volte gli utenti non trovano ciò che stanno cercando, perché entrano in un termine singolare, ma solo la versione plurale di questo termine viene utilizzato sul sito. Vorrei che la ricerca per trovare usi di altre forme di una parola pure. Questo è un problema che sono sicuro che è stato risolto più volte, quindi quali sono le migliori pratiche per questo?

Nota:. Questo sito ha solo contenuti in inglese

Alcuni approcci Ho pensato:

  1. Cercare la parola in una sorta di file del Thesaurus per determinare forme alternative di una data parola.
    • Alcuni esempi:
      • Ricerche per "auto", aggiungere anche "Cars" alla query.
      • Ricerche per "trasportare", anche aggiungere "porta" e "portato" alla query.
      • Ricerche per "piccoli", anche aggiungere "più piccolo" e "più piccolo" alla query.
      • Ricerche per "possibile", anche aggiungere "non può", "non può", "lattine", e "in scatola" alla query.
      • e dovrebbe funzionare in senso inverso (vale a dire la ricerca di "porta" dovrebbe aggiungere "portare" e "portato").
    • Svantaggi:
      • non funziona per molte nuove parole tecniche a meno che il dizionario / lessico è aggiornato frequentemente.
      • Non sono sicuro circa le prestazioni di cercare il file del thesaurus.
  2. Genera le forme alternative algoritmicamente, sulla base di alcune euristiche.
    • Alcuni esempi:
      • Se la parola termina in "s" o "es" o "ed" o "er" oppure "est", far cadere il suffisso
      • Se la parola termina in "i" o "ied" o "ier" o "IEST", convertire a "y"
      • Se la parola termina in "y", a "convertire i", "IED", "Ier", e "iest"
      • Prova ad aggiungere "s", "es", "ER" e "est" per la parola.
    • Svantaggi:
      • Genera un sacco di non-parole per la maggior parte gli ingressi.
      • Percepita un hack.
      • Sembra che qualcosa che si trovano sul TheDailyWTF.com. :)
  3. Qualcosa di molto più sofisticato?

Sto pensando di fare una sorta di combinazione dei primi due approcci, ma non sono sicuro dove trovare un file del Thesaurus (o come si chiama, come "thesaurus" non è giusto, ma non è "dizionario").

È stato utile?

Soluzione

Si consideri tra cui il PorterStemFilter nella vostra analisi pipeline. Assicurarsi di eseguire la stessa analisi su query che viene utilizzato quando si costruisce l'indice.

Ho anche usato il Lancaster derivante algoritmo con buoni risultati. Utilizzando la PorterStemFilter come guida, è facile da integrare con Lucene.

Altri suggerimenti

Parola derivante funziona bene per l'inglese, ma per le lingue in cui parola deriva è quasi impossibile (come il mio) opzione # 1 è praticabile. So di almeno una tale implementazione per la mia lingua (islandese) per Lucene che sembra funzionare molto bene.

Alcuni di questi sembrano idee abbastanza carino. Personalmente, vorrei solo aggiungere alcuni tag per l'interrogazione (query trasformazione) per renderlo fuzzy, oppure è possibile utilizzare la funzione interna FuzzyQuery , che utilizza Levenshtein modificare le distanze, che aiuterebbe per mispellings.

Utilizzando ricerca fuzzy ' tag di query ', Levenshtein è anche usato. Prendere in considerazione una ricerca per 'auto'. Se si modifica la query per 'auto ~', troverà 'auto' e 'auto' e così via. Ci sono altre trasformazioni per la query che dovrebbe gestire quasi tutto il necessario.

Se si lavora in un settore specializzato (ho fatto con l'orticoltura) o con un linguaggio che does't gioca bene con i metodi derivanti normali è possibile utilizzare la registrazione di query per creare una tabella derivante manuale.

Basta creare una parola -> mappatura staminali per tutte le mancate corrispondenze si può pensare / la gente sta cercando, poi, quando l'indicizzazione o la ricerca sostituire qualsiasi parola che si verifica nella tabella con il gambo appropriata. Grazie a query nella cache questa è una soluzione piuttosto a buon mercato.

Stemming è un modo abbastanza standard per affrontare questo problema. Ho scoperto che la Stemmer Porter è modo di aggressivo per parola chiave di ricerca standard. Si finisce per confondendo insieme le parole che hanno significati diversi. Provate l'algoritmo KStemmer.

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