0

Je veux construire un index inversé en Java. J'ai des données de cran de 1400 fichiers texte. J'étais capable de compter la fréquence de chaque terme/mot. J'ai été capable de retourner le nombre de fois qu'un mot apparaît dans toute la collection, mais je n'ai pas pu retourner les documents dans lesquels le mot apparaît. C'est le code que j'ai jusqu'à présent:comment créer un index inversé en Java

Je veux la sortie dans la forme terme1 suivante: doc1: 2, Doc2: 3 terme2: doc1: 3, Doc4: 1 ............... ainsi de suite

ici terme est un mot dans un fichier doc et doc 1: 2 signifie terme1 figure dans le document 1 2 fois

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

Répondre

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

Si je ne me trompe pas, j'ai besoin d'imprimer la carte "wordDocMap" Donc quand je mets la ligne System.out.println (worddocMap); il montre seulement {} ces valeurs Je suis novice dans la carte, donc ce serait une aide précieuse si vous me dites ce qui se passe? –

+0

Comment imprimer la sortie? –

+0

Vous pouvez bien imprimer le constructeur StringBuilder –