给定代表字符串的有限列表的正则表达式的语法推断?
Posted
技术标签:
【中文标题】给定代表字符串的有限列表的正则表达式的语法推断?【英文标题】:Grammatical inference of regular expressions for given finite list of representative strings? 【发布时间】:2013-03-08 22:04:50 【问题描述】:我正在分析一个大型公共数据集,其中包含大量人类可读的冗长字符串,这些字符串显然是由某些常规(在正式语言理论意义上)语法生成的。
逐个查看这些字符串的集合以了解模式并不难;不幸的是,这些独特的字符串中约有 24,000 个分为 33 个类别和 1714 个子类别,因此手动执行此操作有些痛苦。
基本上,我正在寻找一种现有的算法(最好具有现有的参考实现)来获取任意字符串列表并尝试来推断一些最小的(对于一些合理的最小定义)跨越正则表达式集,可用于生成它们(即从由该语法生成的语言的有限字符串集推断正则语法)。
我考虑过重复贪婪的最长公共子字符串消除,但仅此而已,因为它除了完全匹配之外不会折叠任何内容,因此不会检测到,例如,在特定位置变化数字字符串的常见模式在语法中的位置。
暴力强制任何不属于公共子字符串消除的东西是可能的,但在计算上可能不可行。 (此外,我已经考虑过了,子字符串消除可能存在“阶段排序”和/或“局部最小值”问题,因为您可能会进行贪婪的子字符串匹配,最终迫使最终语法压缩得更少/最小化,尽管它最初看起来是最好的减少)。
【问题讨论】:
Please see the meta discussion around this question. 【参考方案1】:是的,事实证明这确实存在;所需的是在学术上称为 DFA 学习算法,其中的示例包括:
Angluin's L* L*(在列中添加反例) 卡恩斯 / Vazirani 里维斯特/夏皮雷 荷兰* 常规正负推理 (RPNI) DeLeTe2 Biermann & Feldman 算法 Biermann & Feldman 算法(使用 SAT 求解)以上来源为libalf,一个开源的C++自动机学习算法框架;至少其中一些算法的描述可以在this textbook 等中找到。在gitoolbox for MATLAB 中也有语法推理算法(包括 DFA 学习)的实现。
由于 this question has come up before 过去没有得到满意的答复,我正在评估这些算法,并将更新更多关于它们有用性的信息,除非在该领域有更多专业知识的人首先这样做(更可取)。
注意:我现在接受我自己的答案,但如果有人可以提供更好的答案,我会很乐意接受。
进一步说明:我决定采用使用自定义代码的路线,因为使用通用算法对我正在处理的数据来说有点矫枉过正.我把这个答案留在这里,以防其他人需要它,如果我评估这些,我会更新。
【讨论】:
【参考方案2】:我唯一能建议的就是玩一下Nltk(Python 的自然语言工具包),看看它是否至少可以识别重复出现的模式。
您可能会关注MALLET(用于统计自然语言处理、文档分类、聚类、主题建模、信息提取等的基于 Java 的包)
Perl 有一个叫做LinkParser 的东西,但它似乎要求你提供实际语法的表示(另一方面,它带有大量不同的模型,所以也许可以硬塞它来帮助你排序你的样本)。
Gate 可能允许您从语料库中的记录子集创建示例,并可能从这些记录中对语法进行逆向工程。
最后,看看CRAN repository for text-specific packages。
【讨论】:
一个自然语言包,虽然有用,但通常不能识别正式的正则语法并以正式的正则形式表达其输出(自然语言通常不是正则的)...你知道有没有这些?语法解析器实际上与推断语法的任务是正交的。 @Stephen Lin:我知道,这是我能建议的最好的。 :( 没问题,你看过关于这个的历史和元讨论吗?我已经有两个非常好的“DFA 学习算法”链接,但显然答案已被删除...... 我还想知道机器学习系统是否可以生成(您的字符串的)分类,可以帮助您手动识别模式。 是的,但如果分类器假设有规律性并像这样表达输出,那就更方便了。这些模式非常很容易看到,只是它们的数量不方便。无论如何,请参阅我的答案(这是我已经删除的答案的扩展版本...meta.stackexchange.com/questions/172602/…>_>)以上是关于给定代表字符串的有限列表的正则表达式的语法推断?的主要内容,如果未能解决你的问题,请参考以下文章