python的bridge(bridge是一个轻量级的可移植自然语言处理库)
pybridge的Python项目详细描述
什么是桥?
bridge是一个用于自然语言处理的轻量级可移植库,由于它的体积很小,可以很容易地移植到任何编程语言中。到目前为止,bridge在50个sloc中提供了一个python库,在78个sloc中提供了一个javascript库。
桥是怎么工作的?
与其他研究语言语法特征的自然语言处理方法不同,bridge的目标是结构化的意义。bridge知道文本中有意义的部分,而不是通过语法检查来提取意义,而是从字面上理解句子。
带桥接器的示例程序
最好用一个例子来说明bridge的威力,这样我们就可以用bridge构造一个简单的计算器了!
首先我们应该构造一个桥对象:
Bridge = bridge();
现在,让我们将我们的意义模型添加到bridge中。首先,我们要教它什么是数字。我们将使用一个语法对象来教bridge一个新概念。每个语法都有一个或多个“type”或“role”,例如我们的数字有role“number”。另外,我们需要一些定义来创建语法。每个定义或模型都应该有一个单独的“类型”和一个regex模式来测试传递给它的原子。每个语法都有一个“值”,bridge使用它来创建生成的原子。最后,每个语法都有一个“权重”来表示语法的重要性。
当第一座桥检查一个句子时,它把句子分解成原子。每个原子在bridge中显示一个有意义的词性,在第一次检查时bridge给所有原子一个“word”类型。
我们将按如下方式教授数字模型:
Bridge.add_grammar( grammar( ['number'], # grammar type [definition( # definitions 'word', # type of atom to accept r'^\d+$')], # regex to match atoms against '{0}', # grammar value 0)); # weight
现在让我们教它基本的数学运算:
Bridge.add_grammar(grammar(['plus'], [definition('word', r'^\+$')], '{0}', 0)) # plus Bridge.add_grammar(grammar(['minus'], [definition('word', r'^-$')], '{0}', 0)) # minus
现在我们将教授数学运算,并使用我们已经定义的模型:
Bridge.add_grammar( grammar(['plus-command', 'number'], [definition('number', r'.*'), definition('plus', r'.*'), definition('number', r'.*')], '(+ {0} {2})', 1)); Bridge.add_grammar( grammar(['minus-command', 'number'], [definition('number', r'.*'), definition('minus', r'.*'), definition('number', r'.*')], '(- {2} {0})', 1));
现在bridge可以做简单的数学运算,现在它可以这样做:
1 - 2 + 3 - 4 + 5
并将其转换为以下lisp代码:
(+ (- 4 (+ (- 2 1) 3)) 5)
(您可以使用hy运行这个lisp)是时候教bridge一些自然语言了:
Bridge.add_grammar( grammar (['and'], [definition('word', r'^and$')], '{0}', 0)); Bridge.add_grammar( grammar( ['numeral-and', 'number'], [definition('number', r'.*'), definition('and', r'.*'), definition('number', r'.*')], '{0} {2}', 2)); Bridge.add_grammar( grammar (['sum-command'], [definition('word', r'^sum$')], '{0}', 0)); Bridge.add_grammar( grammar( ['complete-function'], [definition('sum-command', r'.*'), definition('numeral-and', r'.*')], '(+ {1})', 3))
使用以下代码:
sentence = "sum 3 + 4 and 5 and 6 - 7 and 4" print(Bridge.process(sentence)[0].value))
我们会得到:
(+ (+ 3 4) 5 (- 7 6) 4)