Дополнительные пробелы возникают, когда я использую replace_names для удаления имен с помощью R, textclean, stringr? - PullRequest
1 голос
/ 25 октября 2019

Я изучаю stringr и textclean, R. Я хочу удалить имена в куче писем. Я нахожу что-то, что действительно смущает меня:

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

Я хочу добавить пробел перед <и найти <, чтобы разделить имена. Но результат: </p>

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

Вы можете видеть, что означает, что пробелы добавлены успешно. Но после replace_names в </b> и </div> снова добавляется больше пробелов. Почему это так и как я могу это исправить?

1 Ответ

2 голосов
/ 25 октября 2019

Похоже, 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>."
...