当我使用 replace_names 使用 R、textclean、stringr 删除名称时,会出现额外的空格吗?

Extra spaces occurs when I use replace_names to remove names using 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>中出现了一些奇怪的space。

所以这是我的处理方式:

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 = '')

我想在 < 和 < 之前加一个 space 来分隔名字。但结果是:

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

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

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

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

我认为逐案处理更有意义。尝试删除标签或添加 space,删除名称,然后再次删除白色 space:

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>."