Частотный анализ текстов

Недавно, ради эксперимента, да и просто ради углубленного изучения языка, я решил заняться одной интересной проблемой — частотным анализом текстов.

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

Добавить комментарий