如何解决如何确定每个文档中术语的频率?
| 我正在建立一个倒排索引,但是当我检查数据库时似乎无法获得正确的频率。我到处都读到您应该使用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));
}
}
解决方法
您应该首先获取令牌的值,将其递增并再次放入。
在循环中像这样:
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);
,这个想法是正确的,但据我所知,您没有正确使用HashMap
。您必须获取与密钥关联的值,即
Integer i = map.get(token);
i += 1;
map.put(token,i);
编辑
另一种选择是使用ѭ4而不是ѭ5,因为ѭ4是可变的。
Map<String,AtomicInteger> map = new HashMap<String,AtomicInteger>();
map.get(token).getAndIncrement();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。