在 R 文本清理中删除标点符号但保留带连字符的短语

Remove punctuation but keep hyphenated phrases in R text cleaning

有什么有效的方法可以删除文本中的标点符号但保留连字符的表达式,例如 "accident-prone"?

我使用了以下函数来清理我的文本

clean.text = function(x)
{
  # remove rt
  x = gsub("rt ", "", x)
  # remove at
  x = gsub("@\w+", "", x)
  x = gsub("[[:punct:]]", "", x)
  x = gsub("[[:digit:]]", "", x)
  # remove http
  x = gsub("http\w+", "", x)
  x = gsub("[ |\t]{2,}", "", x)
  x = gsub("^ ", "", x)
  x = gsub(" $", "", x)
  x = str_replace_all(x, "[^[:alnum:][:space:]'-]", " ")
  #return(x)
}

并将其应用于返回的带连字符的表达式

my_text <- "accident-prone"
new_text <- clean.text(text)
new_text
[1] "accidentprone"

而我想要的输出是

"accident-prone"

我参考了 this thread,但没有发现它适用于我的情况。一定有一些我没有弄清楚的正则表达式。如果有人能启发我,我将不胜感激。

:punct: 字符集包含破折号,您正在删除它们。您可以创建一个替代字符 class 来省略破折号。您确实需要特别注意 square-brackets 位置并转义双引号和反斜杠:

 (test <- gsub("[]!\"#$%&'()*+,./:;<=>?@[\^_`{|}~]", "", "my-test of #$%^&*") )
[1] "my-test of "

?regex(帮助页面)建议不要使用范围。我调查了是否可以使用我本地的标点符号 ASCII 序列进行任何简化,但很快就发现由于其他原因这不是可行的方法。有 5 个独立的范围,“]”在其中一个范围的中间,因此除了需要排在第一位的“]”之外,还有 7 个范围需要处理。

投入我的两分钱,您可以将 (*SKIP)(*FAIL)perl = TRUE 一起使用并删除任何 non-word 个字符:

data <- c("my-test of #$%^&*", "accident-prone")
(gsub("(?<![^\w])[- ](?=\w)(*SKIP)(*FAIL)|\W+", "", data, perl = TRUE))

导致

[1] "my-test of"     "accident-prone"

参见 a demo on regex101.com


这里的想法是匹配你想要保留的东西

(?<![^\w])[- ](?=\w)
# a whitespace or a dash between two word characters
# or at the very beginning of the string

让这些失败并显示 (*SKIP)(*FAIL) 并将您要删除的内容放在交替的右侧,在本例中为

\W+

有效删除不在单词字符之间的任何 non-word 个字符。
不过,您需要提供更多示例进行测试。