如何在一组字符串中删除 r 中的这些特殊字符:’s,…

Posted

技术标签:

【中文标题】如何在一组字符串中删除 r 中的这些特殊字符:’s,…【英文标题】:How to remove these special characters in r in a set of string : ’s, … 【发布时间】:2022-01-14 09:09:19 【问题描述】:

我有这个包含特殊字符的字符串,我无法从主数据框中删除这些字符但是,当我通过 dft 准备一个单独的对象然后我使用以下代码时,我能够删除特殊字符字符。

dft <- "rt shibxwarrior hodl trust processsome great things horizon folks shib shib shiba shibainu shibar… rt askthedr just bought m usd worth shib think it’s robinhoodapp shibaarmy"

rmSpec <- "â|€|¦|â|€™|" # The "|" designates a logical OR in regular expressions.

s.rem <- gsub(rmSpec, "", dft) # gsub replace any matches in remSpec and replace them with "".
s.rem

但是当我在主数据框上使用相同的代码时,如下以不同的行(推文)的形式,相同的代码将不起作用并显示错误:UseMethod中的错误(“检查” , X) : 没有适用于“字符”类对象的“检查”方法

[1] rt shibxwarrior hodl 信任过程一些伟大的事情地平线人 shib shib shiba shibainu shibar... [2] rt askthedr 刚买了 m 美元,价值 shib 认为它是 robinhoodapp shibaarmy [3] rt bitshiba 发送 shib 关注转推推文 uufefufcd [4] rt shibinform 想要 shib 列出 robinhoodappuf 是 是 是 ubufef ubufef ubufef [5] rt shiblucky shib 赠品只需转发关注

请您帮忙,谢谢。

【问题讨论】:

你是如何在你的数据框上使用它的?比如你的代码行是什么?问题很可能来自那部分。我怀疑这可能是您的数据框中的选项 stringAsFactors 未设置为 FALSE 对你在这里所做的事情要非常小心。您的数据只是在某些时候被错误地编码。 it’s 就是 it's。首先尝试使用正确的编码获取您的数据。还要记住,有很多带有合法 â 的单词,您只需将其删除并创建一个虚假单词。 @MerijnvanTilborg :感谢您的回复,我认为问题出在我的代码中,我将推文转换为两个 utf-8 字符,我可以使用什么其他选项来摆脱它。当我从我的代码中删除 utf-8 字符时,所有字符都被删除了,但后来我在转换为文档术语矩阵时发现了问题......你能帮忙吗.. 你可以尝试修复它...我稍后会给出一个小例子 这很可能是 xy 问题。您正在寻找正则表达式解决方案,但最好修复编码。在读取数据时尝试设置 locale 和编码。我不确定,但一些 csv 读取函数包含 encoding 参数。为 R 会话设置本地也可能有所帮助。或者,您可以在 excel 中重新编码文件,然后在 R 中读取新文件 【参考方案1】:

仅提取我们可能使用的字母和数字,

library(stringr)
    
dft <- "rt shibxwarrior hodl trust processsome great things horizon folks shib shib shiba shibainu shibar… rt askthedr just bought m usd worth shib think it’s robinhoodapp shibaarmy"

str_replace_all(dft, "[^a-zA-Z0-9]", " ")
[1] "rt shibxwarrior hodl trust processsome great things horizon folks shib shib shiba shibainu shibar    rt askthedr just bought m usd worth shib think it   s robinhoodapp shibaarmy"

【讨论】:

这不是我需要的......谢谢【参考方案2】:

如前所述,首选方法是使用正确的编码读入您的数据,但有时您的数据只是损坏了。我的 FixEncoding 函数创建了一个名为 vector 的查找来解决这个问题(我过去在处理错误存储的旧 csv 文件时遇到的最多 3 个错误编码。您可以使用所有 unicode 字符并错误编码。这样您可以将错误翻译回来.

FixEncoding <- function() 
  # create the unicode ranges from https://www.i18nqa.com/debug/utf8-debug.html
  range <- c(sprintf("%x", seq(strtoi("0xa0"), strtoi("0xff"))))
  unicode <- vapply(range, FUN.VALUE = character(1), function(x)  parse(text = paste0("'\\u00", x, "'"))[[1]] )
  # add the ones that are missing (red ones in https://www.i18nqa.com/debug/utf8-debug.html)
  unicode <- c(c("\u0168", "\u0152", "\u017d", "\u0153", "\u017e", "\u0178", "\u2019", "\u20ac", "\u201a", "\u0192", "\u201e", "\u2026", "\u2020", "\u2021", "\u02c6", "\u2030", "\u0160", "\u2030"), unicode)
  once <- vapply(unicode, FUN.VALUE = character(1), function(x)  
    Encoding(x) <- "Windows-1252"
    iconv(x, to = "UTF-8")
  )
  fix_once <- unicode
  names(fix_once) <- once
  twice <- vapply(once, FUN.VALUE = character(1), function(x)  
    Encoding(x) <- "Windows-1252"
    iconv(x, to = "UTF-8")
  )
  fix_twice <- unicode
  names(fix_twice) <- twice
  triple <- vapply(twice, FUN.VALUE = character(1), function(x)  
    Encoding(x) <- "Windows-1252"
    iconv(x, to = "UTF-8")
  )
  fix_triple <- unicode
  names(fix_triple) <- triple
  fixes <- c(fix_triple, fix_twice, fix_once)
  return(fixes)


fixes <- FixEncoding()

str(fixes)

 Named chr [1:342] "U" "Œ" "Ž" "œ" "ž" "Ÿ" "’" "\200" "‚" "ƒ" "„" "…" "†" "‡" "\210" "‰" "Š" "‰" " " "¡" "¢" "£" "¤" "¥" "¦" "§" "¨" "©" "ª" "«" "¬" "­" "®" "¯" "°" "±" "²" "³" "´" ...
 - attr(*, "names")= chr [1:342] "Ãâ\200¦Ã‚¨" "Ãâ\200¦Ã¢â‚¬â„¢" "Ãâ\200¦Ã‚½" "Ãâ\200¦Ã¢â‚¬Å“" ...

dft <- "rt shibxwarrior hodl trust processsome great things horizon folks shib shib shiba shibainu shibar… rt askthedr just bought m usd worth shib think it’s robinhoodapp shibaarmy"

stri_replace_all_fixed(dft, names(fixes), fixes, vectorize_all = F)

[1] "rt shibxwarrior hodl trust processsome great things horizon folks shib shib shiba shibainu shibar… rt askthedr just bought m usd worth shib think it’s robinhoodapp shibaarmy"

发生情况的简单示例

lélèlölã 使用 unicode "\u006C\u00E9\u006C\u00E8\u006C\u00F6\u006C\u00E3"

messy <- "\u006C\u00E9\u006C\u00E8\u006C\u00F6\u006C\u00E3"

messy
# [1] "lélèlölã"

# this is just what happens if files get corrupt by saving in wrong encodings, we did that unicode character by unicode character in my fix function.
Encoding(messy) <- "Windows-1252"
messy <- iconv(messy, to = "UTF-8")

messy
# [1] "lélèlölã" # once badly encoded
# [1] "lélèlölã" # twice badly encoded
# [1] "lélèlölã" # three times!

# All three strings above would be fixed
stri_replace_all_fixed(messy, names(fixes), fixes, vectorize_all = F)
# [1] "lélèlölã"

# other simple replacements as suggested would give us `llll` or `lÃlÃlÃlÃ`?

【讨论】:

以上是关于如何在一组字符串中删除 r 中的这些特殊字符:’s,…的主要内容,如果未能解决你的问题,请参考以下文章

通过删除特殊字符改进 Tesseract OCR 结果

PHP regex-从字符串中删除特殊字符

从R中的字符串中删除所有特殊字符?

如何在 C# 中读取 é、â 等特殊字符

无法从 r 中的字符串中的数据中删除这些字符

在 Python 中删除字符串中的多余字符