r - 提取找到的单词及其前后的 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() 它需要从特定单词开始?
解决方案
这种任务更适合文本挖掘包。例如 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
推荐阅读
- powershell - PowerShell 命令中的 /w 1 和 /C 是什么?
- node.js - BLOB 作为 LOB 和 Buffer 随机返回
- git - 列出更改和依赖的模块
- php - PHP / Laravel - 共享关系的独特结果
- javascript - JS读取本地大图文件的像素数据
- python - 为什么`object`是`type`的实例而`type`是`object`的实例?
- javascript - 运行离线时钟 28 小时 56 分 56 秒的 Android Widget 时钟
- typescript - 尝试将 typescript 库与 webpack 捆绑时导出未定义
- javascript - 如何在 ReactJs/Redux 中调试浏览器网络操作中的意外时间间隔?
- javascript - 如何传递触发事件的元素并更改其属性?