Pull to refresh

Язык программирования SPL — пример решения задачи

Reading time3 min
Views9.6K
В этой статье я расскажу о том, как можно в языке программирования 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 полностью автоматически определяет тип всех объектов — числовых и текстовых переменных, массивов, а также других объектов. При работе со словарем добавление новых записей производится автоматически.

Спасибо за внимание и успехов в программировании!
Tags:
Hubs:
+8
Comments72

Articles

Change theme settings