Язык Wolfram Language

Обработка текста и языка

Создание калькулятора естественного языка

Данный пример демонстрирует создание простого калькулятора, который работает с числами в естественном языке и поддерживает несколько инфиксных операторов различных относительных предшествований.

Используйте встроенную форму лексемы "SemanticNumber" и четыре другие собственные лексемы.

In[1]:=
Click for copyable input
tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"], GrammarToken["Multiplicand"], GrammarToken["Addition"], GrammarToken["Multiplication"]};

Слагаемое может быть полным выражением сложения (для внедрения ассоциативности), полным выражением умножения или числом. Множитель может быть полным выражением умножения (также для внедрения ассоциативности) или числом, но не выражением сложения, что присваивает умножению более высокий статус.

In[2]:=
Click for copyable input
defs1 = {"Summand" -> s : (GrammarToken["Addition"] | GrammarToken["Multiplication"] | GrammarToken["SemanticNumber"]) :> s, "Multiplicand" -> m : (GrammarToken["Multiplication"] | GrammarToken["SemanticNumber"]) :> m};

Создайте ассоциацию лексемы "Addition" с суммами и остатками, а лексему "Multiplication" - с произведениями и делениями. Остатки и деления не являются коммутативными, поэтому Вам следует сохранять порядок членов при помощи 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};

Разверните объект GrammarRules в облаке Wolfram Cloud.

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

Оцените некоторые арифметические вводы, содержащие естественный язык.

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

Родственные примеры

de en es fr ja ko pt-br zh