Wolfram Language

Processamento de texto e linguagem

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.

In[1]:=
Click for copyable input
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.

In[2]:=
Click for copyable input
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.

In[3]:=
Click for copyable input
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.

In[4]:=
Click for copyable input
calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];

Calcule alguns inputs aritméticos que contenham liguagem natural.

In[5]:=
Click for copyable input
GrammarApply[calc, "one + one"]
Out[5]=
In[6]:=
Click for copyable input
GrammarApply[calc, "one + two + three"]
Out[6]=
In[7]:=
Click for copyable input
GrammarApply[calc, "five + seventeen * ten"]
Out[7]=
In[8]:=
Click for copyable input
GrammarApply[calc, "one hundred - one hundredth"]
Out[8]=
In[9]:=
Click for copyable input
GrammarApply[calc, "zero + one/forty-five"]
Out[9]=
In[10]:=
Click for copyable input
GrammarApply[calc, "one/forty-five - one"]
Out[10]=

Exemplos Relacionados

de en es fr ja ko ru zh