Créez un calculateur de langage naturel
Cet exemple construit une calculateur simple qui prend des nombres en langage naturel et prend en charge plusieurs opérateurs infixes de différente priorité relative.
Utilisez la forme d'unité intégrée "SemanticNumber" et quatre unités supplémentaires personnalisées.

tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"],
GrammarToken["Multiplicand"], GrammarToken["Addition"],
GrammarToken["Multiplication"]};
Une opérande de somme peut être une expression de somme complète (pour mettre en œuvre l'associativité), une expression de multiplication complète, ou un nombre. Un multiplicande peut être une expression de multiplication complète (encore une fois pour mettre en œuvre l'associativité) ou un nombre, mais non une expression de somme, qui attribue une priorité plus élevée à la multiplication.

defs1 = {"Summand" ->
s : (GrammarToken["Addition"] | GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> s,
"Multiplicand" ->
m : (GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> m};
Associez l'unité "Addition" à des sommes et des restes, et l'unité "Multiplication" aux produits et aux divisions. Les restes et les divisions ne sont pas commutatives, et donc vous devez garder l'ordre des termes en utilisant 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};
Déployez l'objet GrammarRules en Wolfram Cloud.

calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
Évaluez certaines entrées arithmétiques contenant du langage naturel.

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"]
