Недавно, ради эксперимента, да и просто ради углубленного изучения языка, я решил заняться одной интересной проблемой — частотным анализом текстов.
Если коротко, то суть задачи в подсчете того, сколько раз определенное слово или же набор символов встречается в некотором тексте, поскольку стихия Icon — обработка текстовых данных, то возникла идея опробовать язык для этой цели.
Для начала создадим два текстовых файла, которые условно назовем source.txt и words.txt: в первый будем помещать текст для анализа, во второй — поместим список слов или символов, которые мы будем искать, располагая каждое слово с новой строки. Также нам потребуется функция подсчета количества повторений определенной строки в некотором файле, с учетом того,что в Icon есть функция find, возвращающая позицию одной строки в другой, то наша функция будет выглядеть так:
procedure search(f,s) local res,tmp res:=0 every tmp:=!f ? { if find(s,tmp) then res+:=1 } return res end
Она будет принимать на вход два параметра — открытый текстовый файл и строка, количество повторений которой надо посчитать.
Используя эту функцию, нетрудно реализовать программку подсчета количества повторений слов, взятых из файла words.txt, в тексте, взятом из файла source.txt, для чего воспользуемся циклом every-do вкупе с генерацией элементов структуры, в качестве которой выступает файл words.txt:
procedure main() local a,b,c,f b:=open("words.txt","r") every c:=!b do { f:=open("source.txt","r") a:=search(f,c) close(f) write(c," ",a) } end procedure search(f,s) local res,tmp res:=0 every tmp:=!f ? { if find(s,tmp) then res+:=1 } return res end
Остается только заполнить два файла нужными для обработки данными. В качестве слов в файл words.txt можно вставить буквы алфавита (разделяя их новой строкой) — и получить таким образом,количество вхождений каждой буквы в строках файла. Ниже представлен результат анализа этой статьи по таким параметрам:
- Результаты под спойлером
а 7
б 6
в 7
г 4
д 7
е 7
ж 4
з 6
и 7
й 7
к 7
л 7
м 7
н 7
о 7
п 7
р 7
с 7
т 7
у 7
ф 5
х 5
ц 3
ч 6
ш 2
щ 1
ъ 0
ы 7
ь 7
э 3
ю 2
я 6