2011-04-15 2 views
0

Je construis un index inversé, mais je n'arrive pas à obtenir les bonnes fréquences lorsque je vérifie la base de données. J'ai lu partout que vous devriez utiliser un HashMap, mais je ne suis pas sûr si c'est la bonne méthode pour le faire. Des idées?Comment déterminer la fréquence à terme des termes dans chaque document?

public class Tokenize {

public static void createIndex() throws Exception{ 

    ArrayList<Dokument> dok = new QueryHandler().getDokuments(); 
    ArrayList<String> queries = new ArrayList<String>(); 
    ArrayList<String> queries2 = new ArrayList<String>(); 
    HashMap<String, Integer> frek = new HashMap<String, Integer>(); 

    for(int d = 0; d < dok.size(); d++){ 
     String token = ""; 
     int frekvens = 0; 


     try{ 

      Dokument document = dok.get(d); 
      StringTokenizer st = new StringTokenizer(document.dokument()); 
      while (st.hasMoreTokens()) { 


       token = st.nextToken(); 
       token.replaceAll("[']", ""); 
       token.replaceAll("[,]", ""); 
       token.replaceAll("[)]", ""); 
       token.replaceAll("[(]", ""); 
       token.replaceAll("[.]", ""); 
       frekvens ++; 
       frek.put(token, frekvens); 


        queries.add("INSERT IGNORE INTO termindeks (docID, term) values ("+document.docID()+", '"+token+"')"); 
        queries2.add("INSERT IGNORE INTO invertedindeks (term, docID, termfrekvens) values ('"+token+"', "+document.docID()+", "+ frekvens+")"); 


      } 
     } 


     catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println(token); 
     } 
    } 

    String[] ffs = new String[queries.size()]; 
    ffs = queries.toArray(ffs); 
    getDB().runQueriesIgnoreException(queries.toArray(ffs)); 

    String[] ffs2 = new String[queries2.size()]; 
    ffs2 = queries2.toArray(ffs2); 
    getDB().runQueriesIgnoreException(queries2.toArray(ffs2)); 

} 

}

Répondre

2

Vous devriez obtenir la valeur pour le jeton d'abord, incrémenter et de le mettre à nouveau.

Comme dans votre boucle:

Integer frekvens = frek.get(token); //remove the other frekvens as it's not needed - or find a better name for this one ;) 
if(frekvens == null) { frekvens = 0 }; 
frekvens++; 
frek.put(token, frekvens); 
+0

Cela a fonctionné parfaitement, merci beaucoup. – Ostepop

+0

+1 Totalement oublié que get() pouvait renvoyer une valeur null. – helpermethod

1

L'idée est correcte, mais pour autant que je vois, vous ne faites pas l'utilisation correcte de la HashMap. Vous devez obtenir la valeur associée à la clé, à savoir

Integer i = map.get(token); 
i += 1; 
map.put(token, i); 

EDIT

Une autre option serait d'utiliser un AtomicInteger au lieu d'un Integer parce AtomicInteger s sont mutables.

Map<String, AtomicInteger> map = new HashMap<String, AtomicInteger>();  
map.get(token).getAndIncrement(); 
Questions connexes