从一组示例字符串中学习(通用)语法/模式?

数据挖掘 文本挖掘 模式识别 语法推理
2022-02-15 23:57:24

所以我目前在工作中有一个文本模式检测挑战需要解决。我正在尝试为数据库创建异常值检测算法,用于字符串列。

例如,假设我有以下字符串列表:

["abc123", "jkj577", "lkj123", "uio324", "123123"]

我想开发一种算法来检测字符串列表中的常见模式,并指出哪些字符串不是这种格式。例如,在上面的示例中,我希望该算法检测以下正则表达式:

r"[a-z]{3}\d{3}"

鉴于列表中的大多数条目都遵循这种模式,除了最后一个,它应该被标记为异常值。

我想到的第一个想法是使用遗传算法来查找正则表达式模式,其中适应度函数是列表中与模式匹配的条目数。我还没有计算出细节(交叉函数等),并且已经存在模式“。*”将匹配所有内容的困难,因此将始终最大化适应度函数。

有人已经解决过类似的问题吗?我在这里有什么选择?谢谢!

2个回答

您面临的问题是文学语法学习语法推理中所谓的一部分,它是自然语言处理和机器学习的一部分,通常是一个非常困难的问题。

然而,对于某些情况,如常规语法/语言(即学习正则表达式/DFA 学习),有满足限制的令人满意的解决方案。

语法推理和常规语法推理的调查和参考:

从简单的例子中学习 DFA

DFA的高效学习是语法推理中一个具有挑战性的研究问题。众所周知,DFA 的精确和近似(在 PAC 意义上)可识别性都很难。皮特在他的开创性论文中提出了以下开放性研究问题:“如果样本来自均匀分布或其他已知的简单分布,DFA PAC 是否可识别?”。我们证明了简单的 DFA 类(即,其规范表示具有对数 Kolmogorov 复杂度的 DFA)在 Solomonoff Levin 通用分布下是有效的 PAC 可学习的。我们证明,如果样本是由了解目标概念的老师根据普遍分布随机抽样的,则整个 DFA 类在普遍分布下是有效的 PAC 可学习的。因此,我们证明了 DFA 在 PACS 模型下是有效可学习的。此外,我们证明了在 Gold 的特征样本学习模型、Goldman 和 Mathias 的多项式可教性模型以及从基于示例的查询中学习的模型下可学习的任何概念在 PACS 模型下也是可学习的

一种为有限语言构建最小覆盖自动机O(n2)

在 [1] 中引入了覆盖自动机作为有限语言的有效表示。在 [1] 中,给出了一种将接受有限语言的 DFA 转换为时间复杂度为的最小确定性有限覆盖自动机 (DFCA) 的算法,其中是给定 DFA 的状态数。在本文中,我们介绍了一种新的高效变换算法,其时间复杂度为 ,这是对之前算法的显着改进。O(n4)nO(n2)

甚至还有实现语法推理和 DFA 学习算法的库:

  1. 自由行
  2. Matlab 的 gittoolbox

来源:堆栈溢出

这里有一些想法:

如果字符串的数量不是太多,您可以考虑采用正式方法并使用有限自动机确定算法(我对这些东西非常生疏,但我清楚地记得有这样的东西)。这个想法是从一个由所有字符串联合组成的大自动机开始,然后使用算法找到确定性自动机,然后可以将其转换为正则表达式。

一个更符合数据科学的想法是在所有字符串对之间使用基于字符的相似性/距离度量。然后应该可以通过基于距离的聚类来识别异常值。典型的基于字符的度量:Jaro-WincklerLevenshtein 编辑距离

最后一个原始的(但可能是坏的)想法是尝试在字符串上训练一个(基于字符的)语言模型(假设有足够多的字符串)。给定一个输入字符串,语言模型为您提供该字符串属于“语言”的概率,因此可以通过其低概率检测到异常值。


[在OP的评论之后添加]

语言建模通常用于基于该语言中单词序列的可能性来表示一种语言(例如英语)中的有效句子。它是从大量正确的句子中训练出来的,因此它可以估计n- 这种语言的单词克数。这是一个常见的 NLP 任务(example),但在您的情况下,您将使用字符而不是单词和字符串而不是句子,因此与您找到的示例相比,会有一个小的调整。