我正在尝试构建一种在twitter中查找表情符号的方法,并将它们与unicode表中的unicode表相关联,但由于我认为编码问题或仅仅是因为我发现它很难识别它们我对这个话题的误解。简而言之,我所做的是从http://www.unicode.org/emoji/charts/full-emoji-list.html中的表格中构建一个表情符号的“库”,其中包含表情符号的标题和代码点(代码)。我在R中用图书馆 rvest 取消了这个。
问题出现在我用推特中的twitteR API从twitter获取信息时。因为emojis的代码看起来并不像这个表中那些。
让我们举一个100(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会为emojis返回此信息?
答案 0 :(得分:9)
我以前对enconding一无所知,但经过几天的阅读后,我想我知道发生了什么。我不完全理解表情符号的编码是如何工作的,但我偶然发现了同样的问题并解决了它。
您希望将\xed��\xed��
映射到其名称解码版本:百分。一种明智的方法可能是在线搜索字典并使用诸如Unicode之类的密钥来替换它。在这种情况下,它将是U+1F4AF
。
您显示的转换不是不同的编码,而是相同编码表情符号的不同符号:
as.data.frame(tweet)
返回<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF>
。iconv(tweet, from="UTF-8", to="ASCII", "byte")
返回<ed><a0><bd><ed><b2><af>
。因此直接使用Unicode是不可行的。另一种方法是使用已经以<ed>...<ed>...
方式编码表情符号的字典,如下所示:emoji list。瞧!只有她的名单不完整,因为它来自
包含较少表情符号的字典。
快速解决方案简单地抓取更完整的字典并将<ed>...<ed>...
映射到相应的英文文本翻译。我已经这样做了并且发布了 here。
虽然没有其他人发布带有正确编码的列表,但这一事实让我感到困惑。事实上,我发现的大多数词典都使用UTF-8编码而不是<ed>...<ed>...
表示而是使用<f0>...
。事实证明,对于相同的unicode U+1F4AF
,它们都是正确的UTF-8编码,只有不同的字节读取。
答案很长。推文以UTF-16读取,然后转换为UTF-8,这里是转换发散的地方。当读取由成对字节完成时,结果将是UTF-8 <ed>...<ed>...
,当它被四个字节的块读取时,结果将是UTF-8 <f0>...
(为什么这样?我不喜欢完全理解,但我怀疑它与处理器的架构有关。)
因此解决问题的速度较慢(但更有意识)的方法是刮掉<f0>...
字典,将其转换为UTF-16,然后将其转换回UTF-8,你最终会得到两个<ed>...
。这两个<ed>...
被称为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的串联(即{{ 1}}是一个 man cartwheeling ,而独立<f0><9f><a4><b8><e2><80><8d><e2><99><82><ef><b8><8f>
是人推车,<f0><9f><a4><b8>
没什么,<e2><80><8d>
是男性标志,而<e2><99><82>
什么都没有),而男子推车和人推车男性标志显然在语义上相关,我更喜欢更忠诚的人翻译。
答案 1 :(得分:3)
FelipeSuárezColmenares提供的答案非常好,因为它描述了这个问题的机制,但我想指出你here,这是我用&lt; ed&gt; R编码专门针对Twitter。我还有关于如何通过并识别表情符号的散文版本的代码。认为这对于将来偶然发现这个问题的人来说可能更容易。字典是最新的Unicode版本(9),一旦更新的字典出来我也会更新它。
答案 2 :(得分:1)
请尝试输入:iconv(tweet $ text,“latin1”,“ASCII”,sub =“”)
你也有类似的讨论: Emoticons in Twitter Sentiment Analysis in r
此致 玛格达