2011-04-15 119 views
0

我正在建立一個倒排索引,但當我檢查數據庫時,我似乎無法得到正確的頻率。我到處讀到你應該使用HashMap,但我不確定這是否是正確的方法。有任何想法嗎?如何確定每個文檔中術語的術語頻率?

公共類記號化{

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)); 

} 

}

回答

2

你應該得到的令牌價值第一,增加它並把它再次。

這樣在你的循環:

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

工作完美,非常感謝。 – Ostepop 2011-04-15 13:23:55

+0

+1完全忘了get()可能返回一個'null'值。 – helpermethod 2011-04-15 14:09:14

1

的想法是正確的,但就我看,你不把正確使用HashMap的。你必須得到與鍵關聯的值,即

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

編輯

另一種選擇是使用一個AtomicInteger而不是Integer因爲AtomicInteger s爲可變的。

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