将 R 中的表情符号替换为 replace_emoji() 函数由于编码不同而不起作用 - UTF8/Unicode?
Replace Emojis in R with replace_emoji() function does not work due to different encoding - UTF8/Unicode?
我正在尝试清理我的文本数据并将表情符号替换为文字,以便稍后进行情绪分析。
因此,我使用了 textclean 包中的 replace_emoji
函数。这应该用相应的单词替换所有表情符号。
我正在使用的数据集是一个文本语料库,这也是我在下面的示例代码中使用 tm 包中的 VCorpus
函数的原因:
text <- "text goes here bla bla <u+0001f926><u+0001f3fd><u+200d><u+2640><u+fe0f>" #text with emojis
text.corpus <- VCorpus(VectorSource(text)) #Transforming into corpus
text.corpus <- tm_map(text.corpus, content_transformer(function(x) replace_emoji(x, emoji_dt = lexicon::hash_emojis))) #This function should change Emojis into words
inspect(text.corpus[[1]]) #inspecting the corpus shows that the Unicode was NOT replaced with words
head(hash_emojis) #This shows that the encoding in the lexicon is different than the encoding in my text data.
尽管该函数本身有效,但它不会替换我文本中的表情符号,因为 "hash_emojis" 数据集中的编码似乎与我的数据中的编码不同。因此,该功能不会将表情符号替换为文字。我也尝试过使用 iconv
函数转换 "hash_emojis" 数据,但不幸的是没有设法改变编码。
我想用文字替换我的数据集中显示的 Unicode 值。
我找到了 来回答你的问题。今天晚些时候,当您阅读我的回答时,我会将此标记为重复。
使用我的示例:
library(stringi)
library(magrittr)
"text goes here bla bla <u+0001F600><u+0001f602>" %>%
stri_replace_all_regex("<u\+([[:alnum:]]{4})>", "\\u") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{5})>", "\\U000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{6})>", "\\U00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{7})>", "\\U0") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{8})>", "\\U") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{1})>", "\\u000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{2})>", "\\u00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{3})>", "\\u0") %>%
stri_unescape_unicode() %>%
stri_enc_toutf8() %>%
textclean::replace_emoji()
[1] "text goes here bla bla grinning face face with tears of joy "
现在请注意 unicode 表示。示例答案中的 "U" 为大写,我将其更改为小写 "u" 以反映您的示例。
结合一切:
# create a function to use within tm_map
unicode_replacement <- function(text) {
text %>%
stri_replace_all_regex("<u\+([[:alnum:]]{4})>", "\\u") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{5})>", "\\U000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{6})>", "\\U00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{7})>", "\\U0") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{8})>", "\\U") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{1})>", "\\u000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{2})>", "\\u00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{3})>", "\\u0") %>%
stri_unescape_unicode() %>%
stri_enc_toutf8()
}
library(tm)
library(textclean)
text.corpus <- VCorpus(VectorSource(text)) #Transforming into corpus
text.corpus <- tm_map(text.corpus, content_transformer(unicode_replacement))
text.corpus <- tm_map(text.corpus, content_transformer(function(x) replace_emoji(x, emoji_dt = lexicon::hash_emojis)))
inspect(text.corpus[[1]])
<<PlainTextDocument>>
Metadata: 7
Content: chars: 92
text goes here bla bla <f0><9f><a4><a6><f0><9f><8f><bd><e2><80><8d> female sign <ef><b8><8f>
现在使用您的示例,您将获得上述结果。检查表情符号 tables,您的 unicode 示例没有出现在 table 中,除了女性符号。但那是另一个问题。如果我使用 "text goes here bla bla ",结果如预期的那样。
我正在尝试清理我的文本数据并将表情符号替换为文字,以便稍后进行情绪分析。
因此,我使用了 textclean 包中的 replace_emoji
函数。这应该用相应的单词替换所有表情符号。
我正在使用的数据集是一个文本语料库,这也是我在下面的示例代码中使用 tm 包中的 VCorpus
函数的原因:
text <- "text goes here bla bla <u+0001f926><u+0001f3fd><u+200d><u+2640><u+fe0f>" #text with emojis
text.corpus <- VCorpus(VectorSource(text)) #Transforming into corpus
text.corpus <- tm_map(text.corpus, content_transformer(function(x) replace_emoji(x, emoji_dt = lexicon::hash_emojis))) #This function should change Emojis into words
inspect(text.corpus[[1]]) #inspecting the corpus shows that the Unicode was NOT replaced with words
head(hash_emojis) #This shows that the encoding in the lexicon is different than the encoding in my text data.
尽管该函数本身有效,但它不会替换我文本中的表情符号,因为 "hash_emojis" 数据集中的编码似乎与我的数据中的编码不同。因此,该功能不会将表情符号替换为文字。我也尝试过使用 iconv
函数转换 "hash_emojis" 数据,但不幸的是没有设法改变编码。
我想用文字替换我的数据集中显示的 Unicode 值。
我找到了
使用我的示例:
library(stringi)
library(magrittr)
"text goes here bla bla <u+0001F600><u+0001f602>" %>%
stri_replace_all_regex("<u\+([[:alnum:]]{4})>", "\\u") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{5})>", "\\U000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{6})>", "\\U00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{7})>", "\\U0") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{8})>", "\\U") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{1})>", "\\u000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{2})>", "\\u00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{3})>", "\\u0") %>%
stri_unescape_unicode() %>%
stri_enc_toutf8() %>%
textclean::replace_emoji()
[1] "text goes here bla bla grinning face face with tears of joy "
现在请注意 unicode 表示。示例答案中的 "U" 为大写,我将其更改为小写 "u" 以反映您的示例。
结合一切:
# create a function to use within tm_map
unicode_replacement <- function(text) {
text %>%
stri_replace_all_regex("<u\+([[:alnum:]]{4})>", "\\u") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{5})>", "\\U000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{6})>", "\\U00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{7})>", "\\U0") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{8})>", "\\U") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{1})>", "\\u000") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{2})>", "\\u00") %>%
stri_replace_all_regex("<u\+([[:alnum:]]{3})>", "\\u0") %>%
stri_unescape_unicode() %>%
stri_enc_toutf8()
}
library(tm)
library(textclean)
text.corpus <- VCorpus(VectorSource(text)) #Transforming into corpus
text.corpus <- tm_map(text.corpus, content_transformer(unicode_replacement))
text.corpus <- tm_map(text.corpus, content_transformer(function(x) replace_emoji(x, emoji_dt = lexicon::hash_emojis)))
inspect(text.corpus[[1]])
<<PlainTextDocument>>
Metadata: 7
Content: chars: 92
text goes here bla bla <f0><9f><a4><a6><f0><9f><8f><bd><e2><80><8d> female sign <ef><b8><8f>
现在使用您的示例,您将获得上述结果。检查表情符号 tables,您的 unicode 示例没有出现在 table 中,除了女性符号。但那是另一个问题。如果我使用 "text goes here bla bla ",结果如预期的那样。