Недавно, ради эксперимента, да и просто ради углубленного изучения языка, я решил заняться одной интересной проблемой — частотным анализом текстов.
Если коротко, то суть задачи в подсчете того, сколько раз определенное слово или же набор символов встречается в некотором тексте, поскольку стихия 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