Как извлечь из текста все экземпляры вектора строк на основе условий - PullRequest
1 голос
/ 30 марта 2019

Я относительно новичок в R и пытаюсь извлечь некоторые строки из текста (который является столбцом в информационном кадре) и сохранить их вместе с их именами (который является еще одним столбцом моего информационного кадра) на основе следующих условий:

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

textdf <- data.frame(names = letters[1:4], text = c("I'm trying to extract flowers from text", 
                                                "there are certain conditions on how to extract", 
                                                "this red rose is also nice-smelling", 
                                                "scarlet rose is also fine"))

extractdf <- data.frame(extractions = c("extract", "certain", "certain conditions", 
                                        "nice-smelling rose", "red rose"), 
                        synonyms = c(NA, NA, NA, NA, "scarlet rose"))

Я хочу

  1. посмотрите в столбце «извлечения» и извлеките все экземпляры. которые появляются в «текстовом» столбце моего DF.

  2. если для строки нет совпадений, скажем, если для "red" нет совпадений роза ", я хочу найти синоним, который в случае" алый " роза».

  3. для фраз с тем же словом «ПЕРВЫЙ», которые я хочу извлечь самое длинное подстрока ... например, если у меня есть и "определенные" и «определенные условия» Я хочу сохранить «определенные условия».
  4. экстракт "пахнущей розы" тоже?
  5. наконец, я хочу сохранить все извлечения в отдельном столбце в df, или получение именованного списка тоже нормально.

Так что мне нужно это

#result
textdf <- data.frame(names = letters[1:4], text = c("I'm trying to extract flowers from text", 
                                                "there are certain conditions on how to extract", 
                                                "this red rose is also nice-smelling", 
                                                "scarlet rose is also fine"), 
                     ex = c("extract", "certain conditions, extract", "nice-smelling rose, red rose", "scarlet rose"))

Я пробовал:

##for the first item
library(rebus)
library(stringi)
sapply(textdf$text, function(x) stri_extract_all_regex(x, or1(extractdf$extractions)))

это находит "определенные", но не "определенные условия"

##for the second and fourth item
library(stringdist)
Match_Idx = amatch(textdf$text, extractdf$extractions, method = 'lcs', maxDist = Inf)
Matches = data.frame(textdf$text, extractdf$extractions[Match_Idx])

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

Понятия не имею, что делать с третьим ... Должен ли я токенизировать и текст, и извлечения, найти уникальные первые слова и затем извлечь самое длинное совпадение ???

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

1 Ответ

0 голосов
/ 30 марта 2019

Вы можете работать с регулярными выражениями, которые вы помещаете в вектор,

rex <- c("(extract)", "((?>(?>red)|(?>scarlet))\\srose)", 
         "(\\bcertain\\sconditions\\b)", 
         "((?>rose).*(?>nice-smelling)|(?>nice-smelling).*(?>rose))")

создать соответствующую функцию

fun <- function(x, y) regmatches(x, regexpr(y, x, perl=TRUE))

и примените его с outer.

M <- outer(textdf$text, rex, Vectorize(fun))

Теперь нам нужно немного почистить матрицу, которая немного зависит от ваших данных, например,

M[grep("((?>rose)*.(?>nice-smelling)|(?>nice-smelling).*s(?>rose))", 
       M, perl=TRUE)] <- "nice-smelling rose"

Наконец сверните полученную матрицу и добавьте новый вектор в ваш фрейм данных.

textdf$ex <- apply(M, 1, function(x) toString(unlist(x)))

Придает

textdf
#   names                                           text                           ex
# 1     a        I'm trying to extract flowers from text                      extract
# 2     b there are certain conditions on how to extract  extract, certain conditions
# 3     c            this red rose is also nice-smelling red rose, nice-smelling rose
# 4     d                      scarlet rose is also fine                 scarlet rose
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...