Question

Je besoin d'une sorte de solution en Java pour les exigences suivantes:

  1. Rechercher dans un texte pour certains termes (chaque terme peut être 1-3 mots). Par exemple: { « Bonjour tout le monde », « bonjour »}. Le match doit être exacte.
  2. Il y a environ 500 types de termes groupes dont chacun contient environ 30 termes.
  3. Chaque texte peut contenir jusqu'à 4000 mots.

La performance est une question importante.

Merci, Rod

Était-ce utile?

La solution

Je l'ai fait quelque chose de similaire pour un filtre anti-spam sur mesure.

Une technique que je trouve être à la fois simple et rapide est:

  1. Diviser le fichier d'entrée en mots d'abord.
  2. Appel intern() sur chaque mot, pour simplifier les comparaisons à l'étape 3.
  3. Créer une classe Term, encapsulant un tableau jusqu'à trois chaînes. Sa méthode de equals() peut faire la comparaison du pointeur sur les chaînes, plutôt que d'appeler String.equals(). Créer une instance de Term pour chaque groupe de 2 ou 3 mots consécutifs dans l'entrée.
  4. Utilisez un Multimap (de Google Collections) pour cartographier chaque terme à l'ensemble des fichiers dans lesquels il apparaît.

Autres conseils

Il semble y avoir deux parties à ce sujet. Déterminer un algorithme décent, et sa mise en œuvre en Java. (Pour le moment, nous allons mettre de côté l'idée que sûrement « là-bas » quelqu'un a déjà mis en oeuvre, et vous pouvez probablement trouver quelques idées.)

On dirait que l'on veut éviter la répétition de travail coûteux. mais on ne sait pas où les coûts seraient. Donc je suppose que vous devez être prêt à référence quelques appraoches candidats. aussi à l'esprit ce qui est « assez bon ».

Démarrer wih la chose la plus simple que vous pouvez penser à cela fonctionne. Mesure le. Vous pouvez obtenir le résultat surprenant que c'est assez bon. Arrête toi là! Par exemple, cela est vraiment stupide:

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

 for each term
     use regexp to find matches in text

mais il pourrait bien donner une seconde sous-temps de réponse. Est-ce que vos utilisateurs vraiment soin si vous avez pris une réponse 200ms jusqu'à 100ms? Combien seraient-ils payer pour cela?

Une autre approche. Je me demande cela est plus rapide?

 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)

En ce qui concerne la mise en œuvre en Java. si vous avez besoin de problème distinct poser des questions spécifiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top