Функцията Replace Emojis в 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. Но текстът идва тук бла бла ‹U+0001F600›‹U+0001f602› не работи. Първите 2 са UTF8, но последният ще показва неизвестно кодиране, въпреки че това е unicode представянето на емоджитата. Тестване с ‹ F0›‹9F›‹98›‹81› също работи, което ми казва, че таблицата с емотикони е във формат UTF8 и не обработва unicode представянето на вашите данни.   -  person phiver    schedule 07.06.2020
comment
хей @phiver. Да точно! Опитах го и с варианти, всички от които работеха - но както споменахте, по някаква причина не приема unicode представянето на емоджитата (за съжаление, това е представянето в моя набор от данни). Затова помислих и за преобразуване на кодирането, което се съхранява в набора от данни lexicon/hash_emojis, в unicode, така че да може да разпознае представянето в моите данни. Аз обаче не можах да направя и това.   -  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 "

Сега внимавайте с представянето на unicode. Примерният отговор има "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>

Сега, използвайки вашия пример, получавате горния резултат. Проверявайки таблиците с емотикони, вашите примери за Unicode не се появяват в таблицата, с изключение на женския знак. Но това е друг въпрос. Ако използвам „text goes here bla bla“ резултатът е очакваният.

person phiver    schedule 08.06.2020
comment
Здравей @phiver - ти наистина помогна и спаси положението - още веднъж! :-) Много благодаря! Работи идеално. - person lole_emily; 08.06.2020