Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 字符串的泛化与状态机优化_Regex_Algorithm_Optimization_Nlp_State Machine - Fatal编程技术网

Regex 字符串的泛化与状态机优化

Regex 字符串的泛化与状态机优化,regex,algorithm,optimization,nlp,state-machine,Regex,Algorithm,Optimization,Nlp,State Machine,我正在研究接受常规语言给定采样的学习状态机,您可以允许或不允许采样中存在噪声,为了简单起见,让我们假设没有噪声 例如: 给定字符串['fun',gun',我可以构造正则表达式'fun | gun',但较短的正则表达式描述是'[fg]un',我希望系统地找到这一点 我看到过一些论文,将语言传授给RNN,然后以各种近似的奇怪方式从RNN中提取状态机,这有点奇怪,因为我似乎还模糊地记得,在我的计算机科学时代,优化状态机的问题是一个研究得相当好、解决得相当好的问题。如果第二个是真的,为什么不从任何接受语

我正在研究接受常规语言给定采样的学习状态机,您可以允许或不允许采样中存在噪声,为了简单起见,让我们假设没有噪声

例如:

给定字符串['fun',gun',我可以构造正则表达式'fun | gun',但较短的正则表达式描述是'[fg]un',我希望系统地找到这一点

我看到过一些论文,将语言传授给RNN,然后以各种近似的奇怪方式从RNN中提取状态机,这有点奇怪,因为我似乎还模糊地记得,在我的计算机科学时代,优化状态机的问题是一个研究得相当好、解决得相当好的问题。如果第二个是真的,为什么不从任何接受语言的状态机开始,然后根据状态或其他方面对其进行优化呢


简而言之,python中有没有正则表达式/状态机优化算法我可以用在一些模糊的包中,因为我找不到实现它的算法或包,只是一些模糊的CS讲座幻灯片。

最小化正则表达式和最小化状态机是两个截然不同的问题。事实上,虽然DFA和正则表达式具有相同的表达能力(它们可以描述完全相同的语言),但表示的大小之间没有简单的关系。有些DFA需要状态数为指数大小的正则表达式,有些正则表达式在转换为DFA时会指数膨胀(即使最小化)。此外,最小化正则表达式的大小基本上是难以解决的,这与最小化DFA中的状态不同。(有“近似最小”的算法,但它们并不漂亮。)

标准Python库中没有用于执行这些任务的包。互联网上充斥着坏的和受拷贝保护的实现(有时甚至是二合一);出于某种原因,几乎所有的实现似乎都是由仍在学习他们所用语言的学生完成的,或者是认为他们的工作太宝贵而无法作为开源共享的学者完成的。无论如何,前面的恶作剧就是一个例子,说明了为什么“给我找个资源”问题如此令人沮丧:它们往往会吸引对任何人都没有特别帮助的固执己见的回答(也许除了搔痒回答者之外)


如果你要对它进行编程,算法实际上非常简单。将regex转换为NFA的Thompson构造不应该超过100行Python,而生成DFA的powerset构造则更简单。一旦有了NFA->DFA,就可以使用Brzowski的算法进行最小化,这很简单:将生成NFA的DFA反转,将其还原为DFA,然后再反转并还原。不清楚为什么这样做有效,但它确实有效,而且一旦您编写了DFA反向器,它就是一行代码,而DFA反向器又是六行。

最小化正则表达式和最小化状态机是非常不同的问题。事实上,虽然DFA和正则表达式具有相同的表达能力(它们可以描述完全相同的语言),但表示的大小之间没有简单的关系。有些DFA需要状态数为指数大小的正则表达式,有些正则表达式在转换为DFA时会指数膨胀(即使最小化)。此外,最小化正则表达式的大小基本上是难以解决的,这与最小化DFA中的状态不同。(有“近似最小”的算法,但它们并不漂亮。)

标准Python库中没有用于执行这些任务的包。互联网上充斥着坏的和受拷贝保护的实现(有时甚至是二合一);出于某种原因,几乎所有的实现似乎都是由仍在学习他们所用语言的学生完成的,或者是认为他们的工作太宝贵而无法作为开源共享的学者完成的。无论如何,前面的恶作剧就是一个例子,说明了为什么“给我找个资源”问题如此令人沮丧:它们往往会吸引对任何人都没有特别帮助的固执己见的回答(也许除了搔痒回答者之外)


如果你要对它进行编程,算法实际上非常简单。将regex转换为NFA的Thompson构造不应该超过100行Python,而生成DFA的powerset构造则更简单。一旦有了NFA->DFA,就可以使用Brzowski的算法进行最小化,这很简单:将生成NFA的DFA反转,将其还原为DFA,然后再反转并还原。不清楚为什么这样做有效,但它确实有效,而且一旦您编写了DFA反向器,它就是一行代码,而DFA反向器又是六行。

谢谢,我将研究您提到的算法,但我不理解这种说法,DFA->NFA->DFA循环是否能确保以最小的DFA结束?也。。。样本的泛化和过度拟合之间不应该有一些平衡参数吗?@veltzer:是的,如果你从一个DFA开始,进行两次反向/转换为DFA的迭代,那么你得到的是最小的DFA。证据太长,无法放在评论中,但您应该能够很容易地找到它。(搜索brzowski最小化)至于泛化和过度拟合,这超出了这个答案的范围:-)您刚刚要求提供一个可以最小化正则表达式或状态机的Python库,这就是我试图解决的问题。但你当然需要处理泛化问题。例如,
a*
的任何有限子集的正则表达式和状态机在子集的大小上都是线性的,但是
a*
本身只是两个符号,状态机只有两个状态。您能详细说明一下吗