提取单词的现有和缺失的左侧搭配

Posted

技术标签:

【中文标题】提取单词的现有和缺失的左侧搭配【英文标题】:Extract existing and missing left-hand collocates of a word 【发布时间】:2022-01-10 09:52:43 【问题描述】:

如果“like”是字符串中的第一个单词,我正在努力,例如“like”:

test_string = c("like like like lucy she likes it and she's always liked it.")

使用 str_extract_all 和否定字符类 \\S 我已经接近了 - 但还不够接近(奇怪的是,第二个搭配的“l”被省略了):

library(stringr)
unlist(str_extract_all(test_string, "(^|\\S+)(?=\\s?\\blike\\b)"))
[1] ""     "ike"  "like"

使用这种模式,我错过了 missing 搭配:

unlist(str_extract_all(test_string, "('?\\b[a-z']+\\b|^)(?=\\s?\\blike\\b)"))
[1] "like" "like"

正确的结果应该是这样的:("" 代表字符串开头的“like”的 missing 搭配)

[1] ""     "like"  "like"

我想知道,这里的错误在哪里?如何改进提取?

【问题讨论】:

如果您不关心开头是否出现空匹配,您可以使用unlist(str_extract_all(test_string, "\\S+(?=\\s+like\\b)|(?<=^like\\b)"))(作为一种解决方法)。 让我快速解释一下这个问题:一旦找到空匹配,就会返回空字符串,并且正则表达式索引会前进到字符串中的下一个位置,因此不允许在同一位置进行两个匹配,一个空字符串和从该位置开始的单词。 我没有时间这样做,因此您可以尝试的解决方法是匹配并捕获您需要的项目。不过,您将需要重新排序捕获。见res <- str_match_all(test_string, "(^)(?:\\s*(like)\\b)?|(\\S+)(?=\\s+like\\b)")。如果 Col 4 是 NA,则取 Col 2 和 Col 3,否则取 Col 4。 which 在 Wiktor 的(第一次)工作中返回空字符串位置,并建议第二步 likes[c(which(likes == ""), which(likes != ""))],也许。 【参考方案1】:

您可以使用替换 | 来获取字符串开头的位置,并使用带有有限量词的后向断言进行匹配:

^ 字符串开始(这是位置) (?=like\b) 正向前瞻,断言like 后跟直接向右的单词边界 |或者 (?<= 正面回望 ^ 字符串开始 (?:like\s1,2)0,100 重复使用有限量词匹配,如后跟空白字符(也后跟有限量词) ) 近距离观察 like\b匹配like和一个词的边界

Regex demo | R demo

例子

test_string = c("like like like lucy she likes it and she's always liked it.")
library(stringr)
unlist(str_extract_all(test_string, "^(?=like\\b)|(?<=^(?:like\\s1,2)0,100)like\\b"))

输出

[1] ""     "like" "like"

【讨论】:

以上是关于提取单词的现有和缺失的左侧搭配的主要内容,如果未能解决你的问题,请参考以下文章

通过从现有分布中抽样来估算缺失值

忽略测试数据上缺失单词特征的方法

Java 缺失的特性:扩展方法

优化一个简单的缺失词算法[重复]

spss16.0缺失值是啥意思

在 Mongoose (mongodb node.js) 中,如何更新现有值并插入缺失值,而不删除未指定的值?