Замена эмодзи в R с помощью функции replace_emoji() не работает из-за другой кодировки — UTF8/Unicode?

Я пытаюсь очистить свои текстовые данные и заменить смайлики словами, чтобы позже выполнить анализ настроений.

Поэтому я использую функцию replace_emoji из пакета textclean. Это должно заменить все смайлики соответствующими словами.

Набор данных, с которым я работаю, представляет собой текстовый корпус, поэтому я использовал функцию VCorpus из пакета tm в своем примере кода ниже:

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» отличается от той, что у меня есть в моих данных. Таким образом, функция не заменяет эмодзи на слова. Я также пытался преобразовать данные «hash_emojis» с помощью функции iconv, но, к сожалению, мне не удалось изменить кодировку.

Я хотел бы заменить значения Unicode, показанные в моем наборе данных, словами.


person lole_emily    schedule 07.06.2020    source источник
comment
Проблемы с Encoding / хранением смайликов в объектах :-(. Ненавижу эти проблемы, так как они могут зависеть от ОС. Если я тестирую текст, он идет сюда, бла-бла ????????, код работает на моей машине. Также работает с текстом, идет сюда бла-бла \U0001f600\ U0001f602. Но текст идет здесь bla bla ‹U+0001F600›‹U+0001f602› не работает. Первые 2 — UTF8, но последний будет показывать кодировку неизвестную, хотя это представление смайликов в Юникоде. Тестирование с помощью ‹ F0›‹9F›‹98›‹81› также работает, что говорит мне о том, что таблица emoji находится в формате UTF8 и не обрабатывает представление ваших данных в юникоде.   -  person phiver    schedule 07.06.2020
comment
привет @phiver. Да, точно! Я также пробовал его с вариациями, и все они работали, но, как вы упомянули, по какой-то причине он не принимает представление смайликов в юникоде (к сожалению, это представление в моем наборе данных). Таким образом, я также подумал о преобразовании кодировки, которая хранится в наборе данных lexicon/hash_emojis, в юникод, чтобы он мог распознавать представление в моих данных. Однако и этого я сделать не смог.   -  person lole_emily    schedule 07.06.2020


Ответы (1)


Я нашел ответ на ваш вопрос. Я отмечу это как дубликат позже сегодня, когда вы прочитаете мой ответ.

Используя мой пример:

library(stringi)
library(magrittr)

"text goes here bla bla <u+0001F600><u+0001f602>"  %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{4})>", "\\\\u$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{5})>", "\\\\U000$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{6})>", "\\\\U00$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{7})>", "\\\\U0$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{8})>", "\\\\U$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{1})>", "\\\\u000$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{2})>", "\\\\u00$1") %>% 
  stri_replace_all_regex("<u\\+([[:alnum:]]{3})>", "\\\\u0$1") %>% 
  stri_unescape_unicode() %>% 
  stri_enc_toutf8() %>% 
  textclean::replace_emoji()

[1] "text goes here bla bla grinning face face with tears of joy "

Теперь будьте осторожны с представлением юникода. В примере ответа буква «U» указана в верхнем регистре, я изменил ее на строчную «u», чтобы отразить ваш пример.

Чтобы все совместить:

# create a function to use within tm_map
unicode_replacement <- function(text) {
  text %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{4})>", "\\\\u$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{5})>", "\\\\U000$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{6})>", "\\\\U00$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{7})>", "\\\\U0$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{8})>", "\\\\U$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{1})>", "\\\\u000$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{2})>", "\\\\u00$1") %>% 
    stri_replace_all_regex("<u\\+([[:alnum:]]{3})>", "\\\\u0$1") %>% 
    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>

Теперь, используя ваш пример, вы получите вышеуказанный результат. При проверке таблиц смайликов ваши примеры юникода не отображаются в таблице, кроме женского знака. Но это другой вопрос. Если я использую «текст идет сюда бла-бла», результат будет таким, как и ожидалось.

person phiver    schedule 08.06.2020
comment
Привет @phiver - ты действительно помог и спас положение - еще раз! :-) Большое спасибо! Это сработало отлично. - person lole_emily; 08.06.2020