0

我从 twitter API 和包中删除了推文,rtweet但我不知道如何处理带有表情符号的文本,因为它们的格式为 '\U0001f600' 并且我尝试的所有正则表达式代码到现在都失败了。我什么也得不到。

例如

 text = 'text text. \U0001f600'
 grepl('U',text)

给我假

 grepl('000',text)

也给我 FALSE。

另一个问题是他们经常坚持之前的词(例如i am here\U0001f600

那么如何让 R 识别这种格式的表情符号呢?对于该格式的任何表情符号,我可以在 grepl 中添加什么内容将返回 TRUE?

4

2 回答 2

2

在 R 中,大多数东西都有一个包。在这种情况下textclean,随之而来的是lexicon包含大量词典的软件包。使用 textclean 您可以使用 2 个功能,replace_emoji并且replace_emoji_identifier

text = c("text text. \U0001f600", "i am here\U0001f600")

# replace emoji with identifier:
textclean::replace_emoji_identifier(text)
[1] "text text. lexiconvygwtlyrpywfarytvfis " "i am here lexiconvygwtlyrpywfarytvfis " 

# replace emoji with text representation
textclean::replace_emoji(text)
[1] "text text. grinning face " "i am here grinning face " 

接下来,您可以使用sentimentr对表情符号或文本分析使用情绪评分quanteda。如果您只想检查预期输出中的存在:

grepl("lexicon[[:alpha:]]{20}", textclean::replace_emoji_identifier(text))
[1] TRUE TRUE
于 2018-10-31T17:52:16.000 回答
0

您的问题是您\在代码中使用了单个字符:

text = 'text text. \U0001f600'

它真的应该是\\

text = 'text text. \\U0001f600'

我在使用rtweet库时也有类似的经历。

就我而言,这些推文带来了一些 Unicode 代码点,而不仅仅是表情符号,而且格式如下:"some text<U+code-point>". 在这种情况下,我所做的是将该代码点“转换”为它的图形表示:

library(stringi)

#I use gsub() to replace "<U+code-point>" with "\\ucode-point", the appropriate format
# And stri_unescape_unicode() to un-escape all Unicode sequences    
stri_unescape_unicode(gsub("<U\\+(\\S+)>",
                                   "\\\\u\\1", #replace by \\ucode-point
                                   "some text with #COVID<U+30FC>19"))
#[1] "some text with #COVIDー19"

如果 Unicode 代码点没有像我的情况 (<>) 那样分隔,您应该将正则表达式从 更改"<U\\+(\\S+)>""U(\\S+)"。您应该在这里小心,因为如果在代码点之后出现空格字符,这将正常工作。如果您在代码点之前和之后都附加了单词,则它必须更具体并指示组成它的字符数,例如"U(....)".

您可以尝试使用字符类优化此正则表达式,或仅指定十六进制数字"U([A-Fa-f0-9]+)"

请注意,在 RStudio 控制台中,不会看到表情符号,您可以应用此功能,但要查看表情符号,您必须为此目的使用 R 库。但是可以看到其他字符:"#COVID<U+30FC>19"在 RStudio 控制台中显示为"#COVIDー19".

编辑:"\\S+"当有连续的​​ Unicode 代码点(如"<U+0001F926><U+200D><U+2642>". 在这种情况下,它只替换了第一次出现,我没有深入研究,我只是将我的正则表达式更改为"<U\\+([A-Fa-f0-9]+)>". "[A-Fa-f0-9]"表示十六进制数字。

于 2020-03-20T06:18:10.697 回答