2009-10-14 7 views
0

je besoin d'une sorte de solution en Java pour les exigences suivantes:Classification de texte en Java

  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 exact.
  2. Il existe environ 500 types de termes groupes contiennent chacun environ 30 termes.
  3. Chaque texte peut contenir jusqu'à 4000 mots.

La performance est un problème important.

Merci, Rod

+3

Sonne bien. Alors qu'avez-vous fait pour tenter de résoudre cela? – AlbertoPL

Répondre

3

J'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. de Split 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 equals() peut faire une comparaison de pointeur sur les chaînes, plutôt que d'appeler String.equals(). Créez une instance Term pour chaque groupe de 2 ou 3 mots consécutifs dans l'entrée.
  4. Utilisez un Multimap (de Google Collections) pour mapper chaque terme à l'ensemble des fichiers dans lesquels il apparaît.
+0

+1 bonne réponse, et l'idée interne est un indice d'implémentation utile. – djna

+0

Merci. Briser le texte en termes est une bonne idée.La complexité est raisonnable de cette façon (~ nombre de mots dans le texte * nombre maximum de mots dans le terme (dans mon cas 3)). – Rod

0

Il semble y avoir deux parties à cela. Comprendre un algorithme décent, et l'implémenter en Java. (Pour le moment, laissons de côté l'idée que quelqu'un a déjà implémenté cela, et vous pouvez probablement trouver quelques idées.)

On dirait que nous voulons éviter les répétitions coûteuses. mais on ne sait pas où les coûts seraient. Donc, je suppose que vous devrez être prêt à comparer quelques appraisonnements candidats. Ayez également à l'esprit ce qui est "assez bon".

Commencez par la chose la plus simple à laquelle vous pouvez penser. Mesure le. Vous pourriez obtenir le résultat surprenant que c'est assez bon. Arrête toi là! Par exemple, c'est vraiment bête:

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

for each term 
    use regexp to find matches in text 

mais cela pourrait bien donner un temps de réponse inférieur à la seconde. Est-ce que vos utilisateurs se soucieraient vraiment si vous preniez une réponse de 200ms jusqu'à 100ms? Combien paieraient-ils pour cela?

Une autre approche. Je me demande de ceci 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) 

Comme pour l'implémentation en Java. Séparez des problèmes posez des questions spécifiques si vous en avez besoin.

Questions connexes