删除 http 中的连字符但保留语料库中的连字符

Removing hyphens in http but preserving hyphenated words in corpus

我正在尝试修改一个词干提取函数,该函数能够 1) 删除 http 中的连字符(出现在语料库中),同时 2) 保留出现在有意义的连字符表达式中的连字符(例如,耗时的、成本过高等)。 事实上,几个月前我在另一个 上问过类似的问题,代码如下所示:

# load stringr to use str_replace_all
require(stringr)

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)
}

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

但得不到满意的答复,我就把注意力转移到其他的项目上,直到继续做这个。似乎代码块最后一行中的 "[^[:alnum:][:space:]'-]" 也是从语料库的非 http 部分中删除 - 的罪魁祸首。

我不知道如何实现我们想要的输出,如果有人可以提供他们的见解,我们将不胜感激。

真正的罪魁祸首是 [[:punct:]] 删除模式,因为它与字符串中的任何位置匹配 -

您可以使用

clean.text <- function(x)
{
  # remove rt
  x <- gsub("rt\s", "", x)
  # remove at
  x <- gsub("@\w+", "", x)
  x <- gsub("\b-\b(*SKIP)(*F)|[[:punct:]]", "", x, perl=TRUE)
  x <- gsub("[[:digit:]]+", "", x)
  # remove http
  x <- gsub("http\w+", "", x)
  x <- gsub("\h{2,}", "", x, perl=TRUE)
  x <- trimws(x)
  x <- gsub("[^[:alnum:][:space:]'-]", " ", x)
  return(x)
}

然后,

my_text <- "  accident-prone  http://www.some.com  rt "
new_text <- clean.text(my_text)
new_text 
## => [1] "accident-prone"

参见R demo

注:

  • x = gsub("^ ", "", x)x = gsub(" $", "", x)可以替换为trimws(x)
  • gsub("\b-\b(*SKIP)(*F)|[[:punct:]]", "", x, perl=TRUE) 删除单词字符之间的任何标点符号但连字符(您可以在 (*SKIP)(*F) 之前的部分进一步调整)
  • gsub("[^[:alnum:][:space:]'-]", " ", x)str_replace_all(x, "[^[:alnum:][:space:]'-]", " ").
  • 的基础 R 等价物
  • gsub("\h{2,}", "", x, perl=TRUE) 删除任意 2 个或更多水平空格。如果 "[ |\t]{2,}" 意味着匹配任何 2 个或更多空格,请在此处使用 \s 而不是 \h