Создание калькулятора естественного языка
Данный пример демонстрирует создание простого калькулятора, который работает с числами в естественном языке и поддерживает несколько инфиксных операторов различных относительных предшествований.
Используйте встроенную форму лексемы "SemanticNumber" и четыре другие собственные лексемы.
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_113.png)
tokens = {GrammarToken["SemanticNumber"], GrammarToken["Summand"],
GrammarToken["Multiplicand"], GrammarToken["Addition"],
GrammarToken["Multiplication"]};
Слагаемое может быть полным выражением сложения (для внедрения ассоциативности), полным выражением умножения или числом. Множитель может быть полным выражением умножения (также для внедрения ассоциативности) или числом, но не выражением сложения, что присваивает умножению более высокий статус.
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_114.png)
defs1 = {"Summand" ->
s : (GrammarToken["Addition"] | GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> s,
"Multiplicand" ->
m : (GrammarToken["Multiplication"] |
GrammarToken["SemanticNumber"]) :> m};
Создайте ассоциацию лексемы "Addition" с суммами и остатками, а лексему "Multiplication" - с произведениями и делениями. Остатки и деления не являются коммутативными, поэтому Вам следует сохранять порядок членов при помощи FixedOrder.
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_115.png)
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.
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_116.png)
calc = CloudDeploy[GrammarRules[tokens, Join[defs1, defs2]]];
Оцените некоторые арифметические вводы, содержащие естественный язык.
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_117.png)
GrammarApply[calc, "one + one"]
![](assets.ru/create-a-natural-language-calculator/O_75.png)
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_118.png)
GrammarApply[calc, "one + two + three"]
![](assets.ru/create-a-natural-language-calculator/O_76.png)
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_119.png)
GrammarApply[calc, "five + seventeen * ten"]
![](assets.ru/create-a-natural-language-calculator/O_77.png)
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_120.png)
GrammarApply[calc, "one hundred - one hundredth"]
![](assets.ru/create-a-natural-language-calculator/O_78.png)
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_121.png)
GrammarApply[calc, "zero + one/forty-five"]
![](assets.ru/create-a-natural-language-calculator/O_79.png)
![Click for copyable input](assets.ru/create-a-natural-language-calculator/In_122.png)
GrammarApply[calc, "one/forty-five - one"]
![](assets.ru/create-a-natural-language-calculator/O_80.png)