GNU/Linux >> Znalost Linux >  >> Linux

Najít N nejfrekventovanějších slov v souboru?

Chci najít řekněme 10 nejčastějších slov v textovém souboru. Za prvé, řešení by mělo být optimalizováno pro stisknutí kláves (jinými slovy – můj čas). Za druhé za výkon. Zde je to, co jsem zatím dostal do 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

Mohl bych vytvořit program java, python atd., kde ukládám (word, numberOfOccurences) do slovníku a třídím hodnotu, nebo bych mohl použít MapReduce, ale optimalizuji pro stisk kláves.

Existují nějaké falešně pozitivní výsledky? Existuje lepší způsob?

Přijatá odpověď:

To je v podstatě nejběžnější způsob, jak najít „N nejběžnějších věcí“, kromě toho, že vám chybí sort , a máte bezplatnou cat :

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

Pokud nevložíte sort před uniq -c pravděpodobně dostanete spoustu falešných jednoslovných slov. uniq pouze unikátní běhy čar, nikoli celková jedinečnost.

UPRAVIT: Zapomněl jsem na trik, „stop slova“. Pokud se díváte na anglický text (promiňte, zde jednojazyčný severoamerický jazyk), slova jako „of“, „a“, „the“ téměř vždy zaujímají první dvě nebo tři místa. Pravděpodobně je chcete odstranit. Distribuce GNU Groff má soubor s názvem eign v něm, který obsahuje docela slušný seznam stop slov. Moje distribuce Arch má /usr/share/groff/current/eign , ale myslím, že jsem také viděl /usr/share/dict/eign nebo /usr/dict/eign ve starých Unixech.

Zastavovací slova můžete použít takto:

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

Hádám, že většina lidských jazyků potřebuje podobná „zastavovací slova“ odstranit ze smysluplných četností slov, ale nevím, kde navrhnout, aby se seznamy zastavovacích slov pro jiné jazyky dostaly do seznamu.

UPRAVIT: fgrep by měl používat -w příkaz, který umožňuje shodu celých slov. Tím se vyhnete falešným pozitivním hlášením u slov, která obsahují pouze zkratky, jako je „a“ nebo „i“.


Linux
  1. Jak najít nesrovnatelné závorky v textovém souboru?

  2. Nemůžete najít soubor k opravě na vstupním řádku 3?

  3. Najít N nejfrekventovanějších slov v souboru se seznamem stop slov z příkazového řádku?

  1. Najít soubor protokolu Firefoxu?

  2. Jak najít nejfrekventovanější slovo v souboru .csv, ignorovat duplikáty na každém řádku?

  3. Použít _roff k podtržení slov?

  1. lsof :Nejčastěji používané příklady

  2. Najděte soubor a poté cd do tohoto adresáře v Linuxu

  3. Hledání souborů čitelných pro člověka na unixu