首页 > 解决方案 > 当我使用 replace_names 删除使用 R、textclean、stringr 的名称时出现额外空格?

问题描述

我正在研究 R 中的 stringr 和 textclean。我想删除一堆邮件中的名称。我发现了一些让我非常困惑的东西:

a <- 'a<b>Jone Smith<br></b>afef</div>'

如果我直接这样做:

> replace_names(a,replacement = '')
[1] "a<b>Jone Smith<br>< / b>afef< / div>"

您可以看到无法删除名称。我猜这是因为><紧挨着名称,因此无法识别名称。同时,</b>和中出现了一些奇怪的空格</div>

所以这是我的处理方式:

a <- 'a<b>Jone Smith<br></b>afef</div>'
a <- str_replace_all(string = a,pattern = '>',replacement = '> ')
a <- str_replace_all(string = a,pattern = '<',replacement = ' <')
a
replace_names(a,replacement = '')

我想在 < 和 befind < 之前添加一个空格,以便将名称分开。但结果是:

> a
[1] "a <b> Jone Smith <br>  </b> afef </div> "
> replace_names(a,replacement = '')
[1] "a <b>   <br> < / b> afef < / div>"

可以看到a表示空格添加成功。</b>但是在replace_names 之后,又一次又一次地添加了更多的空格</div>。为什么会这样,我该如何解决?

标签: rregexreplacespace

解决方案


看起来像是textclean::replace_names在调用textclean::replace_tokens,而后者又调用textclean:::replace_string_elements_generic。最后一个函数用 标记字符串textshape::split_token,替换名称向量中的元素,然后将paste所有内容重新组合在一起并删除多余的空格。某些标点符号(包括/)被视为标记,因此当将字符串粘贴在一起时,paste(x, collapse = " ")它们会被空格包围。有一个gsub("(\\s+)([.!?,;:])", "\\2", out, perl = TRUE)从标点字符中删除空格的最终调用,但/不受影响。

您可以尝试在 GitHub 上提交问题,或发送带有修复程序的拉取请求,但我怀疑会发生任何事情,因为/在普通语言中经常被空格包围(请参阅此SE 答案以供参考)。虽然,开发人员可能会对处理 HTML 标签的特殊情况持开放态度。

我认为根据具体情况处理它会更有意义。尝试删除标签或添加空格,删除名称,然后再次删除空格:

library(stringr)
library(textclean)

## Remove tags.
a %>% replace_html %>% replace_names

# [1] "a   afef."


## Add whitespace, remove names, remove whitespace.
a %>% 
    str_replace_all("([<>])", " \\1 ") %>% 
    replace_names %>% 
    str_replace_all(" ?([<>/]) ?", "\\1")

# [1] "a<b> <br></b>afef</div>."

推荐阅读