Ich möchte zum Beispiel das 10 häufigste Wort in einer Textdatei finden. Erstens sollte die Lösung für Tastenanschläge optimiert sein (mit anderen Worten – meine Zeit). Zweitens für die Leistung. Hier ist, was ich bisher habe, um die Top 10 zu erreichen:
cat test.txt | tr -c '[:alnum:]' '[n*]' | uniq -c | sort -nr | head -10
6 k
2 g
2 e
2 a
1 r
1 k22
1 k
1 f
1 eeeeeeeeeeeeeeeeeeeee
1 d
Ich könnte ein Java-, Python- usw.-Programm erstellen, in dem ich (word, numberOfOccurences) in einem Wörterbuch speichere und den Wert sortiere, oder ich könnte MapReduce verwenden, aber ich optimiere für Tastenanschläge.
Gibt es Fehlalarme? Gibt es einen besseren Weg?
Akzeptierte Antwort:
Das ist so ziemlich die gebräuchlichste Methode, um „N häufigste Dinge“ zu finden, außer dass Ihnen eine sort
fehlt , und Sie haben eine kostenlose cat
:
tr -c '[:alnum:]' '[n*]' < test.txt | sort | uniq -c | sort -nr | head -10
Wenn Sie keinen sort
eingeben vor dem uniq -c
Sie werden wahrscheinlich viele falsche Singleton-Wörter erhalten. uniq
macht nur eindeutige Linienzüge, keine allgemeine Eindeutigkeit.
BEARBEITEN: Ich habe einen Trick vergessen, „Stoppwörter“. Wenn Sie sich englischen Text ansehen (sorry, hier einsprachiger Nordamerikaner), nehmen Wörter wie „of“, „and“, „the“ fast immer die ersten zwei oder drei Plätze ein. Sie möchten sie wahrscheinlich beseitigen. Die GNU Groff-Distribution hat eine Datei namens eign
darin, das eine ziemlich anständige Liste von Stoppwörtern enthält. Meine Arch-Distribution hat /usr/share/groff/current/eign
, aber ich glaube, ich habe auch /usr/share/dict/eign
gesehen oder /usr/dict/eign
in alten Unixen.
Sie können Stoppwörter wie folgt verwenden:
tr -c '[:alnum:]' '[n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10
Ich vermute, dass die meisten menschlichen Sprachen ähnliche „Stoppwörter“ benötigen, die aus sinnvollen Worthäufigkeitszählungen entfernt werden müssen, aber ich weiß nicht, wo ich vorschlagen soll, andere Sprachen mit Stoppwörterlisten zu beschaffen.
BEARBEITEN: fgrep
sollte das -w
verwenden Befehl, der den Ganzwortabgleich ermöglicht. Dies vermeidet Fehlalarme bei Wörtern, die lediglich Kurzstopps enthalten, wie „a“ oder „i“.