В этой статье я расскажу о том, как можно в языке программирования SPL решить классическую задачу: получить список наиболее часто встречающихся в тексте слов. В качестве образца текста возьмем произведение Шекспира Гамлет.
Далее я сразу приведу пример программы и результат ее работы, а потом подробно разберем все шаг за шагом.
Текст программы:
text = #.readtext("hamlet.txt")
words = #.split(text, " ", ".", ",", ";", "'", "!", "?", "-", "(", ")", "[", "]", #.crlf, #.quot)
> i, 1..#.size(words)
>> words[i] = ""
key = #.lower(words[i])
dict[key] += 1
total += 1
<
#.sortval(dict)
#.reverse(dict)
#.output(total, " слов; ", #.size(dict), " уникальных слов")
> i, 1..10
key = dict[i]
#.output(i, " : ", key, " = ", dict[key])
<
Результат работы программы:
32885 слов; 4634 уникальных слов
1 : the = 1091
2 : and = 969
3 : to = 767
4 : of = 675
5 : i = 633
6 : a = 571
7 : you = 558
8 : my = 520
9 : in = 451
10 : it = 421
Теперь разберем подробнее как это работает.
Первая строка:
text = #.readtext("hamlet.txt")
считывает текст файла «hamlet.txt» в переменную «text».
Затем в строке:
words = #.split(text, " ", ".", ",", ";", "'", "!", "?", "-", "(", ")", "[", "]", #.crlf, #.quot)
функция "#.split" делит текст «text» на отдельные слова с помощью указанных разделителей и сохраняет результат в массив «words». В списке разделителей также присутствуют системные константы "#.crlf" и "#.quot", которые обозначают символы CRLF (перевод строки) и кавычки ".
Далее идет цикл, который начинается командой ">". В первой строке цикла:
> i, 1..#.size(words)
указано, что циклить он будет по переменной «i», которая меняется от 1 до количества слов в массиве «words», которое возвращает функция "#.size".
В следующей строке:
>> words[i] = ""
стоит команда перехода на начало цикла ">>" при условии, что очередное слово «words[i]» — не пустое. Это для того, чтобы не учитывать пустые слова, которые получились при делении текста.
Затем в текстовой переменной «key» получаем очередное слово в нижнем регистре благодаря функции "#.lower":
key = #.lower(words[i])
и следующая строка:
dict[key] += 1
выполняет основную работу — в запись из словаря «dict» по ключу «key» прибавляется 1, таким образом подсчитывая количество каждого слова.
В строке:
total += 1
подсчитывается общее количество слов, которые были учтены, и результат хранится в переменной «total».
Следующая строка:
<
это конец цикла.
Теперь сортируем словарь «dict» по значению:
#.sortval(dict)
Сортировка производится в порядке возрастания, поэтому в следующей строке:
#.reverse(dict)
словарь реверсируется в обратный порядок, по убыванию.
В принципе, работа сделана, нужно напечатать результат. Следующая строка выдает немного статистики:
#.output(total, " слов; ", #.size(dict), " уникальных слов")
где размер словаря «dict», возвращаемый функцией "#.size", дает нам количество уникальных слов.
Следующий цикл:
> i, 1..10
выводит 10 наиболее часто употребляемых слов.
Эта строка:
key = dict[i]
получает очередной ключ словаря, который и есть слово,
а следующая строка:
#.output(i, " : ", key, " = ", dict[key])
печатает и это слово, и сколько раз оно встречается в тексте. Таким образом, обращение к словарю по числовому индексу возвращает нам ключ записи с этим порядковым индексом, а обращение к словарю по текстовому ключу возвращает нам значение записи, которым является число — сколько раз это слово встретилось в тексте.
Последняя команда:
<
закрывает цикл.
Как видно из этого примера, SPL полностью автоматически определяет тип всех объектов — числовых и текстовых переменных, массивов, а также других объектов. При работе со словарем добавление новых записей производится автоматически.
Спасибо за внимание и успехов в программировании!
Автор: Mr_Kibernetik