我开始想要编写一个非常简单的自然语言解析器和匹配模式。我想在JavaScript中这样做。我差不多20年前在人工智能方面获得了学位,我记得prolog,lisp,eliza,recursion,Noun和Verb Phrases ...有点新鲜,我会很好。
几天后,我意识到了两件事。
我在interweb上找到了一些资源,一些用于节点,一些用于python等,但是它们似乎与我所追求的相反,例如它们模板化并填充空白,或者你生成一个模型和然后用自然语言查询。
我希望能够检查用户输入的内容,看它是否与特定模式匹配并提取相关位。例如,这是一个简单的匹配树:
var match = [ "&&",
["||", "my", "the" ],
"%%item",
[ "||",
[ "&&", "isnt", "%%what" ],
[ "&&", "is"
[ "||",
"broken?",
["&&", "not", "%%what"]
]
],
[ "&&",
[ "||",
"doesnt",
[ "&&", "does", "not" ]
],
"%%what"
]
]
];
所以我希望这能匹配用户输入的内容,如:
并返回我想从上面提取的关键短语数组:
[ {"item": "computer", "what": "work"} ]
[ {"item": "keyboard", "what": "working"} ]
[ {"item": "latch"} ]
[ {"item": "printer", "what": "printing"} ]
所以我考虑了树遍历,但后来陷入了javascript以及如何做到这一点。最简单但最不优雅的方法是从匹配中生成每个可能的字符串,并与输入进行比较,这也可以让我像items
一样陷入mobile phone
。
所以我的问题:
有没有人知道我正在做的事情有什么好的资源,或者可以帮助进行递归和树遍历
原来它是类固醇的反向波兰表示法计算器。我已经做了很多繁重的工作,只要一个令牌只匹配一个单词,这个就能很好地工作,但现在我又被卡住了。
通过引用传递似乎是非常辛苦的工作。我现在需要扩展令牌部分以使用多个单词标记,这样我就可以使用与上面相同的表示法但得到my [mobile phone] is not [ringing]
我原本以为我可以从树中弹出令牌分支,然后再次将单词列表传递给自己,新树包含RPN函数和树的其余部分(弹出令牌)直到匹配(在这种情况下,你弹出的所有单词(如果有的话)都是令牌,你为这个分支完成了)或者我们用完了单词(在这种情况下,所有的单词都是这个分支的标记。
如果你开始没有弹出一个单词,你应该能够匹配0-n个单词,但我无法使其正常工作。
在我看来这很容易:)
有人可以看一看,看看他们是否可以解决这个问题。