通过训练示例解析字符串

时间:2014-03-29 19:01:44

标签: regex parsing bayesian peg

我处于需要编写大量解析规则的位置(换句话说,将字符串转换为另一个字符串或结构化数据的函数),而我想我会使用PEG这样,通过提供一个示例句子列表及其正确的解析,这将是更容易或更简单的写作,这在我的脑海中似乎技术上是微不足道的,但我很困惑。

我玩过PEGjs(解析表达式语法工具)和正则表达式。看来,就我的目的而言,需求非常基本,远远低于PEG和正则表达式所提供的所有功能。

以下是我要解析的一个示例:

"I want a red square" -> "make a red square"
"Give me a red square!" -> "make a red square"
"If you please, sir, a blue triangle." -> "make a blue triangle"
"Scratch that." -> "delete last shape"

正如您所看到的,我想提供数百个示例句子,每个句子都配有正确的解析,并让计算机编写必要的函数来解析遵循该模式的所有句子。

有点难以理解这一点,所以我要问所有的黑客:

  1. 如果我只提供输入句子的许多不同变体,那么只需要非常简单的逻辑(即没有机器学习,没有PEG,没有正则表达式),这是不是真的?
  2. 一些机器学习设施(贝叶斯?)能否成为一项简单的任务? (在我的应用程序中,我不需要100%确定性来解析句子;歧义是可以的,特别是如果我可以提出这种歧义让用户解决)
  3. 哪些工具(库)或逻辑(假代码,请!)非常适合这类问题,或只是说明其性质?

1 个答案:

答案 0 :(得分:0)

我认为这个讨论的范围可能有点过头了,因为我对机器学习知之甚少,但你考虑过简化你的问题并提出一系列简单的规则,然后将它们翻译成代码?

我会搜索代码字,例如" blue," "三角形," "从头"等,并使用条件逻辑让你的程序做正确的事情。像这样的伪代码:

words = split input

if words contains "scratch", "delete", "never mind", etc.:
  delete last shape; exit

if words contains
  "red": color = :red
  "blue": color = :blue
  "triangle": shape = :triangle
  "square": shape = :square

if shape is undefined and color == :red
  error "red what?"; exit

if shape is undefined and color == :blue
  error "blue what?"; exit

if color is undefined and shape == :triangle
  error "what color triangle?"; exit

if color is undefined and shape == :square
  error "what color square?"; exit

if both color and shape are defined:
  add [color, shape] to shapes

如果这看起来过于冗长(特别是如果您计划添加大量颜色和形状),您可以考虑使用元编程让您的程序以算法编写所有规则。像Clojure或Ruby这样的语言会擅长这种事情。

关键是你的AI并不一定需要理解英语语法;它只需要能够使用正则表达式找到关键词,这是一项微不足道的任务。

您也可以考虑学习Prolog - 如果您想采用声明性编程方法,它是一种理想的语言,这正是您所描述的。我们的想法是,不是自己编写所有的实现细节,而是基本上编写一堆示例案例及其预期结果,Prolog编译器推断出如何处理其他案例。 (免责声明:我对Prolog的经验几乎为零,但我通过阅读本书Seven Languages in Seven Weeks了解了一点。)