给定一组字符串,例如:
EFgreen EFgrey EntireS1 EntireS2 J27RedP1 J27GreenP1 J27RedP2 J27GreenP2 JournalP1Black JournalP1Blue JournalP1Green JournalP1Red JournalP2Black JournalP2Blue JournalP2Green
我希望能够检测到这是三组文件:
有没有解决此问题的已知方法-我可以阅读任何发表过的论文吗?
我正在考虑的方法是,针对每个字符串查看所有其他字符串,并找到常见字符以及不同字符所在的位置,尝试查找具有最共同点的字符串集,但我担心这样做不是很有效,可能会给误报。
请注意,这与“如何在文件名中检测公用字符串组”不同,因为它假定字符串在其后将始终具有一系列数字。
我将从这里开始: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)相同。
在考虑这一点时,我也开始怀疑我们是否可以将“差异”理解为任意两个字符串之间的距离,并且通过对距离的严格定义,我们是否可以对输入字符串进行某种聚类分析。只是一个想法。