Pull to refresh

Comments 16

на сколько я вижу это не настоящее расстояние Домерау-Левенштейна, а Optimal String Alignment; настоящий DL алгоритм разрешает повторное редактирование подстрок, в то время как OSA не может этого делать, там же в педивикии есть пример

приведенный алгоритм дла «CA» и «ABC» выдает 3, а нужно 2

Данный алгоритм не учитывает транспозиционные ошибки, которыми являются 80% при наборе текста (данные с википедии).


тут вы тоже не правы, Дамерау в статье выдвигает гипотезу, что 80% всех типов опечаток входит в множество из 4 типов {удаление, вставка, замена, перестановка соседних}
приведенный алгоритм дла «CA» и «ABC» выдает 3, а нужно 2

Да, вы правы. Кроме того, мой алгоритм возвращает неправильные ошибки.

тут вы тоже не правы, Дамерау в статье выдвигает гипотезу, что 80% всех типов опечаток входит в множество из 4 типов {удаление, вставка, замена, перестановка соседних}

Значит информация в википедии неверна. Там написано: «Дамерау показал, что 80 % ошибок при наборе текста человеком являются транспозициями.»
Молодцы конечно.

Пару мелочей от зануды.
1- protected RestClient _client = new RestClient(«translate.yandex.net/api/v1.5/tr/»); — обычно считается плохим тоном, тк строка забита жестко.

2- www.nuget.org/packages?q=yandex выложите сюда. Основная проблема на моей памяти со всеми библиотеками, что их найти тяжело. Nuget- это то место от куда все пакеты и качают и начинают их искать.

Спасибо за замечания. Я все исправлю.
Ну до «наггета» еще далеко.

Вообще выглядят странными конструкции вида:

public class Dictionary
{
	protected RestClient _client = new RestClient("https://dictionary.yandex.net/api/v1/dicservice/");
	protected string _key;
...
}

В классе у которого нет наследников.

А если брать глобальнее, то:
1. Отсутствие асинхронного API
2. Куча повторяющихся кусков кода, как то:

RestRequest request = new RestRequest("getLangs");
request.AddParameter("key", _key);

RestResponse response = (RestResponse)_client.Execute(request);
XmlAttributeDeserializer deserializer = new XmlAttributeDeserializer();
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
	var strs = deserializer.Deserialize<List<string>>(response);
	var allLangs = (Lang[])Enum.GetValues(typeof(Lang));
	Lang[] result = allLangs.Where(lang => strs.Contains(lang.ToString().ToLowerInvariant())).ToArray();
	return result;
}
else
{
	var error = deserializer.Deserialize<YandexError>(response);
	throw new YandexLinguisticsException(error);
}


Или вот такой паттерн, встречается многократно

RestResponse response = (RestResponse)_client.Execute(request);
XmlAttributeDeserializer deserializer = new XmlAttributeDeserializer();
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
	...
}
else
{
	...
}

Это все, явные кандидаты на какое-то абстрагирование.

3. Хоть гуевое приложение в «наггет» не пойдет, но в нем все сетевые вызовы синхронны.
Ну что касается асинхронности, то да, ее нет. И можно ее реализовать кстати тоже с помощью RestSharp. Ну а отсутствие абстрагирования никак не повлияет на работу :)
Также(да, мне нечем заняться с утра :)), не контролируется длина полей ввода. Если вводить в них достаточно длинные строки, то выводятся ошибки.
Например, вот тут:
var error = deserializer.Deserialize<YandexError>(response);
throw new YandexLinguisticsException(error);

Метод Deserialize может вернуть null(при длинной введенной строке), и в строке результата вижу:

System.NullReferenceException: Object reference not set to an instance of an object. at YandexLinguistics.NET.YandexLinguisticsException..ctor(YandexError error) in c:\Users\юленька\Documents\Code\Yandex-Linguistics.NET\YandexLinguistics.NET\YandexLinguisticsException.cs:line 12 at YandexLinguistics.NET.Dictionary.Lookup(LangPair lang, String text, String ui, LookupOptions flags) in c:\Users\юленька\Documents\Code\Yandex-Linguistics.NET\YandexLinguistics.NET\Dictionary\Dictionary.cs:line 69 at YandexLinguistics.NET.Gui.frmMain.<UpdateDictionaryResult>b__13() in c:\Users\юленька\Documents\Code\Yandex-Linguistics.NET\YandexLinguistics.NET.Gui\frmMain.cs:line 332
Спасибо за тестирование, посмотрю в чем проблема.
Интересно. Может, есть смысл сделать реализацию без RestSharp, но с System.Net.HttpClient и клиентской частью ASP.NET Web API. Тогда не нужно будет сериализовать/десериализовать руками, и асинхронность там тоже есть
В RestSharp тоже есть асинхронность, но я ее не использовал просто. А в текущей реализации разве что-то десериализуется руками? Или что вы имеете ввиду?

Насчет остального я подумаю, а может кто-нибудь другой реализует при острой необходимости :)
Евгению конечно виднее, что он имел ввиду.

Просто в web.api эта асинхронность очень просто взять и использовать.
www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

а конструкция типа
 RestResponse response = (RestResponse)_client.Execute(request);
                        XmlAttributeDeserializer deserializer = new XmlAttributeDeserializer();
                        if (response.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                                var strs = deserializer.Deserialize<List<string>>(response);

                                var allLangs = (Lang[])Enum.GetValues(typeof(Lang));


выглядет по страшнее чем
HttpResponseMessage response = client.GetAsync("api/products").Result;  // Blocking call!
if (response.IsSuccessStatusCode)
{
    // Parse the response body. Blocking!
    var products = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;
Планируете ли в API вывести функционал склонения, ранее был XML сервис по склонению собственных имен?
Да, пожалуй можно, тем более он небольшой.
Sign up to leave a comment.

Articles