r - R:处理表情符号并将其转换为规范形式
问题描述
就在一周前,我还是一个甜蜜的暑假儿童数据科学家,对字符编码一无所知。
我正在尝试捕获文本中的表情符号(从不同地方提取的来源)并将每个表情符号标记为一个单一的规范形式,然后我可以对其进行分析。
同一个表情符号可以以多种形式出现。
例如(这只是我在数据中找到的编码):
\U01F9E8
<U+1F9E8>
🧨
<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 中使用的技巧、函数或包来帮助我相互转换这些表情符号的代码?
解决方案
用于规范化的简单文本过滤器:
› cat 56283978.txt
lorem \U01F9E8 ipsum
lorem <U+1F9E8> ipsum
lorem 🧨 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 为您提供可移植性。
推荐阅读
- mongodb - mongoimport 在(公共)GCS 存储桶中找不到文件
- javascript - 刷新上一页下拉选择
- python - 如何检查嵌套列表中的多个值是否彼此相邻?
- grpc - Grpc Springboot 休息控制器的好处
- html - HTML - 如何将框与里面的单词垂直对齐
- mutation-testing - 是否有文本报告保存在您的机器中以供 stryker-mutator 使用?
- android - Flutter 依赖错误 - 版本解决失败
- r - ggplot条形图中的计数标签问题
- github-actions - GitHub 操作 - 设置
- angular - APP_INITIALIZER 执行后如何提供服务