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