Инструменты пользователя

Инструменты сайта


prog:chast-slovar

Как составить частотный словарь

Если одной строкой, то получается вот так.

cat words.txt| sed s/" "/"\n"/g|sort|sed 's/[[:upper:]]/\l&/g'|sed s/[^a-zа-я-]//g|uniq -c -d| sort -n| awk 'length($2) > 4'|tail -n 1000| sort -n -r
  1. В words.txt содержатся тексты. Вообще, конечно, можно вместо words.txt использовать *.txt для чтения всех txt-файлов в текущей директории, или dir/*.txt для чтения всех txt в директории dir.
  2. Далее потоковый текстовый редактор sed делает перенос каждого слова на новую строку, чтобы можно было составить сам словарь.
  3. Затем происходит сортировка данных, весь текст приводится к нижнему регистру и вырезаются все знаки пунктуации - таким образом становится довольно легко узнать, какие же слова все-таки повторяются.
  4. После этого за работу берется программа uniq, выбирающая из данных только повторяющиеся слова и пишущая количество повторов.
  5. Далее снова происходит сортировка данных, но на этот раз уже по частоте встречаемости, которую как раз подсчитала uniq.
  6. Затем awk'ом вырезаются все слова, длинна которых составляет менее 4 символов, так как обычно это слова вроде «да, нет, как, и, или» и т.п. Учитывать подобные слова в частотном словаре бессмысленно.
  7. В завершающей стадии работы этого однострочного скрипта командой tail выводятся только топ-1000 слов, а sort зеркально разворачивает список, чтобы самые популярные слова были написаны сверху.

Вот и все. Если в вашей командной строке нет проблем с русской локалью, то приведенный выше скрипт сработает как здесь и описано :) Но в случае, если какие-то проблемы все-таки есть, то можно использовать вот такой вариант скрипта:

cat words.txt| sed s/" "/"\n"/g|sort| sed s/"[[:punct:]]"//g|uniq -c -d| sort -n| awk 'length($2) > 4'|tail -n 20| sort -n -r

Как видно, этот вариант отличается лишь тем, что вместо выдергивания всех символов кроме знаков пунктуации, вырезаются непосредственно знаки пунктуации, а сами буквы остаются нетронутыми. По сути все тоже самое, только не происходит переход в нижний регистр, что делает этот вариант менее приемлемым.

В заключении - скрипт:

frw.sh
#!/bin/sh
 
URL="intel-ussur.ru"
MAXWORD=100
 
w3m -dump -T text/html ${URL} | \
sed s/" "/"\n"/g | \
sort | \
sed 's/[[:upper:]]/\l&/g' | \
sed s/[^a-zа-я-]//g | \
uniq -c -d | \
sort -n | \
awk 'length($2) > 4' | \
tail -n ${MAXWORD} | \
sort -n -r
prog/chast-slovar.txt · Последние изменения: Sat, 15 Sep 2012 22:11 (внешнее изменение)