Обработка текста в R поиск слов - PullRequest
1 голос
/ 02 апреля 2020

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

word_check <- c("add get onion" ,
                 "add to onion",
                "add oil to onion",
                "add oils to onion" ,
                "add salt to onion" ,
                "add get onion" ,
                "add get onion", 
                "add get onion")

df <- as.data.frame(c("I can add get onion" ,
                      "we can add to onion",
                      "I love to add oil to onion",
                      "I may not add oils to onion" ,
                      "add salt to onion" ,
                      "add get onion" ,
                      "abc",
                      "def" ,
                      "ghi",
                      "jkl",
                      "add get onion", 
                      "add get onion","add oil to the vegetable", "add onion to the vegetable" ))
names(df)[1] <- "text"


pattern_word_check <- paste(word_check, collapse = "|")


df$New <- ifelse(str_detect(df$text, regex(pattern_word_check)),"Found","Not Found")```

Regards, R

Ответы [ 3 ]

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

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

В любом случае, я думаю, что вы ищете grepl. У вас есть много способов решить вашу проблему.

data.table

data.table Решение, использующее условную замену, будет:

library(data.table)
setDT(df)
df[,'new' := "Not Found"]
df[grepl(pattern_word_check, text), new := "Found"]

Если вы хотите только считать слова с "луком" ИЛИ "добавить"

df[,'new' := "Not Found"]
df[grepl("(onion|add)", text), new := "Found"]

dplyr

A dplyr решение будет:

library(dplyr)
df %>% mutate(new = if_else(grepl(pattern_word_check, text), "Found", "Not Found"))

Обратите внимание, что если использовать if_else из dplyr пакета, а не базы ifelse.

Если вы хотите рассматривать слова только с луком " " ИЛИ " добавить "

library(dplyr)
df %>% mutate(new = if_else(grepl("(onion|add)", text), "Found", "Not Found"))
0 голосов
/ 02 апреля 2020

Вот решение, использующее tidytext. Для вашего конкретного примера это может показаться чем-то вроде избыточного, но использование более высокоуровневых функций, таких как токенизатор, вместе с inner_join делает код более понятным и более простым для построения. (imo)

df <- as.data.frame(c("I can add get onion" ,
                      "we can add to onion",
                      "I love to add oil to onion",
                      "I may not add oils to onion" ,
                      "add salt to onion" ,
                      "add get onion" ,
                      "abc",
                      "def" ,
                      "ghi",
                      "jkl",
                      "add get onion", 
                      "add get onion","add oil to the vegetable", "add onion to the vegetable" ), stringsAsFactors = FALSE)
names(df)[1] <- "text"
library(dplyr)
library(tidytext)
df_words <- df %>% 
  unnest_tokens(output = word,
                input = text,
                 token = "words",
                drop = FALSE)
inner_join(
  df_words %>% filter(word == "add"),
  df_words %>% filter(word == "onion"),
  by = "text"
) %>% 
  select(text) %>% 
  distinct()
#>                          text
#> 1         I can add get onion
#> 2         we can add to onion
#> 3  I love to add oil to onion
#> 4 I may not add oils to onion
#> 5           add salt to onion
#> 6               add get onion
#> 7  add onion to the vegetable

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

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

Поскольку вы хотите проверить только "onion" и "add", которые могут встречаться в любом порядке, вы можете это сделать.

df$New <- ifelse(grepl('.*add.*onion.*|.*onion.*add.*',df$text), "found", "not found")
#Faster option without ifelse
#df$New <- c('Not found', 'found')[grepl('.*add.*onion.*|.*onion.*add.*', df$text) + 1]
df

#                          text       New
#1          I can add get onion     found
#2          we can add to onion     found
#3   I love to add oil to onion     found
#4  I may not add oils to onion     found
#5            add salt to onion     found
#6                add get onion     found
#7                          abc not found
#8                          def not found
#9                          ghi not found
#10                         jkl not found
#11               add get onion     found
#12               add get onion     found
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...