0

Ich möchte einen invertierten Index in Java erstellen. Ich habe Daten von 1400 Textdateien. Ich konnte die Häufigkeit jedes Begriffes/Wortes zählen. Ich konnte die Anzahl der Wörter in der gesamten Sammlung zurückgeben, aber ich konnte nicht zurückgeben, in welchen Dokumenten das Wort angezeigt wird. Dies ist der Code, den ich bisher habe:Wie erstellt man invertierten Index in Java

Ich möchte die Ausgabe in die folgende Form term1: DOC1: 2, doc2: 3 term2: DOC1: 3, DOC4: 1 ............... usw.

Begriff hier ein Wort in einer doc-Datei und doc 1: 2 bedeutet term1 in doc 1 2 mal

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 erscheint: // st ackoverflow.com/questions/12511543/how-to-build-a-simple-inverted-index –

Antwort

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

Wenn ich nicht falsch liege, muss ich die Karte "WordDocMap" So drucken, wenn ich die Zeile System.out.println (worddocMap); es zeigt nur {} diese Werte Ich bin Neuling in Karte, also wäre es eine große Hilfe, wenn Sie mir sagen, was los ist? –

+0

Wie drucke ich die Ausgabe? –

+0

Sie können StringBuilder Builder –

Verwandte Themen