Теперь работа дополнена созданием также функции транслитерации, выполняющей преобразование строки русского текста в транслит латиницы. При этом если в строке присутствуют латинские символы, то они не транслируются, то есть функции можно передавать в качестве аргумента смешанную строку символов и слов.
Преобразование символов происходит согласно ГОСТ 7.79-2000 (система Б). Особые правила транслитерации имён не учитываются, за исключением особого преобразования окончаний «ЬЕ» траслитерируется как «IE» и «ЫЙ» как «IJ».
Ниже приведет полный код функции:
# Function Translite of Russian characters for sending in Telegram
# by Sertik 16/09/2020
# usage [$FuncTransliteToTele "Строка String .,!+"]
:global FuncTransliteToTele do={
:global string; :set $string $1;
# table of the codes of Russian letters Translite
:local rsimv [:toarray {"А"="A"; "Б"="B"; "В"="V"; "Г"="G"; "Д"="D"; "Е"="E"; "Ж"="ZH"; "З"="Z"; "И"="I"; "Й"="J"; "К"="K"; "Л"="L"; "М"="M"; "Н"="N"; "О"="O"; "П"="P"; "Р"="R"; "С"="S"; "Т"="T"; "У"="U"; "Ф"="F"; "Х"="KH"; "Ц"="C"; "Ч"="CH"; "Ш"="SH"; "Щ"="SCH"; "Ъ"="``"; "Ы"="Y`"; "Ь"="`"; "Э"="E`"; "Ю"="JU"; "Я"="YA"; "а"="a"; "б"="b"; "в"="v"; "г"="g"; "д"="d"; "е"="e"; "ж"="zh"; "з"="z"; "и"="i"; "й"="j"; "к"="k"; "л"="l"; "м"="m"; "н"="n"; "о"="o"; "п"="p"; "р"="r"; "с"="s"; "т"="t"; "у"="u"; "ф"="f"; "х"="kh"; "ц"="c"; "ч"="ch"; "ш"="sh"; "щ"="sch"; "ъ"="``"; "ы"="y`"; "ь"="`"; "э"="e`"; "ю"="ju"; "я"="ya"; "Ё"="Yo"; "ё"="yo"; "№"="#"}]
# encoding of the symbols and аssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)];
:local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ($rsimv->$keys);} else={:set $code $keys};
:if (($keys="Ь") and ([:pick $string ($i+1) (2+$i)]="Е")) do={:set $code "I"; :set $i ($i+1)}
:if (($keys="ь") and ([:pick $string ($i+1) (2+$i)]="е")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="Ь") and ([:pick $string ($i+1) (2+$i)]="е")) do={:set $code "I"; :set $i ($i+1)}
:if (($keys="ь") and ([:pick $string ($i+1) (2+$i)]="Е")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="Ы") and ([:pick $string ($i+1) (2+$i)]="Й")) do={:set $code "I"; :set $i ($i+1)}
:if (($keys="ы") and ([:pick $string ($i+1) (2+$i)]="й")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="ы") and ([:pick $string ($i+1) (2+$i)]="Й")) do={:set $code "i"; :set $i ($i+1)}
:if (($keys="Ы") and ([:pick $string ($i+1) (2+$i)]="й")) do={:set $code "I"; :set $i ($i+1)}
:set $StrTele ("$StrTele"."$code")}
:set $string $StrTele
:return $string;
}
Вот пример работы:
:local string [$FuncTransliteToTele "Привет от Микротик ! Работает функция-транслитератор Russian alfabit для Telegramm. Заяц Белый"]
:log warning $string
Вывод в логе:
Privet ot Mikrotik! Rabotaet funksiya-konverter Russian-alfabit dliya Telegramm. Zayac beliy.
Пользователь может поправить таблицу транслитерации под используемый им стандарт. Надеюсь кому-то пригодится. Теперь можно быть спокойным за пересылку русских сообщений в Телеграмм как с помощью конвертации по кодам UTF-8 с помощью моей функции конвертера отсюда так и транслитерацией.
Aspos
Хозяйке на заметку: Глаза будут меньше кровоточить если применить простую нейросетку (хоть и на javascript) которая будет почти без потерь транлитерировать в обе стороны.
vabka
Это троллинг такой? Транслитерация — достаточно простая и понятная задача, чтобы не использовать тут нейронки. + Нейронка требует обучения => Нужен какой-то датасет, который, видимо, надо сгенерировать.
Не говоря уже о том, что тут JS нельзя применить.
Aspos
Нет, это не троллинг. Если транслитерация нужна не для официальных документов, карточек и паспортов, то нейросетка всегда делает это лучше простенького алгоритма.
Если есть задача сделать так чтобы иностранец мог прочитать русский текст на уличной вывеске или меню ресторана близко к оригиналу, то «борщ» должен стать «borscht» потому что так привычно; «Хрущёв» должен писаться без этих ужасных kh и так далее. Вот с этим хорошо тренированая нейросетка справляется отлично.
Я не очень знаком с microtik и не знаю какие скриптовые языки на нём можно гонять, но знаю, что почти под любой скриптовый язык есть уже реализации нейросеток.
Если нет, я почти уверен, микротик может вызвать внешний вебсервис который может крутиться где угодно.
Датасет собирается англо-русско-говорящей домохозяйкой за пару вечеров, реально.
Это не троллинг, а искренний коммент написаный в надежде что он кому-нибудь пригодится.