首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要一个有效的方式在R转换彩色的utf-8表情字符到他们的默认皮肤

我需要一个有效的方式在R转换彩色的utf-8表情字符到他们的默认皮肤
EN

Stack Overflow用户
提问于 2020-01-16 07:31:15
回答 1查看 208关注 0票数 4

有没有什么有效的方法来去除矢量中的彩色表情符号,并使它们成为标准的形式?例如,请看两个输出,我可能没有使用合适的术语。目前我是这样做的:

代码语言:javascript
运行
复制
library(rjson)
library(stringi)
library(stringr)

# this function gets name from emojis one at a time
emoji_json_file <- "https://raw.githubusercontent.com/ToadHanks/emojisLib_json/master/emojis.json"
json_data <- rjson::fromJSON(paste(readLines(emoji_json_file), collapse = "")) #read line by line make 

# gets the name i.e. get_name_from_emoji("?") output should be "yum"

get_name_from_emoji <- function(emoji_unicode, emoji_data = json_data) {

  emoji_evaluated <- stringi::stri_unescape_unicode(emoji_unicode) 

  vector_of_emoji_names_and_characters <- unlist(
    lapply(json_data, function(x){
      x$char
    })
  )

  name_of_emoji <- attr(
    which(vector_of_emoji_names_and_characters == emoji_evaluated)[1],
    "names"
  )

  return(name_of_emoji)
}

# Fill an empty vector with names
emoji_pouch_copy <- c("?","??","??","??","?","?") #we can't render U+1F3FB (light-skin graft), U+1F3FF (dark-skin graft) here that's why "?"
emoji_keywords_pouch <- c() 
for(i in 1: length(emoji_pouch_copy)){
  emoji_keywords_pouch <- c(emoji_keywords_pouch, get_name_from_emoji(emoji_pouch_copy[i]))
}

emoji_keywords_pouch #output: "shushing","point_down_fairly_dark","point_right_dark","fu_light","dark_skin_tone","light_skin_tone" 

#Function to remove the skin tones
remove_all_skins <- function(string, pattern) {
  str_replace_all(string, pattern, "000")
}

#remove these and their nativ renders at a positions
skin_tones <- c("medium_skin_tone", "fairly_dark_skin_tone", "dark_skin_tone", "fairly_light_skin_tone", "light_skin_tone", "_light","_dark","_medium","_fairly") 

emoji_keywords_pouch <- remove_all_skins(emoji_keywords_pouch, skin_tones[1])
emoji_keywords_pouch <- remove_all_skins(emoji_keywords_pouch, skin_tones[2])
emoji_keywords_pouch <- remove_all_skins(emoji_keywords_pouch, skin_tones[3])
emoji_keywords_pouch <- remove_all_skins(emoji_keywords_pouch, skin_tones[4])
emoji_keywords_pouch <- remove_all_skins(emoji_keywords_pouch, skin_tones[5])

emoji_keywords_pouch <- emoji_keywords_pouch[emoji_keywords_pouch != "000"] #free the memory

#It has to be this order, otherwise good strings will go bad in the variable containing keywords
emoji_keywords_pouch <- stringr::str_remove_all(emoji_keywords_pouch, skin_tones[6])
emoji_keywords_pouch <- stringr::str_remove_all(emoji_keywords_pouch, skin_tones[7])
emoji_keywords_pouch <- stringr::str_remove_all(emoji_keywords_pouch, skin_tones[8])
emoji_keywords_pouch <- stringr::str_remove_all(emoji_keywords_pouch, skin_tones[9])

#Reverse the function get_name... to get_emoji and rebuild the emoji_pouch
#i.e. get_emoji_from_name("yum") output should be "?"

get_emoji_from_name <- function(emoji_name, emoji_data = json_data) {

  vector_of_emoji_names_and_characters <- unlist(
    lapply(json_data, function(x){
      x$char
    })
  )

  emoji_character <- unname(
    vector_of_emoji_names_and_characters[
      names(vector_of_emoji_names_and_characters) == emoji_name
      ]
  )

  return(emoji_character)
}

#reset the original emoji_...copy to include standard tones
emoji_pouch_copy <- c()

for(i in 1: length(emoji_keywords_pouch)){
  # Sys.sleep(1)
  emoji_pouch_copy <- c(emoji_pouch_copy, get_emoji_from_name(emoji_keywords_pouch[i]))
}

#All of the skin tones are removed, because there are no standad skin tones
emoji_pouch_copy #output: "?""?" "?" "?"

#Finished

简而言之,我将从表情符号到它们的名称。然后通过去除皮肤状况来清除他们的名字,然后恢复到他们的表情符号形式。我有接近1000个表情符号,for循环导致了大约5秒的延迟。有没有什么包可以比我更好地完成这项工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-17 00:18:52

我不太确定我明白你的问题了。但是你可以去掉不同的颜色,就像这样:

从数据开始

代码语言:javascript
运行
复制
library(rjson)

# this function gets name from emojis one at a time
emoji_json_file <- "https://raw.githubusercontent.com/ToadHanks/emojisLib_json/master/emojis.json"
json_data <- rjson::fromJSON(paste(readLines(emoji_json_file), collapse = "")) #read line by line make 

只提取表情符号:

代码语言:javascript
运行
复制
emojis <- sapply(json_data, function(x) x$char)

现在,这些颜色的方式是通过将twoUnicode字符粘合在一起。例如:

代码语言:javascript
运行
复制
emojis[114]
#> raised_hands_light 
#> "<U+0001F64C><U+0001F3FB>"

我们可以用strsplit(emojis, "")将它们分开。如果没有着色,这将导致矢量长度为1的列表,如果表情符号被着色或以其他方式改变(例如,男性/女性),则长度为2。我们只保留列表中每个向量的第一个元素:

代码语言:javascript
运行
复制
emojis_clean <- sapply(strsplit(emojis, ""), "[[", 1)

现在表情符号114看起来是这样的:

代码语言:javascript
运行
复制
emojis_clean[114]
#> raised_hands_light 
#>     "<U+0001F64C>"

extra:标志的问题

上面的方法是快速但愚蠢的。它无法识别组合后的表情符号何时被正确组合。例如,标志由两个放在一起的Unicode字符组成。可能还有其他的例子。我们可以通过在表情向量的names中查找一些关键字来将这些替换为原始向量:

代码语言:javascript
运行
复制
# Look for flags
flags <- grep("flag", names(emojis))

# replace flags with original values
emojis_clean[flags] <- emojis[flags]

这种方法也可以用于其他类型的表情符号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59761031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档