0

Я хочу построить инвертированный индекс в java. У меня есть крановые данные из 1400 текстовых файлов. Я смог подсчитать частоту каждого слова/слова. Мне удалось вернуть число раз, когда слово появляется во всей коллекции, но я не смог вернуть документы, в которые оно появилось. Это код, который у меня есть до сих пор:Как создать инвертированный индекс в java

Я хочу, чтобы результат в следующий вид term1: doc1: 2, doc2: 3 term2: doc1: 3, doc4: 1 ............... так далее

здесь термин это слово в файле док и док 1: 2 означает term1 появляется документ 1 2 раза

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

} 
} 
+0

Http: // ул ackoverflow.com/questions/12511543/how-to-build-a-simple-inverted-index –

ответ

0
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; 
    } 
} 
+0

Если я не ошибаюсь, мне нужно распечатать карту «wordDocMap» Итак, когда я положил строку System.out.println (worddocMap); он показывает только {} это значения Я новичок на карте, так что было бы очень полезно, если бы вы сказали мне, что происходит? –

+0

Как распечатать вывод? –

+0

Вы можете распечатать построитель StringBuilder –