Как свернуть определенные строки с указанным шаблоном c из текста? - PullRequest
3 голосов
/ 08 апреля 2020

У меня есть несколько строк текста (пример ниже фактического текста - целая книга). Как вы можете видеть, каждая строка была разбита на точку или знак вопроса.

   [1]"I am a Mr."
   [2]"asking for help."
   [3]"Can you help?"
   [4]"Thank you ms."
   [5]"or mr."

Я хочу свернуть, когда строка заканчивается аббревиатурой, например, mr., Mrs. поэтому конечным результатом будет желаемый результат ниже.

    [1]"I am a Mr. asking for help."
    [2]"Can you help?"
    [3]"Thank you ms. or mr."

Я уже создал вектор (называемый abbr), содержащий все мои сокращения в следующем формате:

> abbr
[1] "Mr|Mrs|Ms|Dr|Ave|Blvd|Rd|Mt|Capt|Maj"

, но я могу не понять, как использовать его в функции вставки, чтобы свернуть. Я также пытался использовать gsub (не работал), чтобы заменить \ n следующую аббревиатуру на точку с таким пробелом:

lines<-gsub('(?<=abbr\\.\\n)(?=[A-Z])', ' ', lines, perl=FALSE)

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Один из способов сделать это - использовать strsplit со следующей логикой * Разделить на пустое пространство * Пробел перед пунктуацией * Пунктуация НЕ предшествует вектор сокращений

Я поместил строку в 1 символ вектор вот так:

lines2 <- paste(lines, collapse = ' ')
lines2
[1] "I am a Mr. asking for help. Can you help? Thank you ms. or mr."

Вот как сделать sh это с помощью регулярных выражений. Важно отметить, что ваша попытка использовать «abbr» в кавычках таким образом, чтобы не найти заданный вами вектор, вы должны включить его в paste. Я также добавил "mr" и "ms" к abbr. Я включаю несколько строк, которые создают идеи. Я использую оглядки, вы можете узнать больше здесь

# Split on punctuation
strsplit(lines2, "[[:punct:]]", perl = T)

# Split on punctuation, not preceded by abbr
strsplit(lines2, paste("(?<!",abbr,")[[:punct:]]"), perl = T)

# Split on space after punctuation, not preceded by abbr
strsplit(lines2, paste("(?<=(?<!", abbr,")[[:punct:]])[[:space:]]"), perl = T)

[[1]]
[1] "I am a Mr. asking for help." "Can you help?"              
[3] "Thank you ms. or mr." 
1 голос
/ 08 апреля 2020

Как насчет этого?

library(tidyverse)

lines <- c("I am a Mr.", "asking for help.", "Can you help?", "Thank you ms.", "or mr.")
abbr <- "Mr|Mrs|Ms|Dr|Ave|Blvd|Rd|Mt|Capt|Maj"

paste(lines, collapse = " ") %>%
  str_split(paste0("(?<=(?<!",abbr,"|", tolower(abbr),")\\.|\\?)\\s")) %>%
  unlist()
#> [1] "I am a Mr. asking for help." "Can you help?"              
#> [3] "Thank you ms. or mr."

Сначала я отменяю оригинальный сплит, чтобы получить одну большую строку, затем я разделяю текст на пробел, которому предшествует знак вопроса или точка, но только если периоду не предшествует сокращение.

0 голосов
/ 08 апреля 2020

Хак, но это работает:

texts <- c("I am a Mr.", "asking for help.", "Can you help?", "Thank you ms.", "or mr.")
abbr <- "Mr|Mrs|Ms|Dr|Ave|Blvd|Rd|Mt|Capt|Maj"
texts2 <- c()
to_skip <- c()
for (i in seq_along(texts)) {
  if (i %in% to_skip) next
  if (grepl(abbr, texts[i], ignore.case = TRUE)) {
    texts2[i] <- paste(texts[i], texts[i+1], collapse = " ")
    to_skip <- c(to_skip, i+1)
  } else {
    texts2[i] <- texts[i]
  }
}
texts2[!is.na(texts2)]
#> [1] "I am a Mr. asking for help." "Can you help?"              
#> [3] "Thank you ms. or mr."

Создано в 2020-04-08 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...