Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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_Nlp_Machine Learning - Fatal编程技术网

Regex 从标记数据集中提取正则表达式的技术

Regex 从标记数据集中提取正则表达式的技术,regex,algorithm,nlp,machine-learning,Regex,Algorithm,Nlp,Machine Learning,让我们假设我有一个数十万个字符串的数据集(如果有必要的话,这些字符串恰好是自然语言句子),每个字符串都有一个特定的“标签”。每个句子都有一个标签,大约有10个标签,每个标签大约有10%的数据集属于它们。标签中的句子结构具有高度的相似性 我知道上面这些听起来像是机器学习问题的经典例子,但我想问一个稍微不同的问题是否有任何已知的技术可以通过编程为每个标签生成一组正则表达式,从而成功地对训练数据进行分类,同时仍然可以推广到未来的测试数据? 我很乐意参考文献;我意识到这不是一个简单的算法:) PS:我知

让我们假设我有一个数十万个字符串的数据集(如果有必要的话,这些字符串恰好是自然语言句子),每个字符串都有一个特定的“标签”。每个句子都有一个标签,大约有10个标签,每个标签大约有10%的数据集属于它们。标签中的句子结构具有高度的相似性

我知道上面这些听起来像是机器学习问题的经典例子,但我想问一个稍微不同的问题是否有任何已知的技术可以通过编程为每个标签生成一组正则表达式,从而成功地对训练数据进行分类,同时仍然可以推广到未来的测试数据?

我很乐意参考文献;我意识到这不是一个简单的算法:)

PS:我知道进行分类的常规方法是使用机器学习技术,如支持向量机等。然而,我正在明确地寻找一种生成正则表达式的方法。(我很乐意使用机器学习技术来生成正则表达式,而不是使用机器学习技术来进行分类!)

注意:这可能会有所帮助。下面的函数为
a
b
的给定值生成正则表达式模式。其中
a
b
都是字母字符串。该函数将生成一个公平的
RegEx
模式,以匹配
a
b
之间的范围。该函数只需要前三个字符就可以生成模式,并生成一个
结果
,该结果可能类似于某种语言中的
starts-with()
函数,并带有一般正则表达式的提示

一个简单的VB.NET示例

Public Function GetRangePattern(ByVal f_surname As String, ByVal l_surname As String) As String
        Dim f_sn, l_sn As String
        Dim mnLength% = 0, mxLength% = 0, pdLength% = 0, charPos% = 0
        Dim fsn_slice$ = "", lsn_slice$ = ""
        Dim rPattern$ = "^"
        Dim alphas As New Collection
        Dim tmpStr1$ = "", tmpStr2$ = "", tmpStr3$ = ""

        '///init local variables
        f_sn = f_surname.ToUpper.Trim
        l_sn = l_surname.ToUpper.Trim

        '///do null check
        If f_sn.Length = 0 Or l_sn.Length = 0 Then
            Return "-!ERROR!-"
        End If

        '///return if both equal
        If StrComp(f_sn, l_sn, CompareMethod.Text) = 0 Then
            Return "^" & f_sn & "$"
        End If

        '///return if 1st_name present in 2nd_name
        If InStr(1, l_sn, f_sn, CompareMethod.Text) > 0 Then
            tmpStr1 = f_sn
            tmpStr2 = l_sn.Replace(f_sn, vbNullString)
            If Len(tmpStr2) > 1 Then
                tmpStr3 = "[A-" & tmpStr2.Substring(1) & "]*"
            Else
                tmpStr3 = tmpStr2 & "*"
            End If
            tmpStr1 = "^" & tmpStr1 & tmpStr3 & ".*$"
            tmpStr1 = tmpStr1.ToUpper
            Return tmpStr1
        End If

        '///initialize alphabets
        alphas.Add("A", CStr(Asc("A")))
        alphas.Add("B", CStr(Asc("B")))
        alphas.Add("C", CStr(Asc("C")))
        alphas.Add("D", CStr(Asc("D")))
        alphas.Add("E", CStr(Asc("E")))
        alphas.Add("F", CStr(Asc("F")))
        alphas.Add("G", CStr(Asc("G")))
        alphas.Add("H", CStr(Asc("H")))
        alphas.Add("I", CStr(Asc("I")))
        alphas.Add("J", CStr(Asc("J")))
        alphas.Add("K", CStr(Asc("K")))
        alphas.Add("L", CStr(Asc("L")))
        alphas.Add("M", CStr(Asc("M")))
        alphas.Add("N", CStr(Asc("N")))
        alphas.Add("O", CStr(Asc("O")))
        alphas.Add("P", CStr(Asc("P")))
        alphas.Add("Q", CStr(Asc("Q")))
        alphas.Add("R", CStr(Asc("R")))
        alphas.Add("S", CStr(Asc("S")))
        alphas.Add("T", CStr(Asc("T")))
        alphas.Add("U", CStr(Asc("U")))
        alphas.Add("V", CStr(Asc("V")))
        alphas.Add("W", CStr(Asc("W")))
        alphas.Add("X", CStr(Asc("X")))
        alphas.Add("Y", CStr(Asc("Y")))
        alphas.Add("Z", CStr(Asc("Z")))

        '///populate max-min length values
        mxLength = f_sn.Length
        If l_sn.Length > mxLength Then
            mnLength = mxLength
            mxLength = l_sn.Length
        Else
            mnLength = l_sn.Length
        End If
        '///padding values
        pdLength = mxLength - mnLength
        f_sn = f_sn.PadRight(mxLength, "A")
        'f_sn = f_sn.PadRight(mxLength, "~")
        l_sn = l_sn.PadRight(mxLength, "Z")
        'l_sn = l_sn.PadRight(mxLength, "~")

        '///get a range like A??-B??
        If f_sn.Substring(0, 1).ToUpper <> l_sn.Substring(0, 1).ToUpper Then
            fsn_slice = f_sn.Substring(0, 3).ToUpper
            lsn_slice = l_sn.Substring(0, 3).ToUpper
            tmpStr1 = fsn_slice.Substring(0, 1) & fsn_slice.Substring(1, 1) & "[" & fsn_slice.Substring(2, 1) & "-Z]"
            tmpStr2 = lsn_slice.Substring(0, 1) & lsn_slice.Substring(1, 1) & "[A-" & lsn_slice.Substring(2, 1) & "]"
            tmpStr3 = "^(" & tmpStr1 & "|" & tmpStr2 & ").*$"
            Return tmpStr3
        End If

        '///looping charwise
        For charPos = 0 To mxLength
            fsn_slice = f_sn.Substring(charPos, 1)
            lsn_slice = l_sn.Substring(charPos, 1)
            If StrComp(fsn_slice, lsn_slice, CompareMethod.Text) = 0 Then
                rPattern = rPattern & fsn_slice
            Else
                'rPattern = rPattern & "("
                If charPos < mxLength Then
                    Try
                        If Asc(fsn_slice) < Asc(lsn_slice) Then
                            tmpStr1 = fsn_slice & "[" & f_sn.Substring(charPos + 1, 1) & "-Z" & "]|"
                            If CStr(alphas.Item(Key:=CStr(Asc(fsn_slice) + 1))) < CStr(alphas.Item(Key:=CStr(Asc(lsn_slice) - 1))) Then
                                tmpStr2 = "[" & CStr(alphas.Item(Key:=CStr(Asc(fsn_slice) + 1))) & "-" & CStr(alphas.Item(Key:=CStr(Asc(lsn_slice) - 1))) & "]|"
                            Else
                                tmpStr2 = vbNullString
                            End If
                            tmpStr3 = lsn_slice & "[A-" & l_sn.Substring(charPos + 1, 1) & "]"
                            rPattern = rPattern & "(" & tmpStr1 & tmpStr2 & tmpStr3 & ").*$"
                            'MsgBox("f_sn:= " & f_sn & " -- l_sn:= " & l_sn & vbCr & rPattern)
                            Exit For
                        Else
                            Return "-#ERROR#-"
                        End If
                    Catch ex As Exception
                        Return "-|ERROR|-" & ex.Message
                    End Try
                End If
            End If
        Next charPos
        Return rPattern
    End Function
产生了这个

?GetRangePattern("ABC","DEF")
"^(AB[C-Z]|DE[A-F]).*$"

这个问题通常被定义为如何从字符串集而不是正则表达式生成有限自动机,尽管您显然可以从FAs生成REs,因为它们是


如果你四处搜索自动机归纳法,你应该能够找到很多关于这个主题的文献,包括GA方法。

据我所知,这是当前进化计算研究的主题

以下是一些例子:

请参见第页的幻灯片40-44

(截至发布此答案时,幻灯片已存在)

另外,请参见


有关GECCO 2012上介绍的系统的更详细审查

您总是可以简单地构建朴素的正则表达式:
(A | B | C)
标签1<代码>(D | E | F)标签2等,其中A、B、C等是项,但这将使“在仍然推广到未来测试数据”的情况下失败,这是悲惨的:)我试图建议的另一个解决方案是使用GA来构建正则表达式-适应度函数可以很简单,变异/交叉阶段也可以,但至少可以这么说,这似乎有点过头了。我以后可能会尝试把它写下来作为一个答案。我可以看到的另一个选项是,使用和解决一个修改的“最长类特定公共子序列”变量,但解决这个问题看起来很棘手。