生成自然语言计算器
下面的例子将创建一个简单的计算器,能够读取以自然语言形式给出的数字,并支持多个相对优先级 (precedence) 不同的插入算符.
使用内置 token "SemanticNumber" 和四个自定义的 token.
In[1]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_113.png)
tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"],
GrammarToken["Multiplicand"], GrammarToken["Addition"],
GrammarToken["Multiplication"]};
一个被加数可以是完整的加法表达式(实现结合律)、完整的乘法表达式或一个数字. 一个被乘数可以是完整的乘法表达式(实现结合律)或一个数字,但不能是一个加法表达式,因为乘法有更高的优先级.
In[2]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_114.png)
defs1 = {"Summand" ->
s : (GrammarToken["Addition"] | GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> s,
"Multiplicand" ->
m : (GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> m};
将 "Addition" token 与加和减相关联,并将 "Multiplication" token 与乘和除相关联. 减和除是不能交换位置的,因此需要使用 FixedOrder 保持各项的前后顺序.
In[3]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_115.png)
defs2 = {
"Addition" ->
FixedOrder[a : GrammarToken["Summand"], "+",
b : GrammarToken["Summand"]] :> a + b,
"Addition" ->
FixedOrder[a : GrammarToken["Summand"], "-",
b : GrammarToken["Summand"]] :> a - b,
"Multiplication" ->
FixedOrder[a : GrammarToken["Multiplicand"], "*",
b : GrammarToken["Multiplicand"]] :> a*b,
"Multiplication" ->
FixedOrder[a : GrammarToken["Multiplicand"], "/",
b : GrammarToken["Multiplicand"]] :> a/b};
将 GrammarRules 对象部署到 Wolfram Cloud.
In[4]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_116.png)
calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
对一些含有自然语言的算数输入进行计算.
In[5]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_117.png)
GrammarApply[calc, "one + one"]
Out[5]=
![](assets.zh/create-a-natural-language-calculator/O_75.png)
In[6]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_118.png)
GrammarApply[calc, "one + two + three"]
Out[6]=
![](assets.zh/create-a-natural-language-calculator/O_76.png)
In[7]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_119.png)
GrammarApply[calc, "five + seventeen * ten"]
Out[7]=
![](assets.zh/create-a-natural-language-calculator/O_77.png)
In[8]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_120.png)
GrammarApply[calc, "one hundred - one hundredth"]
Out[8]=
![](assets.zh/create-a-natural-language-calculator/O_78.png)
In[9]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_121.png)
GrammarApply[calc, "zero + one/forty-five"]
Out[9]=
![](assets.zh/create-a-natural-language-calculator/O_79.png)
In[10]:=
![Click for copyable input](assets.zh/create-a-natural-language-calculator/In_122.png)
GrammarApply[calc, "one/forty-five - one"]
Out[10]=
![](assets.zh/create-a-natural-language-calculator/O_80.png)