Zennoposter и Yandex Спеллер (проверка орфографии)

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
Приветствую!

Задача:
Необходимо текст находящийся в переменной проверить на орфографию в сервисе Yandex Спеллер. На основе Спеллера есть сайт в теории можно на вестись через xPath и потом сравнить два результата.
Но имеется открытое API без регистрации и получения ключей.

Для наглядности хочу записать в таблицу, типо:
С ошибкамиБез ошибок (Спеллер)
1Превет, довай пойдем гулять сигодняПривет, давай пойдем гулять сегодня

P.S.: Хочу научиться выделять исправленные слова, как показано в таблице.

Проблема: Я учусь - глубоких познаний в C# не имею, но со справкой что-то костыльное своять могу. Проект не коммерческий, учебный. Хочется сделать через API, однако не знаю с чего начать.

Я научился получать xml в переменную:
HttpGet в переменную text:
string strText = "Превет, довай пойдем гулять сигодня";
string url = "https://speller.yandex.net/services/spellservice/checkTexts?text=" + strText;
string encoding = "UTF-8";

string text = ZennoPoster.HttpGet(url, "", encoding, ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);

return text;
Сервер Яши в ответ дает такой xml:
Ответ сполера:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSpellResult>
    <SpellResult>
        <error code="1" pos="0" row="0" col="0" len="6">
            <word>Превет</word>
            <s>Привет</s>
            <s>Превет</s>
            <s>Превед</s>
        </error>
        <error code="1" pos="8" row="0" col="8" len="5">
            <word>довай</word>
            <s>давай</s>
        </error>
        <error code="1" pos="28" row="0" col="28" len="7">
            <word>сигодня</word>
            <s>сегодня</s>
        </error>
    </SpellResult>
</ArrayOfSpellResult>
Получается, что ошибки Спеллер исправляет надлежащим образом.

Мои мысли: Вообще на самом деле, я встал на ручник.
Ход мысли такой: я хочу строку разобрать на слова и добавить в массив, чтобы была возможность его перебирать через цикл и сравнивать. Форматирование текста 2 этап, я думаю в цикле будет уместно сделать - если это вообще возможно, в чем я тоже не уверен :-) .
Но не могу понять, как взять элемент в xml, проблема нацелиться, как на xPath.
Вообщем не знаю, как взять <wok> и <s> отдельно, чтобы была возможность для дальнейших манипуляций.

Вот такой затык.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 621
Благодарностей
4 607
Баллы
113
там указана позиция ошибки. массив не нужен
 
  • Спасибо
Реакции: bigloafer

doc

Client
Регистрация
30.03.2012
Сообщения
8 621
Благодарностей
4 607
Баллы
113

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
C#:
string strXml = project.Variables["xmlResultAPI"].Value;
strXml = strXml.SelectNodes("//ArrayOfSpellResult/SpellResult/");
project.Xml.FromString(strXml);


for(int i = 0; i <= project.Xml.ArrayOfSpellResult.SpellResult.error.Count; i++) {
    
}
А как теперь применить xPath, чтобы сократить длину переменных с "ArrayOfSpellResult.SpellResult.error.Count" до "error.Count"?
SelectNodes("//ArrayOfSpellResult/SpellResult/"); - не помогает.
Какой метод надо применить во 2 строке, после strXml?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 621
Благодарностей
4 607
Баллы
113
C#:
string strXml = project.Variables["xmlResultAPI"].Value;
strXml = strXml.SelectNodes("//ArrayOfSpellResult/SpellResult/");
project.Xml.FromString(strXml);


for(int i = 0; i <= project.Xml.ArrayOfSpellResult.SpellResult.error.Count; i++) {
   
}
А как теперь применить xPath, чтобы сократить длину переменных с "ArrayOfSpellResult.SpellResult.error.Count" до "error.Count"?
SelectNodes("//ArrayOfSpellResult/SpellResult/"); - не помогает.
Какой метод надо применить во 2 строке, после strXml?
я не знаю, как работать зенновскими методами с xml. И, честно говоря, я не уверен, что вышенаписанный код в принципе работает.
Вот пример получения атрибута len нулевого еррора в твоём xml

C#:
string strXml = project.Variables["xmlResultAPI"].Value;

XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);

var nodes = doc.SelectNodes("ArrayOfSpellResult/SpellResult/error");

return nodes[0].Attributes.GetNamedItem("len").Value;
В проект нужно добавить "Ссылки из GAC" и там выбрать XML
62633


В проект нужно добавить "Директивы using ..." И там в using прописать using System.Xml;
62634
 
  • Спасибо
Реакции: bigloafer
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
Из примера, каждый раз, правильный ответ находится по адресу:
//ArrayOfSpellResult/SpellResult/error/s[1]

но для начала, нужно взять общее кол-во ошибок: //ArrayOfSpellResult/SpellResult/error/
далее, нужно разобрать каждую часть массива по отдельности, разложить в список или ассоциативный массив или просто массив: bad - /word и good - /s[1].

а далее перебор исходного текста и замена.
 
  • Спасибо
Реакции: bigloafer

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
далее, нужно разобрать каждую часть массива по отдельности, разложить в список или ассоциативный массив или просто массив: bad - /word и good - /s[1].
Я думаю, что массив уже создан, или я неправильно думаю?
2020-09-01_13-48-46.png

И, честно говоря, я не уверен, что вышенаписанный код в принципе работает.
Он работает.

Есть стандартный кубик: "Обработка JSON/XML" - там есть возможность из коробки применить XPath.
Фактически код приведенный ниже, заменяет этот кубик "Обработка JSON/XML", значит должен быть метод, который применит xPath средства из коробки.
C#:
project.Xml.FromString(project.Variables["xmlResultAPI"].Value);
Просто справка для меня не понятна по этому вопросу, и метод я там найти не смог, может я не умею правильно искать.

С ошибкой можно перебрать так массив получается:
2020-09-01_14-33-16.png

Ошибка возникает из-за последнего индекса project.Xml.ArrayOfSpellResult.SpellResult.error.s[0] - я думаю, просто что-то намудрил.
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
я не знаю, как работать зенновскими методами с xml. И, честно говоря, я не уверен, что вышенаписанный код в принципе работает.
Вот пример получения атрибута len нулевого еррора в твоём xml

C#:
string strXml = project.Variables["xmlResultAPI"].Value;

XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);

var nodes = doc.SelectNodes("ArrayOfSpellResult/SpellResult/error");

return nodes[0].Attributes.GetNamedItem("len").Value;
В проект нужно добавить "Ссылки из GAC" и там выбрать XML


В проект нужно добавить "Директивы using ..." И там в using прописать using System.Xml;
Метод не из коробки тоже выдает ошибку:
2020-09-01_20-20-46.png
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 621
Благодарностей
4 607
Баллы
113
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
Я думаю, что массив уже создан, или я неправильно думаю?
Посмотреть вложение 62646


Он работает.

Есть стандартный кубик: "Обработка JSON/XML" - там есть возможность из коробки применить XPath.
Фактически код приведенный ниже, заменяет этот кубик "Обработка JSON/XML", значит должен быть метод, который применит xPath средства из коробки.
C#:
project.Xml.FromString(project.Variables["xmlResultAPI"].Value);
Просто справка для меня не понятна по этому вопросу, и метод я там найти не смог, может я не умею правильно искать.

С ошибкой можно перебрать так массив получается:
Посмотреть вложение 62651

Ошибка возникает из-за последнего индекса project.Xml.ArrayOfSpellResult.SpellResult.error.s[0] - я думаю, просто что-то намудрил.
Честно не знаю, как таким пользоваться, но, вот решение на C#, о котором говорил

Проверить орфографию с помощью Яндекс.Спеллер
C#:
//1. Проверить орфографию
string strText = "Превет, довай пойдем гулять сигодня";
string url = "https://speller.yandex.net/services/spellservice/checkTexts?text=" + strText;
string response = ZennoPoster.HttpGet(url);

//2. Составить словарь
var dict = new Dictionary<string, string>();
var doc = new System.Xml.XmlDocument();
doc.LoadXml(response);
var errors = doc.SelectNodes("ArrayOfSpellResult/SpellResult/error");
//return errors.Count;

string word = "", s = "";
foreach (XmlNode error in errors)
{
    word = error.SelectSingleNode("word").InnerText;
    s = error.SelectSingleNode("s").InnerText;
    dict.Add(word, s);
    //return string.Format("Ошибка: {0}; Вариант исправления: {1};", word, s);
}

//3. Исправить ошибку
for (int i = 0; i < dict.Count; i++)
    strText = strText.Replace(dict.ElementAt(i).Key, dict.ElementAt(i).Value);

return strText;
Примечание:
Обязательно включить в проект System.Xml
 
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)