提取找到的单词和之前和之后的20个单词

时间:2018-12-29 19:44:21

标签: r text-mining

我正在使用纵梁扫描很长的文本。如果找到这个词。我不仅要提取单词,还要提取上下文,让我们在检测到单词之前和之后说出20个单词。

所以,如果我有“你好,你好吗?”我寻找“那里”,我想在那儿提取+ -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 :(得分:0)

要在开始时使用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}在“坐”之后最多匹配6个单词。

答案 1 :(得分:0)

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