首页 > 解决方案 > 正则表达式编写您自己的 NGram 分词器

问题描述

我想用正则表达式编写自己的 n-gram 标记器,以更好地理解算法。Unigram 是小菜一碟。stringr::str_split("words in a brief sentence", "\\s", simplify = FALSE)作为一元标记器工作得很好,但是将这个概念应用到一个单词之外是令人困惑的。应该使用什么正则表达式代替“\\s”来创建二元组或三元组(例如:“words in”“in a”“a brief”“brief sentence”)?

标签: rregex

解决方案


我们可以使用

v1 <- strsplit(str1, "\\s+")[[1]]
paste(head(v1, -1), tail(v1, -1))
[1] "words in"       "in a"           "a brief"        "brief sentence"

如果我们想概括,一个选项是

library(data.table)
lst1 <- lapply(shift(v1, n = 0:2, type = 'lead'), na.omit)
mn <- min(lengths(lst1))
do.call(paste,  lapply(lst1, head, mn))
[1] "words in a"       "in a brief"       "a brief sentence"

数据

str1 <- "words in a brief sentence"

推荐阅读