【问题标题】:how to create inverted index in java如何在java中创建倒排索引
【发布时间】:2017-02-12 00:42:54
【问题描述】:

我想在java中建立一个倒排索引。我有 1400 个文本文件的 cran 数据。 我能够计算每个术语/单词的频率。我已经能够返回单词在整个集合中出现的次数,但我无法返回该单词出现在哪些文档中。这是我到目前为止的代码:

我想要以下形式的输出 术语 1:文档 1:2,文档 2:3 术语 2:文档 1:3,文档 4:1 ......等等

这里的 term 是 doc 文件中的一个词,doc 1:2 表示 term1 在 doc 1 中出现 2 次​​p>

public static void main(String[]args) throws FileNotFoundException{
        Map<String, Integer> m = new HashMap<>();

        String wrd;

        for(int i=1;i<=2;i++){
           //FileInputStream tdfr = new FileInputStream("D:\\logs\\steem"+i+".txt");
           Scanner tdsc=new Scanner(new File("D:\\logs\\steem"+i+".txt"));
           while(tdsc.hasNext()){
              // m.clear();
              Integer docid=i;

               wrd=tdsc.next();
               //Vector<Integer> vPosList = p.hPosList.get(wrd);
               Integer freq=m.get(wrd);

               //Integer doc=m1.get(i);
              //System.out.println(m.get(wrd));
               m.put(wrd, (freq == null) ? 1 : freq + 1);
           }

          System.out.println(m.size() + " distinct words" + " steem" +i);
          System.out.println("Doc" +i+""+m);
          //System.out.println("Doc"+i+""+m1);
          m.clear();


        tdsc.close();

    }
        //System.out.println(m.size() + " distinct words");
        //System.out.println(m);
       // System.out.println(m1);

}
}

【问题讨论】:

标签: java java-8 search-engine text-mining information-retrieval


【解决方案1】:
public static void main(String[]args) throws FileNotFoundException{
    Map<String, Set<Doc>> wordDocMap = new HashMap<>();

    for(int i=1;i<=2;i++){
        Scanner tdsc = new Scanner(new File("D:\\logs\\steem"+i+".txt"));
        Doc document = new Doc("doc"+i);
        while(tdsc.hasNext()){
            String word = tdsc.next();
            document.put(word);
            Set<Doc> documents = wordDocMap.get(word);
            if(documents == null){
                documents = new HashSet<>();
                wordDocMap.put(word, documents);
            }
            documents.add(document);
        }
        tdsc.close();
    }

    StringBuilder builder = new StringBuilder();
    for(String word: wordDocMap.keySet()) {
        Set<Doc> documents = wordDocMap.get(word);
        builder.append(word + ":");
        for(Doc document:documents){
            builder.append(document.getDocName() +":"+ document.getCount(word));
            builder.append(", ");
        }
        builder.delete(builder.length()-2, builder.length()-1);
        builder.append("\n");
    }
    System.out.println(builder);
}

static class Doc {
    String docName;
    Map<String, Integer> m = new HashMap<>();

    public Doc(String docName){
        this.docName = docName;
    }

    public void put(String word) {
        Integer freq = m.get(word);
        m.put(word, (freq == null) ? 1 : freq + 1);
    }

    public Integer getCount(String word) {
        return m.get(word);
    }

    public String getDocName() {
        return this.docName;
    }
}

【讨论】:

  • 如果我没记错的话,我需要打印地图 "wordDocMap" 所以当我把行 System.out.println(worddocMap);它只显示{}这个值我是地图中的新手,所以如果你告诉我发生了什么会很有帮助?
  • 如何打印输出?
  • 您可以打印 StringBuilder builder
  • 好吧,我把 for 循环后面的行作为 System.out.println(builder);但它什么也没显示
  • wordDocMap.put(word, 文档);失踪。我已经更新了我的答案
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多