2016-04-04 7 views
2

Ich versuche Dokumenthäufigkeit (dh in wie viele Dokumente jedes Wort erscheint), Beispiel zu berechnen:berechnen Dokumenthäufigkeit mit HashMap [Java]

Doc1: this phone is the greatest phone ever.
Doc2: what's your phone number.

Ergebnis:

this    1 
phone    2 
is    1 
the    1 
ever    1 
what's   1 
your    1 
number   1 

ich habe den folgenden Code in Java

HashMap<String, String> wordDoc = new HashMap<String, String>(); 
HashMap<String, Integer> countDfIndex = new HashMap<String, Integer>(); 

if (!wordDoc.containsKey(word)) { 
    wordDoc.put(word,docno); 
    countDfIndex.put(word, 1); 
} 
if (wordDoc.get(word)!=null) { 
    if(!wordDoc.containsValue(docno)) { 
     wordDoc.put(word,docno); 
     countDfIndex.put(word, countDfIndex.get(word)+1); 
    } 
} 

Ich bekomme nicht das richtige Ergebnis, bitte helfen !!

+1

was Ergebnis erwarten Sie? – Andrew

+0

ist unklar, versuchen Sie, die Wörter zu zählen? –

+0

Was ist der Zweck der Überprüfung ''! WordDoc.containsValue (docno) ''? – f1sh

Antwort

3

Ich nehme an, dass Sie versuchen, die Anzahl der Dokumente zu zählen, die das entsprechende Wort enthalten, und nicht die Gesamtzahl der Vorkommen.

Wenn ja:

Map<String, Integer> countDfIndex = new HashMap<String, Integer>(); 

for (... document : documents) { 
    Set<String> alreadyAdded = new HashSet<String>(); // new empty set for each document 

    ... 

    if (!alreadyAdded.contains(word)) { 
     if (!countDfIndex.containsKey(word) { 
      countDfIndex.put(word, 1); 
     } else { 
      countDfIndex.put(word, countDfIndex.get(word) + 1); 
     } 
     alreadyAdded.add(word); // don't add the word anymore if found again in the document 
    } 

} 
+0

Dank Jiri, ich bin durch Wort: Wörter statt Dokument, Beispiel, wenn mein Dokument doc1 ist, wird es durch alle Wörter durchlaufen dann wird zu einem anderen gehen, ich habe versucht, Ihren Code zu implementieren, aber ich bekomme nicht die richtige Frequenz, alles ist 1 –

+0

Durchforsten Sie zuerst die Dokumente, dann alle Wörter darin, oder Sie durchlaufen Wörter auf andere Weise? Wenn die erste, reset die 'alreadyAdded' am Dokumentstart dann durchlaufen Wörter. Wenn das zweite wahr ist, woher weißt du, zu welchem ​​Dokument ein Wort gehört? –

+0

Vielen Dank, es dauerte eine Weile, aber ich habe, was Sie vorgeschlagen, um zu arbeiten, war Ihre Logik, die mich weitermachen. –

2
public static void add(Map<String, Integer> map, String word) { 
    map.put(word, map.containsKey(word) ? map.get(word) + 1 : 1); 
} 

for (String i : s.replace(".", "").split(" ")) add(map, i); 

wo

  • map = new HashMap<String, Integer>();
  • s = "this phone is the greatest phone ever. what's your phone number."

Schließlich ist die Karte enthält

{the=1, ever=1, number=1, phone=3, this=1, what's=1, is=1, your=1, greatest=1} 
+1

Die vorgeschlagene Funktion 'add' kann durch' map.merge (i, 1, (u, v) -> u + v); ' – Marco13

+1

ersetzt werden Graf, danke für die Hilfe –

+0

@AndrewTobilko Ich hatte bereits, was Sie zur Verfügung gestellt, ich bin bereits mit der Berechnung der Gesamtzahl der Wörter, itll groß sein, wenn Sie mir sagen können, wie man Telefon auf 2 halten, ist der Code in einer Schleife von Wörtern –

2
HashMap<String, Integer> countDfIndex = new HashMap<String, Integer>(); 

if (!countDfIndex.containsKey(word)) 
    { 
     countDfIndex.put(word, 1); 
    } 
else{ 
int i =countDfIndex.get(word); 
countDfIndex.put(word,i+1); 
} 
for(Map.Entry<String,Integer> pair: countDfIndex.entrySet()){ 

       int count=pair.getValue(); 
       String word=pair.getKey(); 
       System.out.println("word is "+word+"count is "+count); 

      }