Как определить существование русского языка в строке (в тексте) при помощи JavaScript?
Мы хотим по строке понимать, есть ли в ней русский текст (или символы), а также если их очень много, то приравнивать данную строку к русскому языку. Как это сделать?
Мы будем отталкиваться от символов русского алфавита. Это 66 символов. На каждую букву приходится два регистра — строчный и заглавный.
let rualph = [«а»,»б»,»в»,»г»,»д»,»е»,»ё»,»ж»,»з»,»и»,»й»,»к»,»л»,»м»,»н»,»о»,»п»,»р»,»с»,»т»,»у»,»ф»,»х»,»ц»,»ч»,»ш»,»щ»,»ъ»,»ы»,»ь»,»э»,»ю»,»я», «А»,»Б»,»В»,»Г»,»Д»,»Е»,»Ё»,»Ж»,»З»,»И»,»Й»,»К»,»Л»,»М»,»Н»,»О»,»П»,»Р»,»С»,»Т»,»У»,»Ф»,»Х»,»Ц»,»Ч»,»Ш»,»Щ»,»Ъ»,»Ы»,»Ь»,»Э»,»Ю»,»Я»];
Нейтральные символы в текстах
У нас есть массив из искомых символов русского языка и теперь нам нужен ещё один массив из нейтральных символов. Что имеется ввиду?
Нейтральные символы — это все возможные знаки препинания в предложении, которые не являются частями алфавита какого-нибудь языка. Список таких символов может быть очень большим, но мы ограничимся самыми популярными.
let arrneutralchars = [‘ ‘, ‘,’,’.’,’!’,’?’,’:’,’;’,’/’,’\\’,’\»,’\»‘,'(‘,’)’,'[‘,’]’,'{‘,’}’,’+’,’-‘,’=’,’_’];
Какова цель массива из нейтральных символов?
Когда мы будем анализировать строку, тогда мы будем исключать из неё нейтральные символы, чтобы правильно рассчитать количества русских букв в противовес всем остальным буквам. Также правильный расчёт поможет нам высчитать правильный процент.
Условие определения русского языка
Какое количество русских символов можно считать достаточным, чтобы с уверенность сказать, что текст преимущественно русский?
Предлагаю остановиться на 50%. Если русских букв больше 50% — значит текст преимущественно русский.
Итоговый вид функции:
function langru(str){
// Русский алфавит включает в себя 66 символов букв в двух регистрах
let rualph = [«а»,«б»,«в»,«г»,«д»,«е»,«ё»,«ж»,«з»,«и»,«й»,«к»,«л»,«м»,«н»,«о»,«п»,«р»,«с»,«т»,«у»,«ф»,«х»,«ц»,«ч»,«ш»,«щ»,«ъ»,«ы»,«ь»,«э»,«ю»,«я»,«А»,«Б»,«В»,«Г»,«Д»,«Е»,«Ё»,«Ж»,«З»,«И»,«Й»,«К»,«Л»,«М»,«Н»,«О»,«П»,«Р»,«С»,«Т»,«У»,«Ф»,«Х»,«Ц»,«Ч»,«Ш»,«Щ»,«Ъ»,«Ы»,«Ь»,«Э»,«Ю»,«Я»];
// Получаем массив символов из строки текста
let arrfromstr = […str];
// Массив с нейтральными символами, не имеющими отношения к языку
let arrneutralchars = [‘ ‘, ‘,’,‘.’,‘!’,‘?’,‘:’,‘;’,‘/’,‘\\‘,‘\’‘,‘\»‘,‘(‘,‘)’,‘[‘,‘]’,‘{‘,‘}’,‘+’,‘-‘,‘=’,‘_’];
// Находим разницу между массивами
for (r of arrneutralchars){
arrfromstr = arrfromstr.filter(i=>!i.includes(r));
}
console.log(‘Фильтрованный массив из оригинальной строки: ‘,arrfromstr);
// Считаем количество русских символов в строке после вычета нейтральных символов
console.log(‘Длина строки без нейтральных символов: ‘, arrfromstr.length);
let percru = arrfromstr.filter(i=>rualph.includes(i)).length * 100 / arrfromstr.length;
// Считаем процент русских символов в строке после вычета нейтральных символов
console.log(‘Процент русских символов: ‘, percru);
if(percru>50){
return true;
};
// Если не попадаем в условие, тогда возвращаем ЛОЖЬ (русского языка недостаточно в строке)
return false;
}
Как работает функция определения русского языка в строке?
Вызывать функцию будем в 3 примера:
langru('Маша кушала еду.'); // 100 процентов langru('Маша купила Lamborgini.'); // 50 процентов langru('My name is Маша!'); // 33.3 процента
Скриншот работы из браузера:
Для удобства анализа информации в консоль выведена дополнительная информация по вызовам функций с разными переданными строками.
В первом случае мы видим, что функция определила текст как русский на 100 процентов.
Во втором случае русских символов было всего 50 процентов, а значит его нельзя назвать русским.
Ну и третий вариант получился ниже 34 процентов, а значит это точно не русский язык.
Чувствительность функции
Данную функцию можно удобно настроить для своих задач по определению русского текста в строке JavaScript. Для этого достаточно поменять цифру в условной конструкции IF.
Для меньшей чувствительности можно установить значение менее 50 но не менее 5, например.
Всегда помните что у нас имеется всего 100 вариантов. От нуля до 100 процентов. Функция не защищена от ошибки, поэтому правьте внимательно.
Как можно улучшить средние значения?
Согласитесь, что число в 50% может встречаться в анализах довольно часто. Например это могут быть заголовки товаров в интернет магазинах, где категория представляет из себя русские символы, а название товара — английские.
В таких случаях можно учитывать количество слов в строке. Или можно расставить приоритеты. Например, если строка начинается на русское слово, то текст будет иметь отношение к русскому.
Напридумывать можно много всего. Зависит от задачи.
Информационные ссылки
Стандарт ECMAScript — https://tc39.es/ecma262/