2016-05-24 1 views
0

J'ai un problème pour augmenter la fréquence que le mot se produit dans chaque fichier, J'ai testé dans 3 fichiers égaux et obtenu des résultats différents dans chacun. Exemple: Chaque fichier le mot « programme » se produit 13 fois enter image description hereErreur d'indexation Java en augmentant la fréquence

mais la sortie que j'ai est: enter image description here

* le mot dans le champ de recherche que cette « Programa » et non programme en raison de découlant

[program] 
---------------- 
Doc: site1.html Freq: 21 
Doc: site2.html Freq: 11 
Doc: site3.html Freq: 1 

Aucune des sorties n'est correcte.

La sortie devait être:

[program] 
---------------- 
Doc: site1.html Freq: 13 
Doc: site2.html Freq: 13 
Doc: site3.html Freq: 13 

classe Document:

public class Documento { 

    private String docid; 
    private int frequencia; 

    public Documento(String docid, int frequencia) { 
     this.docid = docid; 
     this.frequencia = frequencia; 
    } 

    public String getDocid() { 
     return docid; 
    } 

    public int getFrequencia() { 
     return frequencia; 
    } 

    public void setFrequencia(int frequencia) { 
     this.frequencia = frequencia; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if ((o instanceof Documento) && docid == ((Documento) o).docid && frequencia == ((Documento) o).frequencia) { 
      return true; 
     } 
     return false; 
    } 

Fonction pour insérer et trouver document:

 public class Dicionario { 

    public Map<String, List<Documento>> indice = new HashMap<>(); 

    public void InsereDicionario(String palavra, String docid) { 
     if (!indice.containsKey(palavra)) { 
      indice.put(palavra, new ArrayList<Documento>()); 
      indice.get(palavra).add(new Documento(docid, 1)); 
     } else { 
      boolean inserido = false; 
      List<Documento> lista = indice.get(palavra); 
      for (int i = 0; i < lista.size(); i++) { 
       Documento d = lista.get(i); 
       if (d.getDocid().equals(docid)) { 
//     indice.get(palavra).add(new Documento(docid, 1)); 
        inserido = true; 
       } else { 
        d.setFrequencia(d.getFrequencia() + 1); 
       } 
       System.out.println(""); 
      } 
      if (!inserido) { 
       indice.get(palavra).add(new Documento(docid, 1)); 
      } 
     } 
    } 

    public String Busca(String palavra) { 
     String saida = ""; 
     System.out.println("Buscando [" + palavra + "]"); 
     List<Documento> list = new ArrayList(); 

     for (String p : indice.keySet()) { 
      if (p.equals(palavra)) { 
       list.addAll(indice.get(p)); 
       for (Documento d : indice.get(p)) { 
        System.out.println("Doc: " + d.getDocid() + " Freq: " + d.getFrequencia()); 
        saida += "Doc: " + d.getDocid() + " Freq: " + d.getFrequencia() + "".trim() + "\n"; 
       } 
      } 
     } 
     return saida; 
    } 

Fonction appeler Buscar (Fonction de recherche) dans tous les mots.

for (String palavra : query.split(" ")) { 
    resultado += ("\n[" + palavra + "]\n----------------\n"); 
    resultado += dic.Busca(palavra.trim()); 
} 

Répondre

0

Regardez ceci:

   if (d.getDocid().equals(docid)) { 
//     indice.get(palavra).add(new Documento(docid, 1)); 
        inserido = true; 
       } else { 
        d.setFrequencia(d.getFrequencia() + 1); 
       } 

Si dociid se trouve dans la liste -> puis faire nothning.
Sinon (un doc actuel extrait de la liste n'est pas égal à docid) -> alors incrémenter le compteur.
Échangez ces opérations ou utilisez une négation dans la condition.

+0

sortie: [programme] ---------------- Doc: site1.html Freq: 10 Doc: site1.html Freq: 9 Doc: site1.html Freq: 8 Doc: site1.html Freq: 7 Doc: site1.html Freq: 6 Doc: site1.html Freq: 5 Doc: site1.html Freq: 4 Doc: site1.html Freq: 3 Doc : site1.html Freq: 2 Doc: site1.html Freq: 1 –

+0

J'ai déjà essayé cela, mais n'apparaît que la fréquence de 1 document et en décrémentant. Je suis incapable de comprendre ce qui se passe = / –