【问题标题】:Twitter emoji encoding problems with twitteR and RtwitteR 和 R 的 Twitter 表情符号编码问题
【发布时间】:2019-05-26 19:47:25
【问题描述】:

我正在尝试构建一种在 twitter 中查找表情符号并将它们与可以在 unicode.org 中找到的 unicode 表相关联的方法,但我发现很难识别它们,因为我认为是编码问题或只是我对这个话题的误解。简而言之,我所做的是从http://www.unicode.org/emoji/charts/full-emoji-list.html 中的表中构建一个表情符号“库”,其中包含表情符号的标题和代码点(代码)。我用库 rvest 在 R 中废弃了这个。

当我使用 R 中的 twitteR API 从 twitter 获取信息时,问题就出现了。因为表情符号的代码与此表中的代码完全不同。

让我们以 100(一百点)红色图标的表情符号为例。这是之前链接表中的数字 1468,其代码点代码为:

U+1F4AF

现在,当我从 twitter 获取它时,首先它在 API 内置的用于处理推文的状态类中显示为这样。

\xed��\xed��

然后,一旦我将其转换为数据帧,我也会使用来自 twitter API 的内置函数来执行此操作。例如:

tweet$toDataFrame()

表情变成这样:

<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF>

我尝试用R中的iconv函数转换它,代码如下:

iconv(tweet$text, from="UTF-8", to="ASCII", "byte)

我只是设法让它看起来像这样:

<ed><a0><bd><ed><b2><af>

所以,在我的测试结束时,我得到了以下结果:

<ed><a0><bd><ed><b2><af>
<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF>
\xed��\xed��

没有一个看起来像表格指定的代码点:

U+1F4AF

是否有可能在两个字符串之间进行转换? 我错过了什么?为什么 twitter 会为表情符号返回此信息?

【问题讨论】:

  • 你找到解决办法了吗?

标签: r twitter encoding utf-8 emoji


【解决方案1】:

我以前对编码一无所知,但经过几天的阅读,我想我知道发生了什么。我不完全理解表情符号的编码是如何工作的,但我偶然发现了同样的问题并解决了它。

您想将\xed��\xed�� 映射到其名称解码版本:百分。一个明智的方法可能是在线搜索字典并使用一个键(例如 Unicode)来替换它。在这种情况下,它将是U+1F4AF。 您显示的转换不是不同的编码,而是相同编码表情符号的不同表示法:

  1. as.data.frame(tweet) 返回&lt;ed&gt;&lt;U+00A0&gt;&lt;U+00BD&gt;&lt;ed&gt;&lt;U+00B2&gt;&lt;U+00AF&gt;
  2. iconv(tweet, from="UTF-8", to="ASCII", "byte") 返回&lt;ed&gt;&lt;a0&gt;&lt;bd&gt;&lt;ed&gt;&lt;b2&gt;&lt;af&gt;

所以直接使用 Unicode 是不可行的。另一种方法可能是使用已经以&lt;ed&gt;...&lt;ed&gt;... 方式编码表情符号的字典,就像这里的:emoji list。瞧!只有她的清单不完整,因为它来自 包含较少表情符号的字典。

快速的解决方案是简单地抓取一个更完整的字典并将&lt;ed&gt;...&lt;ed&gt;... 与其对应的英文文本翻译映射。我已经这样做了,并且发布了 here

尽管没有其他人发布具有正确编码的列表这一事实困扰着我。事实上,我发现的大多数字典都有 UTF-8 编码,使用的不是&lt;ed&gt;...&lt;ed&gt;... 表示,而是&lt;f0&gt;...。事实证明,对于相同的 unicode U+1F4AF,它们都是正确的 UTF-8 编码,只是字节的读取方式不同。

长答案。推文以 UTF-16 读取,然后转换为 UTF-8,这就是转换不同的地方。当读取由字节对完成时,结果将是 UTF-8 &lt;ed&gt;...&lt;ed&gt;...,当它由四个字节的块读取时,结果将是 UTF-8 &lt;f0&gt;...(这是为什么?我不完全明白,但我怀疑这与您的处理器架构有关)。

因此,解决问题的一种较慢(但更有意识)的方法是刮取&lt;f0&gt;... 字典,将其转换为 UTF-16,成对转换回 UTF-8,您将得到两个 @ 987654337@。这两个 &lt;ed&gt;... 被称为 Unicode U+xxxxx 的低高代理对表示。

举个例子:

unicode <- 0x1F4Af

# Multibyte Version
intToUtf8(unicode)

# Byte-pair Version
hilo <- unicode2hilo(unicode)
intToUtf8(hilo)

返回:

[1] "\xf0\u009f\u0092�"
[1] "\xed��\xed��"

同样,使用iconv(..., 'utf-8', 'latin1', 'byte'),与以下内容相同:

[1] "<f0><9f><92><af>"
[1] "<ed><a0><bd><ed><b2><af>"

PS1.: 函数unicode2hilo是hi-lo到unicode的简单线性变换

unicode2hilo <- function(unicode){
   hi = floor((unicode - 0x10000)/0x400) + 0xd800
   lo = (unicode - 0x10000) + 0xdc00 - (hi-0xd800)*0x400
   hilo = paste('0x', as.hexmode(c(hi,lo)), sep = '')
   return(hilo)
}

hilo2unicode <- function(hi,lo){
   unicode = (hi - 0xD800) * 0x400 + lo - 0xDC00 + 0x10000 
   unicode = paste('0x', as.hexmode(unicode), sep = '')
   return(unicode)
}

PS2.: 我建议使用iconv(tweet, 'UTF-8', 'latin1', 'byte') 来保留特殊字符,例如 áäà。

PS3.: 要将表情符号替换为其英文文本、标签、哈希或任何您想将其映射到的内容,我建议在表情符号图中使用 DFS,因为有些表情符号的 unicode 是其他更简单的 unicode 的串联(即@987654347 @ 是一个男人翻车,而独立&lt;f0&gt;&lt;9f&gt;&lt;a4&gt;&lt;b8&gt;人翻车&lt;e2&gt;&lt;80&gt;&lt;8d&gt; 什么都不是,&lt;e2&gt;&lt;99&gt;&lt;82&gt; 是一个男性标志,而&lt;ef&gt;&lt;b8&gt;&lt;8f&gt; 什么都不是)虽然 man cartwheelingperson cartwheeling male sign 显然在语义上相关,但我更喜欢更忠实的翻译。

【讨论】:

  • 有趣的是,我一直在与此作斗争并在两天前解决了它。不过,您的解决方案和解释比我想出的要好得多。这是一种值得有史以来最大的“接受为答案”的答案。希望这对其他人有用。
【解决方案2】:

Felipe Suárez Colmenares 提供的答案非常好,因为它描述了这个问题的机制,但我想指出您here,这是我使用 R 编码专门为 Twitter 制作的字典。我还有关于如何通过和识别表情符号的散文版本的代码。认为这对于将来偶然遇到这个问题的人来说可能会更容易。这本词典是最新的 Unicode 版本 (9),一旦更新了,我也会更新它。

【讨论】:

    【解决方案3】:

    请尝试输入:iconv(tweet$text, "latin1", "ASCII", sub="")

    你也有类似的讨论: Emoticons in Twitter Sentiment Analysis in r

    问候, 玛格达

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 2013-03-22
      • 2019-02-26
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多