Voglio trovare le parole più frequenti in un file di testo, usando un elenco di parole non significative. Ho già questo codice:
tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10 > test.txt
da un vecchio post
ma il mio file contiene qualcosa del genere:
240
21 ipsum
20 Lorem
11 Textes
9 Blindtexte
7 Text
5 F
5 Blindtext
4 Texte
4 Buchstaben
Il primo è solo uno spazio e nel testo sono segni di punteggiatura (come punti), ma non voglio questo, quindi cosa devo aggiungere?
Risposta accettata:
Considera questo file di prova:
$ cat text.txt
this file has "many" words, some
with punctuation. some repeat,
many do not.
Per ottenere un conteggio delle parole:
$ grep -oE '[[:alpha:]]+' text.txt | sort | uniq -c | sort -nr
2 some
2 many
1 words
1 with
1 this
1 repeat
1 punctuation
1 not
1 has
1 file
1 do
Come funziona
-
grep -oE '[[:alpha:]]+' text.txt
Questo restituisce tutte le parole, meno eventuali spazi o segni di punteggiatura, con una parola per riga.
-
sort
Questo ordina le parole in ordine alfabetico.
-
uniq -c
Questo conta il numero di volte in cui si verifica ogni parola. (Per
uniq
per funzionare, il suo input deve essere ordinato.) -
sort -nr
Questo ordina l'output numericamente in modo che la parola più frequente sia in cima.
Gestione di casi misti
Considera questo file di test con casi misti:
$ cat Text.txt
This file has "many" words, some
with punctuation. Some repeat,
many do not.
Se vogliamo contare some
e Some
come lo stesso:
$ grep -oE '[[:alpha:]]+' Text.txt | sort -f | uniq -ic | sort -nr
2 some
2 many
1 words
1 with
1 This
1 repeat
1 punctuation
1 not
1 has
1 file
1 do
Qui, abbiamo aggiunto il -f
opzione per sort
in modo da ignorare maiuscole e minuscole e -i
opzione per uniq
in modo da ignorare anche le maiuscole.
Escluse le stop word
Supponiamo di voler escludere dal conteggio queste stop word:
$ cat stopwords
with
not
has
do
Quindi, aggiungiamo grep -v
per eliminare queste parole:
$ grep -oE '[[:alpha:]]+' Text.txt | grep -vwFf stopwords | sort -f | uniq -ic | sort -nr
2 some
2 many
1 words
1 This
1 repeat
1 punctuation
1 file