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

时间:2018-03-05 16:33:56

标签: r regex stemming punctuation hyphenation

是否有任何有效的方法可以删除文本中的标点符号,但保留带有连字符的表达式,例如“容易发生事故”?

我使用以下功能来清理文本

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,但没有发现它适用于我的情况。必须有一些我还没想到的正则表达式。如果有人能在这方面给我启发,我们将非常感激。

2 个答案:

答案 0 :(得分:1)

:punct:字符集包括短划线,您将删除它们。您可以创建一个省略破折号的备用角色类。您需要特别注意方括号位置并转义双引号和反斜杠:

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

?regex(帮助页面)建议不要使用范围。我调查了是否可能使用我的本地ASCII标点符号进行任何简化,但很快就显而易见,这不是出于其他原因的方法。有5个单独的范围,&#34;]&#34;在其中一个中间,除了&#34;]&#34;之外还有7个范围可以处理。这需要先来。

答案 1 :(得分:0)

加入我的两分钱,你可以(*SKIP)(*FAIL)使用perl = TRUE并删除所有非字字符:

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+

有效删除不在单词字符之间的任何非单词字符 您需要提供更多测试示例。