GNU/Linux >> LINUX-Kenntnisse >  >> Linux

N häufigste Wörter in einer Datei finden?

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“.


Linux
  1. Wie finde ich nicht übereinstimmende Klammern in einer Textdatei?

  2. Kann die zu patchende Datei in Eingabezeile 3 nicht finden?

  3. Verwenden Sie _roff, um Wörter zu unterstreichen?

  4. lsof :Am häufigsten verwendete Beispiele

  5. Suchen Sie die Datei und wechseln Sie dann in dieses Verzeichnis in Linux

So finden Sie eine Zeichenfolge in einer Datei unter Linux

Finden Sie verlorene Dateien mit Scalpel

Linux-Berechtigungen – So finden Sie Berechtigungen einer Datei

was ist der zuverlässigste befehl, um die tatsächliche größe einer datei zu finden linux

Warum ist es so schwer, eine Datei in Ubuntu zu finden?

Wiederholte Wörter in einem Text finden