R: преобразование кириллического Unicode в латинский текст

У меня есть текст Unicode, собранный с веб-сайта, который на кириллице использует R selenium, язык сербский.

Образец текста в формате Юникод имеет следующую форму:

<U+041A><U+0440><U+0430><U+0433><U+0443><U+0458><U+0435><U+0432><U+0430><U+0446> <U+0410><U+0421>

Далее у меня текст собран в виде таблицы. Где приведенный выше текст Unicode будет одной строкой, в то время как другие столбцы/строки уже могут быть в латинском алфавите.

Я занимался этим часами и пытаюсь:

  1. Либо преобразовать юникод в кириллицу, либо
  2. Преобразование Unicode непосредственно в латинский алфавит

Моя последняя попытка заключалась в использовании пакета stringi, но она не сработала: stringi::stri_trans_general(Table_save,"latin-ascii")

Любой совет будет принят с благодарностью! Спасибо


person Roberto    schedule 01.12.2020    source источник
comment
после этого такая же проблема!   -  person Peter Alexander    schedule 01.12.2020


Ответы (1)


Я надеюсь, что мое решение поможет. Во-первых, как вы, наверное, знаете, текст U+041A — это шестнадцатеричный код. Я хочу это подчеркнуть, потому что считаю плохой идеей конвертировать эти коды в кириллицу. Я думаю, что лучше всего работать с вашим текстом через шестнадцатеричный Unicodes. Другими словами, при работе с текстом имейте в виду юникоды букв, а не буквы как таковые.

Таким образом, будет проще выполнять регулярное выражение и другие преобразования в вашем тексте. Если вы хотите прочитать свой текст как кириллицу, вам просто нужно попросить R интерпретировать ваш вектор Unicodes как текст UTF-8 с помощью такой функции, как intToUtf8().

Первое, что вам нужно сделать, это разделить каждое кириллическое слово. Таким образом, вы хотите обнаружить каждое пустое место в тексте и заменить его соответствующим юникодом (да, даже белые пробелы имеют юникод). После этого вам нужно разделить каждую букву (раньше я разделял каждое слово, теперь я хочу разделить каждую букву или символ, из которых состоит ваша фраза).

Далее мне нужно исключить другие метасимволы (› и +) и оставить только шестнадцатеричный код в каждом элементе вектора a. После этого я просто заменяю каждую букву U на 0x, чтобы изолировать только шестнадцатеричную часть Unicode. Этот способ проще, потому что для чтения кода U041A как Unicode мне нужно вставить одну обратную косую черту (что приводит к \U041A) перед U, и я изо всех сил пытался это сделать. После этих шагов каждый элемент вектора a представляет собой символ (или букву), образующий вашу фразу.

library(tibble)
library(stringr)
text <- "<U+041A><U+0440><U+0430><U+0433><U+0443><U+0458><U+0435><U+0432><U+0430><U+0446> <U+0410><U+0421>" 

a <- str_replace_all(text, " ", replacement = "<U+0020>") # replace white spaces

a <- unlist(str_split(a, "[<]"))

a <- a[-1]

  
a <- str_replace_all(a, ">", "")
  
a <- str_replace_all(a, "\\+", "")
  
a <- str_replace_all(a, "U", "0x")


intToUtf8(a)

[1] "Крагујевац АС"
person Pedro Faria    schedule 01.12.2020