Chci najít nejčastější slova v textovém souboru pomocí seznamu stop slov. Tento kód již mám:
tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10 > test.txt
ze starého příspěvku
, ale můj soubor obsahuje něco takového:
240
21 ipsum
20 Lorem
11 Textes
9 Blindtexte
7 Text
5 F
5 Blindtext
4 Texte
4 Buchstaben
První je jen mezera a v textu jsou to interpunkční znaménka (jako tečky), ale tohle nechci, tak co k tomu mám dodat?
Přijatá odpověď:
Zvažte tento testovací soubor:
$ cat text.txt
this file has "many" words, some
with punctuation. some repeat,
many do not.
Chcete-li získat počet slov:
$ 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
Jak to funguje
-
grep -oE '[[:alpha:]]+' text.txt
Tím se vrátí všechna slova bez mezer nebo interpunkce s jedním slovem na řádek.
-
sort
Tím se slova seřadí v abecedním pořadí.
-
uniq -c
Toto počítá, kolikrát se každé slovo vyskytuje. (Pro
uniq
aby fungoval, jeho vstup musí být setříděn.) -
sort -nr
Toto seřadí výstup číselně tak, aby nejčastější slovo bylo nahoře.
Zpracování smíšených případů
Zvažte tento testovací soubor se smíšenými případy:
$ cat Text.txt
This file has "many" words, some
with punctuation. Some repeat,
many do not.
Pokud chceme počítat some
a Some
stejně:
$ 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
Zde jsme přidali -f
možnost sort
takže bude ignorovat malá a velká písmena a -i
možnost uniq
takže bude také ignorovat malá a velká písmena.
Vyloučení zastavovacích slov
Předpokládejme, že chceme tato zastavovací slova vyloučit z počítání:
$ cat stopwords
with
not
has
do
Takže přidáme grep -v
k odstranění těchto slov:
$ 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