首页 > 解决方案 > 提取找到的单词及其前后的 20 个单词

问题描述

我正在使用 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() 它需要从特定单词开始?

标签: rtext-mining

解决方案


这种任务更适合文本挖掘包。例如 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

推荐阅读