当我使用 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>."
正在研究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>."