6

当您键入具有特定模式的 3 行并将列一直向下拖动时,您就知道 Excel 中的功能 Excel 会尝试为您继续该模式。

例如

类型...

  • 测试一
  • 测试2
  • 测试3

Excel 将继续:

  • 测试4
  • 测试5
  • 试...

同样适用于其他一些模式,例如日期等。

我正在尝试完成类似的事情,但我也想处理更多特殊情况,例如:

  • 测试蓝色的东西
  • 测试黄色的东西
  • 测试红色的东西

现在基于这些条目,我想说模式是:

  • 测试-[动态]-某事

继续使用其他颜色的 [DYNAMIC] 完全是另一回事,我现在真的不在乎。我最感兴趣的是检测模式中的 [DYNAMIC] 部分。

我需要从大量池条目中检测到这一点。假设您有 10.000 个具有这种模式的字符串,并且您希望根据相似性对这些字符串进行分组,并检测文本的哪个部分不断变化([DYNAMIC])。

文档分类在这种情况下可能很有用,但我不知道从哪里开始。

更新:

我忘了提到也可以有多个 [DYNAMIC] 模式。

如:

  • test_[动态] 12 [动态2]

我认为这并不重要,但我计划在 .NET 中实现它,但任何有关使用算法的提示都会非常有帮助。

4

4 回答 4

2

一旦您开始考虑查找表单模式的动态部分:在 <const1><dynamic1><const2><dynamic2>....没有任何其他假设的情况下,您将需要找到您提供的样本字符串的最长公共子序列。例如,如果我有test-123-abctest-48953-defg那么 LCS 将是test-and -。动态部分将是 LCS 结果之间的差距。然后,您可以在适当的数据结构中查找您的动态部分。

找到超过 2 个字符串的 LCS 的问题非常昂贵,这将是您问题的瓶颈。以准确性为代价,您可以使这个问题易于处理。例如,您可以在所有字符串对之间执行 LCS,并将具有相似 LCS 结果的字符串组合在一起。但是,这意味着无法正确识别某些模式。

当然,如果您可以对字符串施加进一步的限制,那么所有这些都可以避免,就像 Excel 所做的那样,它似乎只允许 form 的模式<const><dynamic>

于 2009-09-07T14:27:58.083 回答
0

发现 [动态] 没什么大不了的,你可以用 2 个字符串来做到这一点 - 只是从开头开始,当它们开始不相等时停止,从最后做同样的事情,瞧 - 你得到了你的 [动态]

类似(伪代码 - 有点):

String s1 = 'asdf-1-jkl';
String s2= 'asdf-2-jkl';
int s1I = 0, s2I = 0;
String dyn1, dyn2;
for (;s1I<s1.length()&&s2I<s2.length();s1I++,s2I++)
  if (s1.charAt(s1I) != s2.charAt(s2I))
    break;
int s1E = s1.length(), s2E = s2.length;
for (;s2E>0&&s1E>0;s1E--,s2E--)
  if (s1.charAt(s1E) != s2.charAt(s2E))
    break;
dyn1 = s1.substring(s1I, s1E);
dyn2 = s2.substring(s2I, s2E);

关于您的 10k 数据集。您需要使用每种组合来调用它(或者可能是更优化的版本)以找出您的模式(10k x 10k 调用)。然后按模式对结果进行排序(即保存开始和结束并按这些字段排序)

于 2009-09-07T12:23:03.763 回答
0

我认为你需要计算类似Levenshtein distance的东西,找到相似字符串组,然后在每组相似字符串中,用典型的 diff-like 算法识别动态部分。

于 2009-09-07T12:39:12.950 回答
0

不管你信不信,谷歌文档在这类事情上可能比 excel 更好。

谷歌已经收集了大量关于集合的数据——例如,在你给出的例子中,它会识别出蓝色、红色、黄色……作为集合“颜色”的一部分。它具有比 Excel 更完整的模式识别功能,因此更有可能继续使用该模式。

于 2009-09-07T13:36:48.763 回答