Введение

В комментарии к моей прошлой статье меня спросили о возможности подключения сервиса 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 г.: Первоначальная версия