GNU/Linux >> Linux Esercitazione >  >> Linux

Trova N parole più frequenti in un file?

Voglio trovare, diciamo, 10 parole più comuni in un file di testo. In primo luogo, la soluzione dovrebbe essere ottimizzata per le sequenze di tasti (in altre parole, il mio tempo). In secondo luogo, per la performance. Ecco cosa ho finora per ottenere la top 10:

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

Potrei creare un programma java, python ecc. in cui memorizzo (word, numberOfOccurences) in un dizionario e ordino il valore oppure potrei usare MapReduce, ma ottimizzo per le sequenze di tasti.

Ci sono falsi positivi? C'è un modo migliore?

Risposta accettata:

Questo è praticamente il modo più comune per trovare "N cose più comuni", tranne per il fatto che ti manca un sort e hai un cat gratuito :

tr -c '[:alnum:]' '[n*]' < test.txt | sort | uniq -c | sort -nr | head  -10

Se non inserisci un sort prima di uniq -c probabilmente otterrai molte parole false singleton. uniq crea solo sequenze di linee uniche, non l'unicità complessiva.

MODIFICA: Ho dimenticato un trucco, “ferma le parole”. Se stai guardando il testo inglese (scusate, in nordamericano monolingue qui), parole come "of", "and", "the" occupano quasi sempre i primi due o tre posti. Probabilmente vorrai eliminarli. La distribuzione GNU Groff ha un file chiamato eign in esso che contiene un elenco abbastanza decente di stop word. La mia distribuzione Arch ha /usr/share/groff/current/eign , ma credo di aver visto anche /usr/share/dict/eign o /usr/dict/eign nei vecchi Unix.

Puoi usare parole di stop come questa:

tr -c '[:alnum:]' '[n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head  -10

La mia ipotesi è che la maggior parte delle lingue umane abbia bisogno di simili "stop words" rimosse dai conteggi di frequenza delle parole significative, ma non so dove suggerire di ottenere elenchi di stop words in altre lingue.

MODIFICA: fgrep dovrebbe usare il -w comando, che abilita la corrispondenza di parole intere. In questo modo si evitano falsi positivi su parole che contengono semplicemente opere brevi, come "a" o "i".


Linux
  1. Come trovare parentesi non corrispondenti in un file di testo?

  2. Non riesci a trovare il file da patchare nella riga di input 3?

  3. Trova N parole più frequenti in un file con un elenco di parole di arresto dalla riga di comando?

  4. Trova il file di registro di Firefox?

  5. lsof :esempi più comunemente usati

Come trovare una stringa in un file su Linux

Trova i file persi con Scalpel

Autorizzazioni Linux:come trovare le autorizzazioni di un file

qual è il comando più affidabile per trovare la dimensione effettiva di un file linux

Perché è così difficile trovare un file in Ubuntu?

Trova parole ripetute in un testo