Domanda

Ho bisogno di una sorta di soluzione in Java per i seguenti requisiti:

  1. Cerca in un testo per determinati termini (ogni termine può essere 1-3 parole). Ad esempio: {"Hello World", "Hello"}. La partita deve essere esatta.
  2. Esistono circa 500 tipi di termini gruppi contengono ciascuno circa 30 termini.
  3. Ogni testo potrebbe contenere fino a 4000 parole.

Le prestazioni sono un problema importante.

Grazie, Rod

È stato utile?

Soluzione

Ho fatto qualcosa di simile per un filtro spam su misura.

Una tecnica che ho trovato sia semplice che veloce è:

  1. Dividi prima il file di input in parole.
  2. Chiamata intern() Su ogni parola, per semplificare i confronti nel passaggio 3.
  3. Creare un Term classe, incapsulando una matrice di un massimo di tre stringhe. Suo equals() Il metodo può fare un confronto puntatore sulle stringhe, anziché chiamare String.equals(). Creare un Term istanza per ciascun gruppo di 2 o 3 parole consecutive nell'input.
  4. Usare un Multimap (dalle raccolte di Google) per mappare ogni termine al set di file in cui appare.

Altri suggerimenti

Sembra che ci siano due parti a questo. Immaginare un algoritmo decente e implementarlo in Java. (Per il momento mettiamo da parte l'idea che sicuramente "là fuori" qualcuno ha già implementato questo e probabilmente puoi trovare alcune idee.)

Sembra che vogliamo evitare di ripetere un lavoro costoso. Ma non è chiaro dove sarebbero i costi. Quindi immagino che dovrai essere preparato a confrontare alcune valutazioni dei candidati. Tieni anche in mente ciò che è "abbastanza buono".

Inizia con la cosa più semplice a cui puoi pensare. Misuralo. Potresti ottenere il risultato sorprendente che è abbastanza buono. Fermati là! Ad esempio, questo è davvero stupido:

 read text into String (4k, that's not too big)

 for each term
     use regexp to find matches in text

Ma potrebbe benissimo dare un tempo di risposta secondario. Ai tuoi utenti importa davvero se avessi una risposta di 200 ms a 100 ms? Quanto pagherebbero per questo?

Un altro approccio. Mi chiedo che questo sia più veloce?

 prepare a collection of terms keyed by first word

 tokenize the text

 for each token
    find terms that match
    check for match (using look ahead for multi-word terms)

Per quanto riguarda l'implementazione in Java. Problema separato Poni domande specifiche se necessario.

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