卡尔·布罗曼的帖子:https://kbroman.wordpress.com/2015/06/22/randomized-hobbit-2/ https://kbroman.wordpress.com/2015/06/22/randomized-hobbit-2/让我玩正则表达式和 ngram 只是为了好玩。我尝试使用正则表达式来提取 2-grams。我知道有解析器可以执行此操作,但对正则表达式逻辑感兴趣(即,这是我未能满足的自我挑战)。
下面我给出一个最小的例子和所需的输出。我的尝试中的问题有两个:
克(单词)被消耗掉并且无法用于下一次传递。我怎样才能使它们可用于第二次传递?(例如,我想要like
可用于like toast
在它之前已经被消耗之后I like
)
我无法使单词之间的空格不被捕获(请注意输出中的尾随空格,即使我使用了(?:\\s*)
). 我怎样才能不捕获第 n 个(在本例中是第二个)单词上的尾随空格?我知道这可以简单地通过以下方式完成:"(\\b[A-Za-z']+\\s)(\\b[A-Za-z']+)"
对于 2-gram,但我想将解决方案扩展到 n-gram。 PS我知道的\\w
但我不认为下划线和数字是单词部分,但确实考虑'
作为单词的一部分。
MWE:
library(stringi)
x <- "I like toast and jam."
stringi::stri_extract_all_regex(
x,
pattern = "((\\b[A-Za-z']+\\b)(?:\\s*)){2}"
)
## [[1]]
## [1] "I like " "toast and "
期望的输出:
## [[1]]
## [1] "I like" "like toast" "toast and" "and jam"
这是使用基本 R 正则表达式的一种方法。这可以轻松扩展以处理任意 n 元语法。诀窍是将捕获组放入积极的前瞻断言中,例如,(?=(my_overlapping_pattern))
x <- "I like toast and jam."
pattern <- "(?=(\\b[A-Za-z']+\\b \\b[A-Za-z']+\\b))"
matches<-gregexpr(pattern, x, perl=TRUE)
# a little post-processing needed to get the capture groups with regmatches
attr(matches[[1]], 'match.length') <- as.vector(attr(matches[[1]], 'capture.length')[,1])
regmatches(x, matches)
# [[1]]
# [1] "I like" "like toast" "toast and" "and jam"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)