提取找到的词及其前后20个词
Extract found word and 20 Words before and after it
我正在使用 stringr 扫描很长的文本。如果找到这个词。我不仅要提取单词,还要提取一些上下文,让我们说检测到单词前后的二十个单词。
所以如果我有 "Hello there, how are you?" 并寻找 "there",我想在那里提取 +-1 字:
"Hello there, how"
但是,我在组合 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() 它需要从特定单词开始?
要在开始时使用 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}
最多匹配 "sit".
之前的 6 个词
(\W+\w+){0,6}
最多匹配 "sit" 之后的 6 个词。
这种任务更适合文本挖掘包。例如 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
我正在使用 stringr 扫描很长的文本。如果找到这个词。我不仅要提取单词,还要提取一些上下文,让我们说检测到单词前后的二十个单词。
所以如果我有 "Hello there, how are you?" 并寻找 "there",我想在那里提取 +-1 字: "Hello there, how"
但是,我在组合 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() 它需要从特定单词开始?
要在开始时使用 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}
最多匹配 "sit".
之前的 6 个词
(\W+\w+){0,6}
最多匹配 "sit" 之后的 6 个词。
这种任务更适合文本挖掘包。例如 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