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.
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.
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.
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.
calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
Calcule alguns inputs aritméticos que contenham liguagem natural.
GrammarApply[calc, "one + one"]
GrammarApply[calc, "one + two + three"]
GrammarApply[calc, "five + seventeen * ten"]
GrammarApply[calc, "one hundred - one hundredth"]
GrammarApply[calc, "zero + one/forty-five"]
GrammarApply[calc, "one/forty-five - one"]