有没有什么有效的方法可以去除文本中的标点符号,但保留断字表达式,例如“容易发生事故”?
我使用以下功能来清除我的文本
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"
我引用了这个线程,但没有发现它对我的情况有效。一定有一些正则表达式的东西我还没有弄清楚。如果有人能在这方面启发我,我将不胜感激。
把我的两分钱放进去,你可以使用(*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"
查看regex101.com.演示
(?<![^\\w])[- ](?=\\w)
# a whitespace or a dash between two word characters
# or at the very beginning of the string
让这些失败与(*SKIP)(*FAIL)
并把你想要删除的东西放在右边的交替,在这种情况下
\W+
有效地删除任何非单词字符,而不是单词字符之间的字符
不过,您需要提供更多的测试示例。
:punct:
字符集包括破折号,您将删除它们。您可以创建一个省略破折号的替代字符类。您确实需要特别注意方括号的位置,并避开双引号和反斜杠:
(test <- gsub("[]!\"#$%&'()*+,./:;<=>?@[\\^_`{|}~]", "", "my-test of #$%^&*") )
[1] "my-test of "
?regex
(帮助页)建议不要使用范围。我调查了是否可以使用我当地的ASCII标点符号序列进行简化,但很快就发现,由于其他原因,这不是一种可行的方法。有5个不同的范围,而“”是在其中的一个中间,所以除了需要“先”的“”之外,还有7个范围来处理。