JavaScript | Из каких символов состоит текст (строка)?

JavaScript | Из каких символов состоит текст (строка)?

Представим, что у нас есть некоторый текст. Пусть это будет товар интернет-магазина и его описание. Нам этот текст пришёл в виде строки JavaScript:

var text = "Смарт-часы Samsung Galaxy Watch Active2 SM-R820 Лакрица. ЦИФЕРБЛАТ На Super AMOLED-экран диагональю 1,4 дюйма с разрешением 360 x 360 пикселей выводится детальное, яркое и контрастное изображение с широкими углами обзора. Дисплею из прочного стекла Gorilla Glass DX+ не страшны царапины и сколы."

Мы хотим узнать из каких символов состоит весь текст. То есть мы хотим знать из каких букв, цифр и знаков препинания состоит наш текст. Мы хотим получить набор уникальных значений. Как это сделать?

 

Создание массива символов

Все строки в JavaScript являются итерируемыми объектами, а значит могут быть приведены к массиву. Воспользуемся методом from у конструктора Array и создадим массив из строки.

Array.from(text)

В ответ мы получим массив, в котором каждый символ сроки будет являться значением элемента массива. Последовательность элементов в массиве совпадает с последовательностью символов строки текста. Всего в массиве получится 295 элементов.

Текстовую строку перевели в массив - JavaScript
Текстовую строку перевели в массив — JavaScript

Сейчас каждый символ текстовой строки имеет своё положение в массиве. Если смотреть на элементы массива по отдельности, то какие-то значения будут повторяться. Нам не нужны дубли(клоны) — мы хотим знать только уникальные значения (уникальные символы).

 

Создание набора символов

Решить эту задачу нам поможет конструктор Set, который является свойством Глобального Объекта в JavaScript.

Вызовем конструктор и передадим в него наш массив для создания объекта «набора»:

new Set(Array.from(text))

В ответ нам приходит объект-прототип класса Set, состоящий из 81 элемента.

Новый набор из массива - JavaScript
Новый набор из массива — JavaScript

 

Мы получили итерируемый объект и теперь можем передать его в новый метод from класса Array.

Array.from(new Set(Array.from(text)))

В ответ нам придёт массив, который будет состоять из уникальных символов первоначального текста.

Массив символов текста - JavaScript
Массив символов текста — JavaScript

На этом этапе важно понимать, что значения не будут отсортированы в алфавитном порядке. Ещё важно то, что некоторые символы русского языка будут похожи на символы английского языка. Так может показаться, что в массиве две буквы «а». Но это не так. Один символ английский, другой русский.

Чтобы отличать эти «похожие» символы можно дополнительно воспользоваться «символьными кодами».

Что мы имеем на данный момент? Текст длиной в 295 символов состоит из 81 уникального символа.

 

Сколько раз встречается каждый уникальный символ в тексте?

Как произвести расчёт количества раз, когда символ появлялся в тексте?

Логика вычислений такая. У нас есть массив из всех 295 символов. У нас есть массив из 81 уникального символа. Мы будем брать уникальный символ из 81 и фильтровать по нему полный массив из 295. Результат фильтраций будет возвращать нам массив, в котором количество элементов будут означать частоту появления символа в тексте. Итоговые данные будем хранить в массивах по два элемента, где  первым элементом будет сам символ, а вторым его частота в тексте.

var itog = Array.from(new Set(Array.from(text))).map(z => [z, (Array.from(text)).filter(i => i==z).length])

Мы получим такой вариант представления количества

[["С",1],["м",5],["а",19],["р",13],["т",7],["-",3],["ч",2],["с",10],["ы",5],[" ",41],["S",3],["a",6],["m",1],["s",3],["u",2],["n",1],["g",1],["G",3],["l",4],["x",2],["y",1],["W",1],["t",2],["c",2],["h",1],["A",2],["i",2],["v",1],["e",2],["2",2],["M",2],["R",1],["8",1],["0",3],["Л",2],["к",8],["и",16],["ц",2],[".",3],["Ц",1],["И",1],["Ф",1],["Е",1],["Р",1],["Б",1],["А",1],["Т",1],["Н",1],["p",1],["r",2],["O",1],["L",1],["E",1],["D",2],["э",1],["н",11],["д",4],["г",3],["о",14],["л",7],["ь",2],["ю",3],["1",1],[",",2],["4",1],["й",2],["з",4],["е",14],["ш",3],["3",2],["6",2],["п",4],["в",2],["я",2],["б",2],["ж",1],["у",1],["Д",1],["o",1],["X",1],["+",1]]
Итоговый массив с частотой символов в тексте - JavaScript
Итоговый массив с частотой символов в тексте — JavaScript

Забавно то, что мы работали только с массивами и не использовали ни одного метода из класса String.

 

Для более удобного восприятия данных, мы можем отсортировать итоговый массив по частоте в сторону убывания.

itog.sort(function(x,y){return y[1]-x[1]})
или
itog.sort((x,y)=>y[1]-x[1])
[[" ",41],["а",19],["и",16],["е",14],["о",14],["р",13],["н",11],["с",10],["к",8],["л",7],["т",7],["a",6],["м",5],["ы",5],["l",4],["д",4],["з",4],["п",4],["-",3],[".",3],["0",3],["G",3],["S",3],["s",3],["г",3],["ш",3],["ю",3],[",",2],["2",2],["3",2],["6",2],["A",2],["D",2],["M",2],["c",2],["e",2],["i",2],["r",2],["t",2],["u",2],["x",2],["Л",2],["б",2],["в",2],["й",2],["ц",2],["ч",2],["ь",2],["я",2],["+",1],["1",1],["4",1],["8",1],["E",1],["L",1],["O",1],["R",1],["W",1],["X",1],["g",1],["h",1],["m",1],["n",1],["o",1],["p",1],["v",1],["y",1],["А",1],["Б",1],["Д",1],["Е",1],["И",1],["Н",1],["Р",1],["С",1],["Т",1],["Ф",1],["Ц",1],["ж",1],["у",1],["э",1]]
Итоговый массив отсортирован по убыванию частоты символов в тексте - JavaScript
Итоговый массив отсортирован по убыванию частоты символов в тексте — JavaScript

Теперь нам наглядно видно, что чаще всего в тексте встречается символ пробела. Далее по популярности идут гласные буквы.

 

Информационные ссылки

JavaScript | Массивы (Array)

JavaScript | Array | from

Стандарт ECMAScript — Раздел «22.1 Array Objects» — https://tc39.es/ecma262/#sec-array-objects

Стандарт ECMAScripthttps://tc39.es/ecma262/