Cree una calculadora de lenguaje natural
Este ejemplo construye una simple calculadora que toma números en lenguaje natural y da soporte a varios operadores infijos de distinta precedencia relativa.
Use la forma de muestra incorporada "SemanticNumber" y cuatro muestras más personalizadas.
tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"],
GrammarToken["Multiplicand"], GrammarToken["Addition"],
GrammarToken["Multiplication"]};
Un sumando puede ser una expresión de suma completa (para implementar asociatividad), una expresión de multiplicación completa o un número. Un multiplicando puede ser una expresión de multiplicación completa (de nuevo para implementar asociatividad) o un número, pero no una expresión de suma, la cual asigna mayor prioridad a la multiplicación.
defs1 = {"Summand" ->
s : (GrammarToken["Addition"] | GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> s,
"Multiplicand" ->
m : (GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> m};
Asocie la muestra de "Addition" a sumas y restas, y la muestra de "Multiplication" a productos y divisiones. Las restas y divisiones no son conmutativas, por lo tanto usted necesita mantener el orden de los términos 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 el objeto GrammarRules en Wolfram Cloud.
calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
Evalúe algunas entradas aritméticas que contenga lenguaje 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"]