Введение
В комментарии к моей прошлой статье меня спросили о возможности подключения сервиса Wolfram Alpha к проекту из Visual Studio. В этой статье я рассмотрю, как подключиться из консольного приложения. Я также рассмотрю, как это сделать из приложения MVC. Эта статья является простым примером и ни в коем случае не единственным способом его реализации. Давайте посмотрим на этот процесс.
Задний план
Прежде всего, давайте рассмотрим, что такое Wolfram Alpha. Wolfram Alpha — это база знаний и набор вычислительных алгоритмов, система вопросов и ответов. Запущен 15 мая 2009 года, это не поисковая система. Доступ к нему организован на одноименном сайте. Его оценили и внедрили в свою повседневную жизнь школьники, студенты, журналисты и ученые всего мира. Более того, Wolfram Alpha понимает не обычную речь, а формализованные команды, синтаксически идентичные естественному человеческому языку. Поэтому для эффективного использования этой системы необходимо иметь небольшую теоретическую подготовку. Вы можете испытать это чудо на себе, заставив инструмент работать на вас — пустая строка поиска на его главной странице хранит неограниченные возможности.
Использование кода
Для реализации интеграции в первую очередь необходимо зарегистрироваться, чтобы получить Wolfram Alpha API. Это можно сделать по ссылке: https://products.wolframalpha.com/api/. Нажав Получить доступ к API, вам необходимо войти в свою учетную запись или создать новую учетную запись. Все действия в бесплатной версии предназначены только для некоммерческого использования. Имеет ограниченное количество запросов к Wolfram Alpha. После этого вы сможете получить API ID. На изображении 1 показана учетная запись пользователя Wolfram Alpha.
Изображение 1 — Аккаунт пользователя Wolfram Alpha
Нажав кнопку ПОЛУЧИТЬ ПРИЛОЖЕНИЕ, вам будет предложено ввести имя приложения и описание для вашего проекта (изображение 2).
Изображение 2 — Получение нового AppID
После этого он будет отображаться в учетной записи пользователя. Вы можете увидеть идентификатор, нажав «Изменить».
Давайте рассмотрим создание консольного приложения. Прежде всего, создайте базовое консольное приложение и перейдите к управлению пакетами nuget (изображение 3).
Изображение 3. Начало управления пакетами NuGet
Найдите «Wolfram
» в строке поиска и установите его (Изображение 4).
Изображение 4 — Установите «Вольфрам»
Добавьте код в проект:
using Wolfram.Alpha; using Wolfram.Alpha.Models;
Затем добавьте string
к переменной типа и создайте новый экземпляр класса.
private static string APIKey = "YOUR CODE FROM WOLFAM APLHA PROTAL; private static WolframAlphaService WService = new WolframAlphaService(apiKey);
Мы будем использовать асимметричные методы. Давайте изменим основную функцию и сделаем ее Task
.
static async Task Main(string[] args)
Далее объявим переменную с типом string
и создадим чтение с клавиатуры. Затем создайте экземпляр класса WolframAlphaRequest
, поместите текст нашего запроса и отправьте запрос в Wolfram Alpha, следуя коду:
string text; text = Console.ReadLine(); WolframAlphaRequest request = new WolframAlphaRequest(text); WolframAlphaResult result = await service.Compute(request);
После ответа на запрос нам нужно проанализировать результат нашего запроса. Мы сделаем это, используя цикл foreach
. Wolfram Alpha использует систему pods в своем ответе. Более подробно вы можете прочитать в Справочнике по API веб-сервиса Wolfram Alpha или в разделе документации API вашего личного кабинета. Для распознавания используем следующий код:
foreach (var Pod in result.QueryResult.Pods) { if (Pod.SubPods != null) { Console.WriteLine(Pod.Title); foreach (var SubPod in Pod.SubPods) { Console.WriteLine(" " + SubPod.Plaintext); } } }
Мы просто перебираем каждый полученный POD и, если у пода есть подпод, то заходим в него вторым циклом.
Теперь давайте посмотрим на пример нашего приложения. Например, напишите «Steve Jobs
» во входных данных (Изображение 5).
Изображение 5 — Запрос на Wolfram Alpha
После выполнения у нас будет следующий результат на изображении 6.
Изображение 6 — Результат для Wolfram Alpha
Для сравнения сделаем тот же запрос на сайте и получим такой же результат на изображении 7.
Изображение 7 — Результат с веб-сайта Wolfram Alpha
Как видно на картинке, мы получили тот же результат, что и на сайте, но в консольном приложении у нас не может быть картинок.
Рассмотрим пример работы в MVC.
Оно не сильно отличается от консольного приложения. Также добавьте пакет nuget, как в консольном приложении. Но для запроса мы используем модель. Добавьте в модель следующий класс:
public class Requiests { [Required] [Display(Name = " Request")] public string Request { get; set; } public string Result { get; set; } }
Поле Request
используется для запроса, а поле Result
— для результата.
Добавьте действие контроллера Index в HomeController
и добавьте для него View
.
Он будет использовать следующий код:
@model webappwolram.Models.Requests @{ ViewBag.Title = "Wolfam"; } <h2>Request</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Requiests</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Request, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Request, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor (model => model.Request, "", new { @class = "text-danger" }) </div> </div> *<div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Add" class="btn btn-default" /> </div> </div> </div> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
Для нашего примера мы будем отправлять модель в качестве параметра в контроллере, и если модель действительна, мы будем использовать перенаправление действия. Мы поставим этот метод как в консольном приложении как Task
, так как нам нужны асинхронные методы. Добавим следующий код:
public async Task <ActionResult> Add(Requests model) { await Req(model); return View("Result", model); }
Затем добавьте реализацию Task
:
public async Task Req(Models.Requests model) { model.Result = ""; WolframAlphaRequest request = new WolframAlphaRequest(model.Request); WolframAlphaResult result = await service.Compute(request); foreach (var Pod in result.QueryResult.Pods) { if (Pod.SubPods != null) { model.Result = model.Result + Pod.Title+ "\n"; // Console.WriteLine(pod.Title); foreach (var SubPod in Pod.SubPods) { model.Result = model.Result + " " + SubPod.Plaintext+"\n"; } } } }
Вид для результата будет:
@model webappwolram.Models.Requests @{ ViewBag.Title = "Finally"; } <h2>Results</h2> <h4>Result</h4> <div> @Html.TextAreaFor(model => model.Result, htmlAttributes: new { style = "height: 670px; margin: 0px; width: 670px;" }) </div>
Введите тот же запрос (Стив Джобс), и мы получим результат (Изображение 8):
Изображение 8 — Результат Wolfram Alpha
Как видите, результат тот же, что и в консольном приложении.
Я не показывал, как добавлять изображения из запроса, потому что думаю, что его там нет.
В заключение, Wolfram Alpha идеально подходит для вычислений, которые слишком сложны для калькулятора Google и многих других компьютерных веб-сайтов.
История
- 4 октября 2020 г.: Первоначальная версия