一尘不染

如何检测字符串列表中的常见子字符串

algorithm

给定一组字符串,例如:

EFgreen
EFgrey
EntireS1
EntireS2
J27RedP1
J27GreenP1
J27RedP2
J27GreenP2
JournalP1Black
JournalP1Blue
JournalP1Green
JournalP1Red
JournalP2Black
JournalP2Blue
JournalP2Green

我希望能够检测到这是三组文件:

  • 整个[1,2]
  • J27 [红色,绿色] P [1,2]
  • JournalP [1,2] [红色,绿色,蓝色]

有没有解决此问题的已知方法-我可以阅读任何发表过的论文吗?

我正在考虑的方法是,针对每个字符串查看所有其他字符串,并找到常见字符以及不同字符所在的位置,尝试查找具有最共同点的字符串集,但我担心这样做不是很有效,可能会给误报。

请注意,这与“如何在文件名中检测公用字符串组”不同,因为它假定字符串在其后将始终具有一系列数字。


阅读 195

收藏
2020-07-28

共1个答案

一尘不染

我将从这里开始:http
:
//en.wikipedia.org/wiki/Longest_common_substring_problem

在外部链接中有指向补充信息的链接,包括本文中介绍的两种算法的Perl实现。

编辑添加:

根据讨论,我仍然认为最长公共子字符串可能是此问题的核心。即使在注释中引用的Journal示例中,该集合的定义特征也是子字符串’Journal’。

我首先考虑将一组定义与其他组分开的原因。这使您可以使用分区来划分数据,然后问题是要衡量集合中存在多少共性。如果定义特征是公共子字符串,则最长公共子字符串将是一个逻辑起点。

通常,要使集合检测过程自动化,您将需要成对的公共性度量,可用于度量所有可能的对之间的“差异”。然后,您需要一种算法来计算导致总体差异最小的分区。如果差异度量不是Longest
Common Substring,那很好,但是您需要确定它将是什么。显然,它必须是可以衡量的具体内容。

还请记住,差异测量的属性将取决于可用于创建分区的算法。例如,假设diff(X,Y)给出X和Y之差的量度。那么,如果您的距离量度是diff(A,C)<=
diff(A,B)+ diff (公元前)。显然diff(A,C)应该与diff(C,A)相同。

在考虑这一点时,我也开始怀疑我们是否可以将“差异”理解为任意两个字符串之间的距离,并且通过对距离的严格定义,我们是否可以对输入字符串进行某种聚类分析。只是一个想法。

2020-07-28