1

我处于需要编写大量解析规则的位置(换句话说,一个将字符串转换为另一个字符串或结构化数据的函数),虽然我认为我会为此使用 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. 有哪些工具(库)或逻辑(请使用伪代码!)非常适合此类问题,或者只是说明其性质?
4

1 回答 1

0

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

我会搜索诸如“blue”、“triangle”、“scratch”等代码词,并使用条件逻辑让你的程序做正确的事情。像这样的伪代码:

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 的经验几乎为零,但通过阅读《七周内的七种语言》一书,我对它有所了解。)

于 2014-04-22T21:29:48.497 回答