Как найти разные слова в двух строках по предложениям? - PullRequest
1 голос
/ 01 апреля 2020

Я сравниваю два похожих текста. x1 - это текст модели, а x2 - текст с ошибками (например, орфография, новые символы и т. Д. c.). Я пытаюсь удалить слова, найденные в обоих текстах. Поскольку мой текст не на английском языке sh, я не могу использовать словарь.

То, что я пробовал, состоит в том, чтобы пройти по каждому символу x1 и, если это тот же символ в x2, затем удалить из x2 и перейти к следующему символу x1.

Код, над которым я работал:

x1 <- "This is a test. Weather is fine. What do I do? I am clueless this coding. Let’s do this as soon as possible." 
x2 <- "This text is a test. This weather is fine. What id I do? I am clueless thius coding. Ley’s do ythis as soon as possiblke."

library(tidyverse)
x1 <- str_split(x1, "(?<=\\.)\\s")
x1 <- lapply(x1,tolower)
x2 <- str_split(x2, "(?<=\\.)\\s")
x2 <- lapply(x2,tolower)

delete_a_from_b <- function(a,b) {

  a_as_list <- str_remove_all(a,"word") %>% 
    str_split(boundary("character")) %>% unlist

  b_n <- nchar(b)

  b_as_list <- str_remove_all(b,"word") %>% 
    str_split(boundary("character")) %>% unlist

  previous_j <-1

  for (i in 1:length(a_as_list)) {
    if(previous_j > length(b_as_list)) 
      break
    for (j in previous_j:length(b_as_list)){
      if(a_as_list[[i]]==b_as_list[[j]]){
        b_as_list[[j]] <- ""
        previous_j <- j+1
        break
      }
    }
  }

  print(paste0(b_as_list,collapse = ""))
  paste0(b_as_list,collapse = "")
}

x3 <- delete_a_from_b(x1,x2)
x3 <- strsplit(x3,"\\s")

Вывод:

x3
[[1]]
 [1] "text"       "this"       "i"          "i"          "d?am"       "clueless"   "thius"      "coing.\"," 
 [9] "\"ley’s"    "dythsssoon" "as"         "possibk"   

В результате я хочу получить: 'text' 'this' 'id' 'thius' 'ley’s' 'ythis' 'possiblke'

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Я так понимаю, вы хотите сравнить две строки x1 и x2 по предложению - не совсем понятно в вопросе. Предыдущие решения не принимают это во внимание. Попробуйте это:

Первое разбиение, обе строки на предложения:

x1_sentences <- unlist(strsplit(tolower(x1), split = "[.?!] "))
x2_sentences <- unlist(strsplit(tolower(x2), split = "[.?!] "))
length(x1_sentences)  == length(x2_sentences) # Make sure same number of resulting sentences

Затем для каждого предложения снова разделите два вектора и покажите разницу в словах:

for (i in 1:length(x1_sentences)) {
  x1_vector <- unlist(strsplit(x1_sentences[i], split = "[ ]"))
  x2_vector <- unlist(strsplit(x2_sentences[i], split = "[ ]"))
  print(setdiff(x2_vector, x1_vector)) # The order here is important!
}

Дает (который вы легко можете превратить в новый вектор):

[1] "text"
[1] "this"
[1] "id"
[1] "thius"
[1] "ley’s"      "ythis"      "possiblke."
1 голос
/ 01 апреля 2020

думаю, что я сделал это, это то, что вам нужно?


x1 <- "This is a test. Weather is fine. What do I do? I am clueless this coding. Let’s do this as soon as possible." 
x2 <- "This text is a test. This weather is fine. What id I do? I am clueless thius coding. Ley’s do ythis as soon as possiblke."

x1_w<-strsplit(paste(x1, collapse = " "), ' ')[[1]]
x2_w<-strsplit(paste(x2, collapse = " "), ' ')[[1]]
x1<- lapply(x1,tolower)
x2<- lapply(x2,tolower)

`%notin%` <- Negate(`%in%`)

x2_w[which(x2_w %notin% x1_w)]
# same as:
setdiff(x2_w,x1_w)

# out:

#> x2_w[which(x2_w %notin% x1_w)]
#[1] "text"       "id"         "thius"      "ley’s"      "ythis"      "possiblke."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...