我处于需要编写大量解析规则的位置(换句话说,将字符串转换为另一个字符串或结构化数据的函数),而我想我会使用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"
正如您所看到的,我想提供数百个示例句子,每个句子都配有正确的解析,并让计算机编写必要的函数来解析遵循该模式的所有句子。
有点难以理解这一点,所以我要问所有的黑客:
答案 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了解了一点。)