是否可以编写自适应解析器?

人工智能 机器学习 无监督学习 javascript
2021-11-01 08:16:40

我正在开发一个专注于错误处理的 js 库。lib 的一部分是一个堆栈解析器,我想在大多数环境中工作。

没有标准的方式来表示堆栈的困难部分,所以每个环境都有自己的堆栈字符串格式。可变部分是消息、类型和帧。一个框架通常由被调用的函数、文件、行、列组成。

在某些环境中,字符串上有额外的变量区域,在其他环境中,一些变量不存在。我只能在 5 个最常见的环境中运行自动化测试,但我希望解析器在更多环境中工作。

  • 我的目标是编写一个自适应解析器,它可以即时学习实际环境的堆栈字符串格式,然后它可以解析该环境的任何异常的堆栈。

我已经有了如何以传统方式解决这个问题的计划,但我很好奇,有没有机器学习工具(可能在无监督学习的主题中)可以用来解决这个问题?

根据评论,我需要澄清术语“堆栈字符串格式”和“堆栈解析器”。我认为最好从不同的环境中编写 2 个示例:

一个。)

示例堆栈字符串:

Statement on line 44: Type mismatch (usually a non-object value used where an object is required)
Backtrace:
  Line 44 of linked script file://localhost/G:/js/stacktrace.js
    this.undef();
  Line 31 of linked script file://localhost/G:/js/stacktrace.js
    ex = ex || this.createException();
  Line 18 of linked script file://localhost/G:/js/stacktrace.js
    var p = new printStackTrace.implementation(), result = p.run(ex);
  Line 4 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
    printTrace(printStackTrace());
  Line 7 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
    bar(n - 1);
  Line 11 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
    bar(2);
  Line 15 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
    foo();

堆栈字符串格式(模板):

Statement on line {frames[0].location.line}: {message}
Backtrace:
{foreach frames as frame}
  Line {frame.location.line} of {frame.unknown[0]} {frame.location.path}
    {frame.calledFunction}
{/foreach}

提取信息(json):

{
    message: "Type mismatch (usually a non-object value used where an object is required)",
    frames: [
        {
            calledFunction: "this.undef();",
            location: {
                path: "file://localhost/G:/js/stacktrace.js",
                line: 44
            },
            unknown: ["linked script"]
        },
        {
            calledFunction: "ex = ex || this.createException();",
            location: {
                path: "file://localhost/G:/js/stacktrace.js",
                line: 31
            },
            unknown: ["inline#1 script in"]
        },
        ...
    ]
}

乙)

示例堆栈字符串:

ReferenceError: x is not defined
    at repl:1:5
    at REPLServer.self.eval (repl.js:110:21)
    at repl.js:249:20
    at REPLServer.self.eval (repl.js:122:7)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)

堆栈字符串格式(模板):

{type}: {message}
{foreach frames as frame}
{if frame.calledFunction is undefined}
    at {frame.location.path}:{frame.location.line}:{frame.location.column}
{else}
    at {frame.calledFunction} ({frame.location.path}:{frame.location.line}:{frame.location.column})
{/if}
{/foreach}

提取信息(json):

{
    message: "x is not defined",
    type: "ReferenceError",
    frames: [
        {
            location: {
                path: "repl",
                line: 1,
                column: 5
            }
        },
        {
            calledFunction: "REPLServer.self.eval",
            location: {
                path: "repl.js",
                line: 110,
                column: 21
            }
        },
        ...
    ]
}

解析器应该处理堆栈字符串并返回提取的信息。堆栈字符串格式和变量取决于环境,库应该动态地弄清楚如何解析实际环境的堆栈字符串。

我可以通过使用众所周知的堆栈抛出异常来探测实际环境并检查堆栈字符串的差异。例如,如果我在引发异常的行中添加空格缩进,那么列和调用的函数变量可能会发生变化。如果我在某处检测到数字变化,那么我可以确定我们正在谈论的是列变量。我也可以添加换行符,这将导致行号更改等等......

我可以探测每一个重要的变量,但我不能确定实际的字符串不包含额外的未知变量,也不能确定所有已知的变量都会被添加到其中。例如,“A”示例的框架字符串包含未知变量并且不包含列变量,而“B”示例的框架字符串并不总是包含被调用的函数变量。

3个回答

我在 Prolog 中编写了一个相对简单的自适应解析器解析器本质上是一个字符串重写系统,它使用简单的自底向上解析算法从其输入中学习新的重写规则,例如"A implies that B" means "A implies B"、 或。"neither A nor B" means "not (A or B)"

使用它学到的语法规则,解析器能够将英语短语转换C is not less than D percent of E and R implies that Q is not true为 Prolog 术语,例如(C<D/100*E)=false,(R->Q\=true).

除了我在这里描述的解析器之外,还有一个名为dypgen的自适应解析器生成器。还有几种编程语言允许用户定义语法扩展,包括CoqAgda

Nearley解析器生成器还允许在运行时添加语法规则,尽管此功能尚未记录。

人脑从语音流中解析语言单元是一个可以研究的现有系统,它是一个合法的概念证明。工作的大脑会适应音量、音调频率、信息速率、节奏、口音、方言和背景声音的变化,因为它会解析源自前庭蜗神经信号的初始音调和瞬态处理的声音序列。

从源自视神经的信号中识别书面符号的后期演变是一个相关的概念证明。

简单的自适应解析作为社交网络自动化的一部分在实验室中运行,但仅限于有限的符号集和顺序模式。它无需重新配置即可扩展到任意大的基本语言单元、前缀、结尾和后缀,仅受我们的硬件容量和吞吐量的限制。

正则表达式库的存在有助于保持设计简单。我们使用由 DCNN 的各向异性形式提供的 PCRE 版本 8 系列库,从一个窗口中提取特征,该窗口在输入文本中移动,具有可配置的窗口大小和移动增量大小。应用于在第一遍中收集的输入文本统计信息的启发式方法会产生一组假设的 PCRE,它们排列在两层中。

发生优化以在混沌扰动文本搜索中将更高的概率权重应用于最佳 PCRE。它使用与训练中的 NN 反向传播相同的梯度下降收敛策略。这是一种幼稚的方法,它不会做出诸如存在回溯、文件或错误之类的假设。它将同样适用于阿拉伯信息和西班牙信息。

输出是内存中的任意有向图,类似于面向对象数据库的转储。JSON 层次结构对我们的目的过于严格,因为我们从串行文本流中解析的有向图有多个传入有向边到顶点和一些圆形边序列的情况。

قنبلة -> dangereux -> 4anlyss
bomba -> dangereux
ambiguïté -> 4anlyss -> préemption -> قنبلة

尽管强化版本的可重入算法已被淘汰,并且健康信号已经可用,但其他工作抢占了进一步推进自适应解析器或努力将工作用于自然语言的下一步:

将有向图与表示想法的持久有向图过滤器匹配,这将模仿语言理解的想法回忆方面。

对于上述格式,您可以编写一个普通的 CFG 解析器来提取 AST 树。那实际上你想要作为输出?