Поиск всех терминов рядом с данной фразой - PullRequest
0 голосов
/ 27 января 2020

Есть ли способ найти все слова, связанные с данной фразой?

Например, скажем, я хочу найти все слова рядом со словом "болезнь" в строке. В строке есть слово «болезнь», и я хочу найти все окружающие ее термины, такие как «имеет болезнь», «нет болезни», «может быть болезнь» и т. Д. c .. .

Ответы [ 3 ]

0 голосов
/ 27 января 2020

Совершенно неясно, с каким шаблоном вы точно хотите соответствовать. Итак, вот несколько вариантов, используя str_extract из пакета stringr и позитивный взгляд:

dt <- c("I mean he's got to have some illness I suppose that",
        "whether you've had a serious illness or [unclear]",
        "No not what illnesses, terminal illness.",
        "Oh, Terminal illness, oh, sorry.",
        "Illness benefit on a joint life, last survivor plan?")

str_extract(dt, ".*(?=.(i|I)llness)") # any string prior to "illness"
[1] "I mean it's got to be some some" "whether you've had a serious"    "No not what illnesses, terminal"
[4] "Oh, Terminal"                    NA 

str_extract(dt, "(some|serious|terminal)(?=.(i|I)llness)") # specific words prior to "illness"
[1] "some"     "serious"  "terminal" NA         NA  

str_extract(dt, "\\w+\\b(?=.(i|I)llness)") # last word prior to "illness"
[1] "some"     "serious"  "what"     "Terminal" NA  
0 голосов
/ 27 января 2020

Использование функции kwic от Quanteda. Вы можете указать количество слов, окружающих искомый термин. В примере я использую 3, но это может быть что угодно. Преимущество заключается в том, что вы можете сохранить результат в data.frame, а затем провести еще несколько исследований.

На примере @Chris Ruehlemann:

library(quanteda)

dt <- c("I mean he's got to have some illness I suppose that",
        "whether you've had a serious illness or [unclear]",
        "No not what illnesses, terminal illness.",
        "Oh, Terminal illness, oh, sorry.",
        "Illness benefit on a joint life, last survivor plan?")


out <- kwic(dt, pattern = "illness", window = 3,  valuetype = "regex")

out
 [text1, 8]        to have some |  illness  | I suppose that    
 [text2, 6]       had a serious |  illness  | or[ unclear       
 [text3, 4]         No not what | illnesses | , terminal illness
 [text3, 7] illnesses, terminal |  illness  | .                 
 [text4, 4]        Oh, Terminal |  illness  | , oh,             
 [text5, 1]                     |  Illness  | benefit on a  


data.frame(out)
  docname from to                  pre   keyword               post pattern
1   text1    8  8         to have some   illness     I suppose that illness
2   text2    6  6        had a serious   illness       or [ unclear illness
3   text3    4  4          No not what illnesses , terminal illness illness
4   text3    7  7 illnesses , terminal   illness                  . illness
5   text4    4  4        Oh , Terminal   illness             , oh , illness
6   text5    1  1                        Illness       benefit on a illness
0 голосов
/ 27 января 2020

Если у вас просто есть вектор строк (изолированный или в виде столбца в data.frame), то, возможно:

s <- c("hello world illness quux bar not action illness",
       "not an illness", "no positive", "illness", "illness goodbye")
ret <- lapply(list(gregexpr("(\\S+)(?= illness)", s, perl = TRUE),
                   gregexpr("(?<=illness )(\\S+)", s, perl = TRUE)),
              regmatches, x = s)
Map(c, ret[[1]], ret[[2]])
# [[1]]
# [1] "world"  "action" "quux"  
# [[2]]
# [1] "an"
# [[3]]
# character(0)
# [[4]]
# character(0)
# [[5]]
# [1] "goodbye"

Каждый gregexpr находит слово (ну, непрерывный непробельный пробел) ) сопровождается литералом " illness" или предшествует литералу "illness ". Поскольку он возвращает list с достаточным количеством информации для извлечения подстрок из оригинала, мы используем regmatches(x=s, ...) для извлечения компонентов.

(Команда Map имеет дело с тем фактом, что результат lapply это список длиной 2, по одному для каждого регулярного выражения. Он просто объединяет подстроки из первого регулярного выражения с подстроками из второго регулярного выражения, "архивируя" совпадения для каждой строки в векторе. Если вы посмотрите на ret[[1]] и / или ret в целом, польза от этого может иметь больше смысла.)

Если вас не волнует , в какой строке в векторе / столбце найдены окружающие слова, тогда вы можете просто удалить это:

unlist(ret)
# [1] "world"   "action"  "an"      "quux"    "goodbye"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...