我有一列字符串名称,我想找到经常出现的模式(单词)。 有没有一种方法可以返回长度大于X(或等于X)的字符串,并且在整列中出现的次数比Y还多?在
column <- c("bla1okay", "okay1243bla", "blaokay", "bla12okay", "okaybla")
getOftenOccuringPatterns <- function(.....)
getOftenOccuringPatterns(column, atleaststringsize=3, atleasttimes=4)
> what times
[1] bla 5
[2] okay 5
引用Tim的评论:
我想删除嵌套的,所以如果有“aaaaaaa”和“aaaa”,并且这两个都会出现在输出中,那么只有“aaaaaaa”和其中一个出现的次数才算数。在
如果atleaststringsize=3
和{atleasttimes=10
,“aaaaaaaa”出现15次,“aaaaaa”出现15次,然后:
以及
getOftenOccurringPatterns(column, atleaststringsize=4, atleasttimes=10)
> what times
[1] aaaaaaaa 15
停留时间最长的一个,并且至少=3和至少=4都是一样的。在
这将创建所有子字符串的所有出现的向量;它这样做很天真,迭代输入字符串max(nchar(x))的最大长度,并查找长度为1、2、。。。max(nchar(x)),所以在多项式时间内缩放它对于超大型问题是无效的。在
本修订版包含以下更改:
在前一个版本的内部和外部循环中,
.accumulate
实现了可怕的“复制并追加”模式;现在我们在预先分配的列表answer0
中累积结果,然后在内部循环之后累积这些结果。allSubstrings()
有参数min_occur
、min_nchar
(和max_nchar
)来限制搜索空间。尤其是,min_occur
(子串必须出现以保留的最小次数)有助于减少搜索较长子串的字符向量的长度。函数
.filter()
可用于更积极地删除不包含长度为i的子字符串的字符串;这可能代价高昂,因此可以设置一个启发式和参数useFilter
。过滤器的使用使整个解决方案看起来更像是一个黑客而不是一个算法-关于子串的信息已经被提取出来了,所以我们不必再回去搜索它们的出现。这是修改后的主要功能
以及
^{pr2}$.filter
函数与之前一样,result是一个命名向量,其中名称是字符串,值是它们出现的次数。在
类似于原始问题的查询就很容易执行,例如,>;=3个字符的所有子字符串出现次数超过4次:
代码不能完全回答问题,例如,存在嵌套子字符串,但可能会替换@user1609452答案的嵌套
lapply
部分。后处理-消除嵌套子序列的结果有点不雅观,但由于后处理的结果不是很大,因此可能足够快,例如,消除嵌套子串在这里,我们使用笔记本电脑上的99k单词字典进行输入,并为修改后的算法提供一些基本的时间安排
这大约比原始算法快10倍,这完全是因为修订版1(使用预分配和填充,然后是累加)。在
这里有一个较长句子的语料库
还有一些时间安排。这从指定
min_occur
参数和过滤器的使用中受益匪浅。在由于需要使用过滤器,并且在较长字符串上的性能较差,因此人们希望得到更好的算法,如suffix array;“Rlibstree”包也可能有用,尽管我不确定从何处获得当前版本,或者接口的公开部分是否足以回答最初的问题。在
它没有经过任何测试,也不会赢得任何速度比赛:
好的,我用Python编写了一个解决方案。对不起,我不能给你一个工作的R程序,但你应该能够实现一个从这个。正如您所看到的,这是一个非常暴力的解决方案,但是我真的看不出一种方法来从输入中的所有字符串构建所有可能的子字符串。在
我把这个问题分解成了简单、独立的步骤。这些应该很容易翻译成R。我确信R中有可比较的列表、集合和计数器的数据结构。在
输出:
^{pr2}$相关问题 更多 >
编程相关推荐