我正在分析一个包含大量人类可读字符串的大型公共数据集,这些字符串显然是由一些常规(在形式语言理论意义上)语法生成的。
逐个查看这些字符串的集合以查看模式并不难;不幸的是,这些独特的字符串中约有 24,000 个被分为 33 个类别和 1714 个子类别,因此手动执行此操作有些痛苦。
基本上,我正在寻找一种现有的算法(最好使用现有的参考实现)来获取任意字符串列表,并尝试推断出一些最小(对于最小的合理定义)跨正则表达式集,这些正则表达式可用于生成它们(即从该语法生成的语言的有限字符串集合中推断出常规语法)。
我考虑过重复贪婪的最长公共子串消除,但这只是到目前为止,因为它不会折叠除了完全匹配之外的任何东西,所以不会检测到,比如说,在特定位置的不同数字字符串的常见模式语法。
蛮力强制任何不属于公共子字符串消除的东西是可能的,但在计算上可能不可行。(此外,我已经考虑过了,子字符串消除可能存在“阶段排序”和/或“局部最小值”问题,因为您可能会进行贪婪的子字符串匹配,最终迫使最终语法压缩得更少/最小,即使它最初似乎是最好的减少)。