Jak vypočítat TF-IDF pomocí nástrojů unixového shellu

V unixových terminálech (všechny odrůdy Linuxu, shell na MacOS a na Windows cygwin) existuje mnoho programů pro práci s textem. Jejich podrobný popis najdete přímo v systému pomocí příkazu man, např. man grep. Všude platí, že na velikosti písmen záleží, vstupní argumenty se oddělují mezerou, programy (příkazy shellu) se jmenují malými písmeny. Následuje popis, jak získat TF-IDF pro konkrétní slovo a dokument. Tento postup jsme zkusili přímo na cvičení, proto je spíš orientační. Korpus desam patří Centru zpracování přirozeného jazyka na FI.

máme korpus desam.vert
rozdělíme ho podle dokumentů
csplit -k desam.vert  "/<\/doc>/+1" {*}

v těch rozdělených dokumentech hledáme lemma "čaj", zajímá nás ale jen počet takových dokumentů, ve kterých je čaj
grep -c "čaj" xx* | grep -v :0 | wc -l

zjistíme, že musíme čaj ohraničit bílými místy, jinak najdeme i čajový nebo jenčajský
grep "čaj" desam.vert

takže znova
grep -c "\sčaj\s" xx* | grep -v :0 | wc -l
ZÍSKALI JSME DF=12

jak zjistit počet dokumentů?
grep "<doc" desam.vert | wc -l
ZÍSKALI JSME N=2690

IDF (čaj) =log(2690/12)

vezměme všechny dokumenty, ve kterých se vyskytuje "čaj"
grep -c "čaj" xx* | grep -v :0

zjistíme, že v jednom z nich se vyskytuje víckrát, myslíme si, že to bude dokument o čaji
xx2391
spočítáme si tady tf-idf
TF = 4
délka dokumentu
cat xx2391 | wc -l
normalizovaný TF = 4/869
TF-IDF (čaj,xx2391) = 4/869 * log(2690/12) = 0.01082

pro zajímavost zkusme tf-idf pro čaj v jiném dokumentu:
cat xx2553 | wc -l
normalizovaný TF = 1/486
TF-IDF (čaj,xx2553) = 1/486 * log(2690/12) = 0.00484

Pro zajímavost si můžeme oba dokumenty prohlédnout
cat xx2391 | cut -f1 | tr '\n' ' '