2015-02-09 72 views
0

好吧,我正在尝试制作一个Map <String, Integer>,其关键是单词,值是频率。然后使用它我想要做一个Map<String, Map<String, Integer>>这样的关键是文档标题和价值是地图与文档的术语频率。这里是我的方法:使用Lucene创建一个术语频率的地图

private Map<Integer, Map<String, Integer>> findTFs(Set<String> terms) 
     throws IOException { 
    // get an iterator for all the terms (words) 
    TermsEnum termEnum = MultiFields.getTerms(reader, "content").iterator(
      null); 
    //main map 
    tf = new HashMap<Integer, Map<String, Integer>>(); 


    while (termEnum.next() != null) { 
     //the parameter "terms" is just the 50 top words of the all documents 
     if (terms.contains(termEnum.term().utf8ToString())) { 
      //Document enumerator 
      DocsEnum docEnum = MultiFields.getTermDocsEnum(reader, 
        MultiFields.getLiveDocs(reader), "content", 
        termEnum.term()); 
      int doc = DocsEnum.NO_MORE_DOCS; 
      int count = 0; 
      while ((doc = docEnum.nextDoc()) != DocsEnum.NO_MORE_DOCS) { 
       System.out.println(docEnum.docID() + ": " 
         //document title 
         + reader.document(docEnum.docID()).get("title") 
         //word 
         + ": " + termEnum.term().utf8ToString() + ": " 
         //frequency 
         + docEnum.freq()); 
      } 
     } 
    } 
    return tf 
} 

我的问题是,这些环设置,使得它们移动到每个字的下一个文件,我一直在做每个文档在一张地图中挣扎。任何帮助,将不胜感激。

+0

您可以向代码添加更多文档以便可以轻松读取它吗?谢谢。 – bigT 2015-02-09 01:55:15

+0

增加了一些意见,谢谢! – user111702 2015-02-09 02:00:56

+0

如果你用inner while循环切换外部while循环,那么怎么样?您的控制循环(外部循环)应该是循环遍历文档的循环,并且对于每个文档循环通过术语(这是内部循环)来找出文档中每个术语的频率。当你没有更多的条件可以尝试时,你会转到下一个文档,然后再做同样的事情,直到你没有文档。 – bigT 2015-02-09 02:18:11

回答

0

由于您的文档实例取决于术语,因此您应该将文档添加到主映射中,并使用内部术语频率映射。当你进入下一个学期时,你可能会得到一个不同的文档,你将再次添加到主地图中,或者你可能会得到一个已经添加到主地图的文档,在这种情况下,你会首先检查主地图是否包含该文档,如果包含该文档,则只需抓取内部词语频率图来更新它。

这里是内环一些伪代码来说明:

while ((doc = docEnum.nextDoc()) != DocsEnum.NO_MORE_DOCS) { 
    // Get document title, which is used as a key in the main map 
    String docTitle = reader.document(docEnum.docID()).get("title"); 

    Map docTermFreq = null; 

    // If document title already exists in main map 
    if (tf.containsKey(docTitle)) { 
     // Get the document term frequency map 
     docTermFreq = tf.get(docTitle); 
    } else { 
     // Create one 
     docTermFreq = new HashMap<String, Integer>(); 

     // Put it in the main map 
     tf.put(docTitle, docTermFreq); 
    } 

    docTermFreq.put(term, docEnum.freq()); 
} 

外环应保持不变。最后,你只需返回tf。顺便说一下,您需要更改方法签名以返回Map<String, Map<String, Integer>>而不是Map<Integer, Map<String, Integer>>