首页 > 解决方案 > R:处理表情符号并将其转换为规范形式

问题描述

就在一周前,我还是一个甜蜜的暑假儿童数据科学家,对字符编码一无所知。

我正在尝试捕获文本中的表情符号(从不同地方提取的来源)并将每个表情符号标记为一个单一的规范形式,然后我可以对其进行分析。

同一个表情符号可以以多种形式出现。

例如(这只是我在数据中找到的编码):

\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

只有最后一个输入给出正确答案。理论上,可以使用正则表达式将这些类似的示例转换为最后一个示例,但是转义字符“\”的存在确实使我尝试这样做时遇到了麻烦。

在过去的几天里,我一直坚持这一点,这确实影响了我的工作效率。有没有我可以在 R 中使用的技巧、函数或包来帮助我相互转换这些表情符号的代码?

标签: runicodecharacter-encodingemoji

解决方案


用于规范化的简单文本过滤器:

› 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 中实现,我想让 regex 为您提供可移植性。


推荐阅读