В предложении извлечь конкретное слово, включая пробел в R - PullRequest
0 голосов
/ 26 февраля 2019

Мне нужно получить определенное слово, включая пробел в R.

Например, у меня есть список ресторанов, подобный этому:

r_list <- c('mexicana', 'macdonald', 'KFC')

, и у меня есть список предложений, которыеобъясняет о тех ресторанах, как:

sentense <- c('I really like mexi cana', 'want to eat mac donaldso much!', 'I hateKF C')

В ультимативе я хочу использовать цикл for для поиска в каждом ресторане.

grep('mexicana', sentense)

Когда я grep mexicana, я не могу grepэто.

Итак, я думаю, что алгоритм trie, но пакет 'triebeard' не работает, когда я использую его с корейским.

Надеюсь, вы, ребята, помогите мне.Что я могу сделать ???

В пути есть только функция "gsub" ???

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Поскольку вы хотите извлекать с помощью регулярных выражений, вы можете использовать gregexpr и regmatches.

( nospaces <- gsub("\\s", "", sentense) )
# [1] "Ireallylikemexicana"       "wanttoeatmacdonaldsomuch!" "IhateKFC"                 

re <- gregexpr(paste(r_list, collapse = "|"), nospaces)
regmatches(nospaces, re)
# [[1]]
# [1] "mexicana"
# [[2]]
# [1] "macdonald"
# [[3]]
# [1] "KFC"

Таким образом, возвращаемое значение из gregexpr представляет собой список с атрибутами:

str(re)
# List of 3
#  $ : int 12
#   ..- attr(*, "match.length")= int 8
#   ..- attr(*, "index.type")= chr "chars"
#   ..- attr(*, "useBytes")= logi TRUE
#  $ : int 10
#   ..- attr(*, "match.length")= int 9
#   ..- attr(*, "index.type")= chr "chars"
#   ..- attr(*, "useBytes")= logi TRUE
#  $ : int 6
#   ..- attr(*, "match.length")= int 3
#   ..- attr(*, "index.type")= chr "chars"
#   ..- attr(*, "useBytes")= logi TRUE

В списке первый элемент [[1]] предназначен для первой строки "Ireallylikemexicana" и т. Д. В этом списке 12 означает, что было совпадение, начиная с 12-го символа, и его длина составляла 8 символов.Повторите для остальных.

Это будет сопоставлять и извлекать несколько совпадений в одной строке.

others <- c("quuxmexicanaoKFCmmmsdkfj", "quux")
str(re <- gregexpr(paste(r_list, collapse = "|"), others))
# List of 2
#  $ : int [1:2] 5 14
#   ..- attr(*, "match.length")= int [1:2] 8 3
#   ..- attr(*, "index.type")= chr "chars"
#   ..- attr(*, "useBytes")= logi TRUE
#  $ : int -1
#   ..- attr(*, "match.length")= int -1
#   ..- attr(*, "index.type")= chr "chars"
#   ..- attr(*, "useBytes")= logi TRUE
str(regmatches(others, re))
# List of 2
#  $ : chr [1:2] "mexicana" "KFC"
#  $ : chr(0) 

В этом случае второй элемент списка (для "quux") равен -1,то есть совпадение не найдено.Это приводит к пустому (character(0)) заполнителю во второй позиции списка.В этом случае вы можете получить все совпадения независимо от того, какая строка , используя unlist.

0 голосов
/ 26 февраля 2019

Вы можете попробовать это:

Моя идея состояла в том, чтобы убрать все пробелы из sentense, заглавных букв sentense и r_list (чтобы легче было сопоставлять), сопоставьте с помощью grep,

Пример данных:

r_list <- c('mexicana', 'macdonald', 'KFC')

sentense <- c('I really like mexi cana', 'want to eat mac donaldso much!', 'I hateKF C')

Решение:

require(tidyverse)

sentense %>% 
  tbl_df() %>%
  mutate(concatenate = toupper(gsub("[[:space:]]", "", value)), 
         eating = grep(
           pattern = paste(
             toupper(r_list),
             collapse = "|"), 
           x = concatenate), 
         eating = r_list[eating])

Выход:

# A tibble: 3 x 3
  value                          concatenate               eating   
  <chr>                          <chr>                     <chr>    
1 I really like mexi cana        IREALLYLIKEMEXICANA       mexicana 
2 want to eat mac donaldso much! WANTTOEATMACDONALDSOMUCH! macdonald
3 I hateKF C                     IHATEKFC                  KFC   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...