Rvest/Stringr: 删除不可见符号拆分词?
Rvest/Stringr: Remove invisible symbols splitting words?
我正在检测带有 stringr
和 regex
的单词,发现我遗漏了几个项目,因为当有换行符时单词会被拆分。
令人惊讶的是,当我打印单元格的内容或在 RStudio 的数据查看器中查看时,打断单词的符号是不可见的。我只能看到在复制粘贴内容时单词被拆分了。数据框的单元格进入控制台。单词之间有一个小点分隔,例如Schallenberg 表示为 Schallen[dot]berg(一个小点,垂直在直线中间);
我假设拆分单词的符号的不可见性与文本的来源有关。它们是通过 rvest
检索到的。然而,更惊人的是,当我在网站上查看包含该符号的单词时,它们并没有被拆分。
我的问题:如何删除这些不可见的符号?它们不会被删除 stringr::str_squish.
当我已经从网站上提取文本时,我是否必须考虑它们?非常感谢!
library(rvest, quietly = T, warn.conflicts = F)
library(tidyverse, quietly = T, warn.conflicts = F)
web_link <- "https://www.parlament.gv.at//PAKT/VHG/XXVII/NRSITZ/NRSITZ_00006/fnameorig_797359.html"
df_txt <- web_link %>%
read_html(., encoding = "latin1") %>%
html_nodes("body > div.WordSection37 > p:nth-child(2) > b:nth-child(2) > span") %>%
html_text2() %>%
enframe(name = NULL,
value="text_raw") %>%
mutate(text_raw=text_raw %>% str_squish %>% str_trim(., "both"))
# There is a dot between Schallen - berg, but it's not visible
print(df_txt$text_raw)
#> [1] "Bundesminister für Europa, Integration und Äußeres Mag. Alexander Schallenberg, LL.M."
str_detect(df_txt$text_raw, "Schallenberg") #false
#> [1] FALSE
由 reprex package (v1.0.0)
于 2021-04-08 创建
您输入的这个字符是soft hyphen、\xAD
。它属于 Other, format
Unicode 控制字符类别。所以,你可以使用
gsub("\p{Cf}+", "", df_txt$text_raw, perl=TRUE)
或者,stringr
:
stringr::str_remove_all(df_txt$text_raw, "\p{Cf}+")
stringr::str_replace_all(df_txt$text_raw, "\p{Cf}+", "")
注意:这不会删除所有不可见的字符。您可能想要删除除常见换行符 \r
和 \n
之外的任何控制字符。在这种情况下,您宁愿使用
gsub("[^\P{C}\r\n]+", "", "a\n\r\b", perl=TRUE)
stringr::str_remove_all(df_txt$text_raw, "[^\P{C}\r\n]+")
stringr::str_replace_all(df_txt$text_raw, "[^\P{C}\r\n]+", "")
其中 [^\P{C}\r\n]+
是一个取反字符 class,它匹配除非控制字符、CR 和 LF 字符以外的任何字符(也就是说,它匹配任何控制字符,但 \r
和 \n
个字符)。
我正在检测带有 stringr
和 regex
的单词,发现我遗漏了几个项目,因为当有换行符时单词会被拆分。
令人惊讶的是,当我打印单元格的内容或在 RStudio 的数据查看器中查看时,打断单词的符号是不可见的。我只能看到在复制粘贴内容时单词被拆分了。数据框的单元格进入控制台。单词之间有一个小点分隔,例如Schallenberg 表示为 Schallen[dot]berg(一个小点,垂直在直线中间);
我假设拆分单词的符号的不可见性与文本的来源有关。它们是通过 rvest
检索到的。然而,更惊人的是,当我在网站上查看包含该符号的单词时,它们并没有被拆分。
我的问题:如何删除这些不可见的符号?它们不会被删除 stringr::str_squish.
当我已经从网站上提取文本时,我是否必须考虑它们?非常感谢!
library(rvest, quietly = T, warn.conflicts = F)
library(tidyverse, quietly = T, warn.conflicts = F)
web_link <- "https://www.parlament.gv.at//PAKT/VHG/XXVII/NRSITZ/NRSITZ_00006/fnameorig_797359.html"
df_txt <- web_link %>%
read_html(., encoding = "latin1") %>%
html_nodes("body > div.WordSection37 > p:nth-child(2) > b:nth-child(2) > span") %>%
html_text2() %>%
enframe(name = NULL,
value="text_raw") %>%
mutate(text_raw=text_raw %>% str_squish %>% str_trim(., "both"))
# There is a dot between Schallen - berg, but it's not visible
print(df_txt$text_raw)
#> [1] "Bundesminister für Europa, Integration und Äußeres Mag. Alexander Schallenberg, LL.M."
str_detect(df_txt$text_raw, "Schallenberg") #false
#> [1] FALSE
由 reprex package (v1.0.0)
于 2021-04-08 创建您输入的这个字符是soft hyphen、\xAD
。它属于 Other, format
Unicode 控制字符类别。所以,你可以使用
gsub("\p{Cf}+", "", df_txt$text_raw, perl=TRUE)
或者,stringr
:
stringr::str_remove_all(df_txt$text_raw, "\p{Cf}+")
stringr::str_replace_all(df_txt$text_raw, "\p{Cf}+", "")
注意:这不会删除所有不可见的字符。您可能想要删除除常见换行符 \r
和 \n
之外的任何控制字符。在这种情况下,您宁愿使用
gsub("[^\P{C}\r\n]+", "", "a\n\r\b", perl=TRUE)
stringr::str_remove_all(df_txt$text_raw, "[^\P{C}\r\n]+")
stringr::str_replace_all(df_txt$text_raw, "[^\P{C}\r\n]+", "")
其中 [^\P{C}\r\n]+
是一个取反字符 class,它匹配除非控制字符、CR 和 LF 字符以外的任何字符(也就是说,它匹配任何控制字符,但 \r
和 \n
个字符)。