给定一组字符串,我需要删除集合中另一个字符串的子字符串。子串可以出现在任何位置。我希望至少有50%的字符串是其他字符串的子字符串。我的字符串是来自大型自然语言语料库的n-gram。
例如,给定("大车","大车","在大车","买一辆大车&# 34;,"买一个大","买一个大房子")然后结果应该是("在大汽车","买一个大车","买一个大房子");订购输出并不重要。
因为我的套装有10万个字符串,所以不能选择对每个字符串进行强力测试。
有谁知道这个问题的标准解决方案?
或者,任何人都可以添加一些我曾经拥有的想法:
如果我先对字符串进行排序,那么应该更容易在字符串的开头(以及反向排序的字符串结尾)中挑选子字符串?仍然需要在其他地方处理子字符串。
使用树形结构?像下面这样的东西? (i)在每个字符串中添加START和END令牌; (ii)树中的第一个节点是START; (iii)字符串"大车" - >新的分支机构START-big-car-END,但是那时的大车"添加分支成为START-the-big-car-END; (iv)一旦插入所有字符串,然后读取从START到ENDs的所有路径。考虑到潜在的大量单词(至少1000&s),不确定这一点。此外,同一个词的问题在一个句子中不止一次出现。
我可以为暴力添加某种内存,这样下一个处理过的字符串可以先与一组先前删除的字符串进行比较吗?
答案 0 :(得分:0)
我正在R中使用lapply函数来实现这一目标:
calc <- function(e, df){
i <- 1
while (!(grepl(e[[1]],df[i,1], fixed=TRUE, ignore.case = TRUE)) & i <=nrow(df)){
i <- i + 1
}
return (df[i,])
}
reduced <- lapply(input_df[,1], calc, df=input_df)
output_df <- do.call(rbind,reduced)
曾经在大型数据集上表现良好,但在非常大的数据集上却表现不佳。
注意:我按长度(DESC)对input_df进行排序,以获得最佳性能