Tokenizer和javascript中的匹配器

时间:2014-01-22 12:07:52

标签: javascript regex parsing text-parsing sentence

我开始想要编写一个非常简单的自然语言解析器和匹配模式。我想在JavaScript中这样做。我差不多20年前在人工智能方面获得了学位,我记得prolog,lisp,eliza,recursion,Noun和Verb Phrases ...有点新鲜,我会很好。

几天后,我意识到了两件事。

  • 我并没有真正追求NLP,只是句子标记
  • 这比我想象的要难得多。

我在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

所以我的问题:

有没有人知道我正在做的事情有什么好的资源,或者可以帮助进行递归和树遍历

修改

原来它是类固醇的反向波兰表示法计算器。我已经做了很多繁重的工作,只要一个令牌只匹配一个单词,这个就能很好地工作,但现在我又被卡住了。

http://jsfiddle.net/54jCq/

通过引用传递似乎是非常辛苦的工作。我现在需要扩展令牌部分以使用多个单词标记,这样我就可以使用与上面相同的表示法但得到my [mobile phone] is not [ringing]

我原本以为我可以从树中弹出令牌分支,然后再次将单词列表传递给自己,新树包含RPN函数和树的其余部分(弹出令牌)直到匹配(在这种情况下,你弹出的所有单词(如果有的话)都是令牌,你为这个分支完成了)或者我们用完了单词(在这种情况下,所有的单词都是这个分支的标记。

如果你开始没有弹出一个单词,你应该能够匹配0-n个单词,但我无法使其正常工作。

在我看来这很容易:)

有人可以看一看,看看他们是否可以解决这个问题。

1 个答案:

答案 0 :(得分:-1)

正则表达式是一种标记化的好方法 - 我将使用的字符串是:/(\ w +)\ W / g

在此测试以查看 - http://regex101.com/