Elegante Art zum zählen der Häufigkeit von Wörtern in einer Datei
Was sind die elegante und effektive Möglichkeiten, um zählen Sie die Häufigkeit jedes "englische" Wort in einer Datei?
Definieren "Wort". Meinst du "englische Wörter" oder "ununterbrochene Sequenzen von Buchstaben" oder "ununterbrochene Sequenzen von Zeichen" oder etwas anderes?
für welchen Zweck - nur zum Spaß?
Wieder, was bedeutet ""Deutsch"" bedeuten? Eigentliche englische Wörter oder Sequenzen übereinstimmenden
Tun Wehen und besitzergreifend Wörter zählen? Zum Beispiel
Tun Sie den Brief Sequenzen haben, um gültig zu sein Englisch Wörter? Zum Beispiel, ein ist ein gültiges Wort, aber t nicht.
für welchen Zweck - nur zum Spaß?
Wieder, was bedeutet ""Deutsch"" bedeuten? Eigentliche englische Wörter oder Sequenzen übereinstimmenden
[A-Za-z]+
? Was ist mit Bindestrich geschriebene Wörter oder anderweitig unterbrochen Wörter?Tun Wehen und besitzergreifend Wörter zählen? Zum Beispiel
can't
, und The cat's toy.
.Tun Sie den Brief Sequenzen haben, um gültig zu sein Englisch Wörter? Zum Beispiel, ein ist ein gültiges Wort, aber t nicht.
InformationsquelleAutor pintu | 2011-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst definiere ich
letter_only
std::locale
so zu ignorieren Satzzeichen kommen aus dem stream, und Lesen nur gültig, "Englisch" Briefe aus dem input-stream. So, der stream wird die Behandlung der Wörter"ways"
,"ways."
und"ways!"
als nur das gleiche Wort"ways"
, weil der stream wird ignoriert die Interpunktion wie"."
und"!"
.Lösung 1
Lösung 2
Ich denke, das ist die richtige Antwort, da er will, die Häufigkeit der Wiederholung von Worten.
+1 für richtige Schätze 😀
Die input-Schleife in die erste Lösung ist falsch. Das eof-flag gesetzt ist nachdem eine Eingabe, die nicht aufgrund zum erreichen von eof.
Warum nicht einfach die idiomatische
while (input >> word)
? Es ist immer noch falsch geschrieben, da die anderen flags nicht überprüft.InformationsquelleAutor Nawaz
Hier ist funktionierende Lösung.Diese Arbeit sollte mit echtem text (einschließlich Satzzeichen) :
Edit: Jetzt ist mein code aufrufen tolower für jeden Buchstaben.
Frage fragt, "englische" Wörter.Auch is_alpha nicht true zurück für die Ziffern.
InformationsquelleAutor UmmaGumma
Meine Lösung ist die folgende. Erstens, alle Symbole werden in Leerzeichen umgewandelt. Dann, im Grunde die gleiche Lösung, die hier bereitgestellt werden, bevor Sie verwendet werden, um zu extrahieren Worten:
Ich habe verbessert der Algorithmus und kleinere Fehler behoben.
InformationsquelleAutor Baltasarq
Pseudocode für einen Algorithmus, das ist glaube ich in der Nähe, was Sie wollen:
Groß- /Kleinschreibung-Vergleich behandelt, naiv und wahrscheinlich verbindet Wörter, die Sie nicht wollen, zu kombinieren in einer völlig Allgemeinen Sinn. Seien Sie vorsichtig, der nicht-ASCII-Zeichen in Ihrer Umsetzung von den oben genannten. False positives können "1-800-555-SAGEN", "0xDEADBEEF" und "42 km", je nachdem, was Sie wollen. Vergessene Wörter "911 emergency services" (ich würde wahrscheinlich wollen, dass gezählt als drei Worte).
Kurz, natural language parsing ist schwierig: Sie können sich wahrscheinlich machen, durch mit eine Näherung abhängig von Ihrer tatsächlichen Anwendungsfall.
InformationsquelleAutor Fred Nurk
Perl ist wohl nicht so elegant, aber sehr effektiv.
Ich habe eine Lösung hier: Verarbeitung von großen text-Dateien
In einer nussschale,
1), Wenn nötig, strip Satzzeichen und Großbuchstaben in Kleinbuchstaben umwandeln:
perl -pe "s/[^a-zA-Z \t\n']//g; tr/A-Z/a-z/" file_raw > file
2) Anzahl des Auftretens jedes Wortes. Drucken Sie die Ergebnisse geordnet nach Häufigkeit und dann alphabetisch:
perl -lane '$h{$_}++ for @F; END{for $w (sort {$h{$b}<=>$h{$a} || $a cmp $b} keys %h) {print "$h{$w}\t$w"}}' file > freq
Lief ich diesen code auf eine 3,3 GB-text-Datei mit 580,000,000 Wörter.
Perl 5.22 abgeschlossen in unter 3 Minuten.
InformationsquelleAutor Chris Koknat
Eine weitere einfache Möglichkeit ist, um die Anzahl der Leerzeichen in der Datei, bis mehr als ein Leerzeichen gefunden wurde, wenn man bedenkt, nur einzelne Leerzeichen zwischen den Wörtern...
InformationsquelleAutor Chirag Tayal
Entscheiden, was genau meinen Sie mit "ein Wort". Sollte die definition Abdeckung Dinge wie, ob "wehrfähigen" ist ein Wort oder zwei, wie man mit Apostrophen ("Don 'T trust' em!"), ob die groß /Kleinschreibung ist signifikant, etc.
Erstellen Sie eine Reihe von Testfällen, so dass Sie können sicher sein, Sie bekommen alle Entscheidungen in Schritt 1 korrekt.
Erstellen Sie einen tokenizer, der liest das nächste Wort (wie definiert in Schritt 1) aus der Eingabe und gibt es in einer standard-form. Je nachdem, wie Ihre definition, könnte dies einen einfachen Zustandsautomaten, einen regulären Ausdruck oder nur unter Berufung auf <istream>'s Gewinnung von Operatoren (z.B.
std::cin >> word;
). Testen Sie Ihre tokenizer mit allen Testfällen aus Schritt 2.Wählen Sie eine Datenstruktur, die für die Beibehaltung der Wörter und Anzahl. In modernem C++, würden Sie wahrscheinlich am Ende mit etwas wie
std::map<std::string, unsigned>
oderstd::unordered_map<std::string, int>
.Schreiben Sie eine Schleife, die bekommt das nächste Wort aus der Segmentierer und erhöht seine Zählung in dem Histogramm, bis es nicht mehr Wörter in der Eingabe.
InformationsquelleAutor Adrian McCarthy
InformationsquelleAutor user9178028