Как определить частоту терминов в каждом документе? - PullRequest
0 голосов
/ 15 апреля 2011

Я строю инвертированный индекс, но не могу получить правильные частоты при проверке базы данных. Я везде читал, что вы должны использовать HashMap, но я не совсем уверен, является ли это правильным методом. Есть идеи?

открытый класс 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));

}

}

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Сначала вы должны получить значение для токена, увеличить его и поставить снова.

Как в вашем цикле:

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);
1 голос
/ 15 апреля 2011

Идея верна, но, насколько я понимаю, вы не правильно используете HashMap. Вы должны получить значение, связанное с ключом, т.е.

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

EDIT

Другой вариант - использовать AtomicInteger вместо Integer, поскольку AtomicInteger s является изменяемым.

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