R: обработка и преобразование смайликов в каноническую форму - PullRequest
0 голосов
/ 24 мая 2019

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

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

Одни и те же эмодзи могут появляться в нескольких формах.

Например (а это только кодировки, которые я нашел в моих данных):

\U01F9E8
<U+1F9E8>
&#129512;
<f0><9f><a7><a8>

все относятся к одному и тому же смайлику.

До сих пор мне не удалось найти какую-либо функцию R, пакет или что-либо другое, что позволило бы мне свободно взаимообращаться между этими кодировками.

utf8ToInt () может обрабатывать некоторые, но не другие:

> utf8ToInt("U+1F9E8")
[1] 85 43 49 70 57 69 56

> utf8ToInt("\U+1F9E8")
Error: '\U' used without hex digits in character string starting ""\U"

> utf8ToInt("\\U+1F9E8")
[1] 92 85 43 49 70 57 69 56

> utf8ToInt("U01F9E8")
[1] 85 48 49 70 57 69 56

> utf8ToInt("\\U01F9E8")
[1] 92 85 48 49 70 57 69 56

> utf8ToInt("\U01F9E8")
[1] 129512

Только последний ввод дает правильный ответ.Теоретически можно использовать регулярные выражения для преобразования этих похожих примеров в окончательный, но присутствие escape-символа '\' действительно мешает мне в этом попытаться.

Я застрял на этомв течение последних нескольких дней, и это действительно влияет на мою производительность. Есть ли уловка, функция или пакет, который я могу использовать в R, который помог бы мне преобразовать коды для этих смайликов?

1 Ответ

0 голосов
/ 24 мая 2019

Простой текстовый фильтр для нормализации:

› cat 56283978.txt
lorem \U01F9E8 ipsum
lorem <U+1F9E8> ipsum
lorem &#129512; ipsum
lorem <f0><9f><a7><a8> ipsum

› perl -MEncode=decode_utf8 -0777 -lpe'

    s   { < U \+ ( [[:xdigit:]]+ ) > }
        { "\\U" . substr("000000" . $1, -6) }egmsx;

    s   { & \# ( [[:digit:]]+ ) ; }
        { sprintf("\\U%06X", $1) }egmsx;

    s   { ( (?: < [[:xdigit:]]{2} > )+ ) }
        {   sprintf "\\U%06X", ord decode_utf8 join "",
            map chr hex, grep length, split /[<>]/, $1 }egmsx;

' 56283978.txt
lorem \U01F9E8 ipsum
lorem \U01F9E8 ipsum
lorem \U01F9E8 ipsum
lorem \U01F9E8 ipsum

Существуют более простые решения с pack , но afaik, который не реализован в R, и я хотел оставить регулярное выражениепортативный для вас.

...