Извлечь найденное слово и 20 слов до и после него - PullRequest
0 голосов
/ 29 декабря 2018

Я использую stringr для сканирования очень длинного текста.Если слово найдено.Я хочу извлечь не только слово, но и некоторый контекст, скажем, двадцать слов до и после того, как слово было обнаружено.

Итак, если у меня есть «Привет, как дела?»и я ищу "там", я хочу извлечь там + -1 Слово: "Привет, как"

Однако у меня возникают проблемы при объединении str_locate и str_word, так как один выражает местоположение как номер символаа другой работает со словом число

Как мне это сделать?Я знаю, как найти слово, и я знаю, как извлечь слова.Но как мне извлечь слова из определенного слова?

library(tidyverse)
library(stringr)

text <- "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."

# Lets say I am looking for "sit"

str_locate_all(text,"sit") # I get the positions for "sit" ... but expressed in the number of letters


# assuming sit-position is expressed as  word-number and not character number
sit_position <- c(4,20,30,40)  # not the real positions of "sit" just to simulate


#the word plus minus two 
sit_position_d <- sit_position-2
sit_position_u <- sit_position+2

wordcontext <- rep(NA,NROW(sit_position))

for (i in c(1:NROW(sit_position))) {

  wordcontext[i] <- word(text, sit_position_d[i],sit_position_u[i])


}

Как мне изменить этот код, чтобы сказать word (), что он должен начинаться с определенного слова?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Этот тип задачи лучше подходит для текстовых пакетов.Например, у quanteda есть функция с именем kwic, которая делает то, что вы хотите.Если вы не используете remove_punct пунктуация будет считаться словом.И вы можете легко преобразовать результаты в хороший data.frame.

library(quanteda)
my_kwic <- kwic(text, "sit", window = 6, remove_punct = TRUE)

  [text1, 4]                      Lorem ipsum dolor | sit | amet consetetur sadipscing elitr sed diam
 [text1, 49] takimata sanctus est Lorem ipsum dolor | sit | amet Lorem ipsum dolor sit amet          
 [text1, 54]       dolor sit amet Lorem ipsum dolor | sit | amet consetetur sadipscing elitr sed diam
 [text1, 99] takimata sanctus est Lorem ipsum dolor | sit | amet    

my_df <- data.frame(my_kwic)

  docname from to                                    pre keyword                                      post
1   text1    4  4                      Lorem ipsum dolor     sit amet consetetur sadipscing elitr sed diam
2   text1   49 49 takimata sanctus est Lorem ipsum dolor     sit           amet Lorem ipsum dolor sit amet
3   text1   54 54       dolor sit amet Lorem ipsum dolor     sit amet consetetur sadipscing elitr sed diam
4   text1   99 99 takimata sanctus est Lorem ipsum dolor     sit                                      amet
0 голосов
/ 30 декабря 2018

Чтобы сделать это с stringr, как вы начали, вы можете использовать выражение, подобное приведенному ниже.Чтобы было легче проверить, я просто взял до 6 слов с каждой стороны, но это должно быть легко изменить на 20 слов.

str_extract(text, "(\\w+\\W+){0,6}sit(\\W+\\w+){0,6}")
[1] "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam"

Подробности

Выражение сосредоточено на слове, которое вы хотите найти, в данном случае "sit".
(\\w+\\W+){0,6} соответствуетдо 6 слов перед "сидеть".
(\\W+\\w+){0,6} соответствует до 6 слов после "сидеть".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...