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