Crie uma calculadora de linguagem natural
Este exemplo cria uma calculadora simples que aceita números em linguagem natural e dá suporte a vários operadores infixos de precedências relativas diferentes.
Use a forma de elemento incorporado "SemanticNumber" e mais quatro elementos personalizados.
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_113.png)
tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"],
GrammarToken["Multiplicand"], GrammarToken["Addition"],
GrammarToken["Multiplication"]};
Um somando pode ser uma expressão de soma completa (para implementar associatividade), uma expressão de multiplicação completa, ou um número. Um fator (ou mutiplicando) pode ser uma expressão de multiplicação completa (novamente para implementar associatividade) ou um número, mas não uma expressão de adição, que atribui maior prioridade à multiplicação.
![Click for copyable input](assets.pt-br/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};
Associe o elemento "Addition" a somas e restos, e o elemento "Multiplication" para produtos e divisões. Restos e divisões não são comutativos, você precisa manater a ordem dos termos usando FixedOrder.
![Click for copyable input](assets.pt-br/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};
Implemente o objeto GrammarRules na Wolfram Cloud.
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_116.png)
calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
Calcule alguns inputs aritméticos que contenham liguagem natural.
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_117.png)
GrammarApply[calc, "one + one"]
![](assets.pt-br/create-a-natural-language-calculator/O_75.png)
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_118.png)
GrammarApply[calc, "one + two + three"]
![](assets.pt-br/create-a-natural-language-calculator/O_76.png)
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_119.png)
GrammarApply[calc, "five + seventeen * ten"]
![](assets.pt-br/create-a-natural-language-calculator/O_77.png)
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_120.png)
GrammarApply[calc, "one hundred - one hundredth"]
![](assets.pt-br/create-a-natural-language-calculator/O_78.png)
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_121.png)
GrammarApply[calc, "zero + one/forty-five"]
![](assets.pt-br/create-a-natural-language-calculator/O_79.png)
![Click for copyable input](assets.pt-br/create-a-natural-language-calculator/In_122.png)
GrammarApply[calc, "one/forty-five - one"]
![](assets.pt-br/create-a-natural-language-calculator/O_80.png)