2016-02-27 208 views
1

我想在R上做一个表情符号分析。 我已经存储了一些有emojis的推文。表情符号在R [UTF-8编码]

这里是推特的一个,我想分析:

> tweetn2 
[1] "Programme du week-end: \xed\xa0\xbd\xed\xb2\x83\xed\xa0\xbc \xed\xbe\xb6\xed\xa0\xbc 
    \xed\xbd\xbb\xed\xa0\xbc\xed\xbd\xbb\xed\xa0\xbc \xed\xbd\xbb\xed\xa0\xbc\xed\xbd\xbb" 

可以肯定的说我有 “UTF-8”:

> Encoding(tweetn2) 
[1] "UTF-8 

“ 现在,当我试图认识一些字,​​它不工作的罚款

> grepl("\\xed",tweetn2) 
[1] FALSE 

> grepl("xed",tweetn2) 
[1] FALSE 

但似乎表情符号,“\固定的\ XA0 \ XBD”不是“UTF-8”编码,因为我得到一个错误信息,当我写:

> str(tweetn2) 
Error in str.default(tweetn2) : invalid multibyte string, element 1 

我找到一种解决方案通过用iconv()函数和“ASCII”编码有:
http://www.r-bloggers.com/emoticons-decoder-for-social-media-sentiment-analysis-in-r/

但我想用“UTF-8”为我的分析,以保持,因为它与法国的特殊字母效果良好(A,E,E,E ,ë,û等)

那么你有一个想法,我怎么能超过它?

谢谢

+1

只使用一个反斜杠:'grepl(“\ xed”,tweetn2)'。 '\ xed'是一个单独的字符,所以没有反斜线,并且你的字符串不包含子字符串'“xed”'。 – Stibu

+1

感谢您的帮助,但它不工作: '> grepl(“\固定的”,tweetn2) [1] FALSE' – Woza

回答

1

字符串无效UTF-8,如指示。你有什么是用UTF-8编码的UTF-16。所以\xED\xA0\xBD是高代理U+D83D, - 和\xED\xB2\x83是低代理U+DC83

如果你申请的神奇High,Low -> Codepoint formula,你会与实际编码点结束:

(0xD83D - 0xD800) * 0x400 + 0xDC83 - 0xDC00 + 0x10000 = 0x1F483 

你会看到这是dancer emoji。不幸的是我没有给你一个建议,因为我对R不太熟悉。但是我可以说你一定想让自己处于一个这样的数据被双重编码的位置!希望能帮助你顺着正确的方向前进。

+0

非常感谢您的帮助:) 它帮助了我很多 – Woza

+1

怎样才能从去作为\ xDEL \ xA0 \ xBD到U + D83D的高代理?我无法选择从U + D83D到\ xED \ xA0 \ xBD的方式。 –

0

我用iconv(tweet, 'UTF-8', 'latin1', 'byte')与波浪保存字符:

> tweetn2 
[1] "Prógrämmè dü week-eñd: \xed��\xed�\u0083\xed��\xed��\xed��\xed��\xed��\xed��\xed��\xed�� " 
> iconv(tweetn2, 'UTF-8', 'latin1', 'byte') 
[1] "Prógrämmè dü week-eñd: <ed><a0><bd><ed><b2><83><ed><a0><bc><ed><bd><bb><ed><a0><bc><ed><bd><bb><ed><a0><bc><ed><bd><bb><ed><a0><bc><ed><bd><bb> " 

至于表情符号解码我会建议使用实施nj_的answer功能。或直接使用表情符号字典,如我的proposed

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) 
}