API Azure KeyPhrase возвращает 400 раз
Я получаю смешанные результаты с помощью API Azure KeyPhrase - иногда успешно (под этим я имею в виду 200 результатов), а другие получают 400 неверных запросов. Чтобы протестировать службу, я отправляю содержимое из Azure PDF в их службу NoSQL.
В документации сказано, что каждый документ может содержать до 5 000 символов. Чтобы исключить это, (я начал с 5k) я ограничиваю каждого до 1k символов.
Как я могу получить больше информации о причине сбоя? Я уже проверил портал, но там не так много деталей.
Я использую эту конечную точку: https://eastus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases
Некоторые примеры сбоев:
{"documents": [{"language": "en", "id": 1, "text": "Дэвид Чаппелл Понимание NoSQL в Microsoft Azure При поддержке Microsoft Corporation Copyright © 2014 Chappell & Associates"}]}
{"documents": [{"language": "en", "id": 1, "text": "3 Реляционная технология была доминирующим подходом к работе с данными на протяжении десятилетий. Обычно доступ к ней осуществляется с использованием языка структурированных запросов (SQL) Реляционные базы данных невероятно полезны. И, как показывает их популярность, их можно применять в самых разных ситуациях. Но реляционные технологии не всегда являются лучшим подходом. Предположим, вам нужно работать с очень большими объемами данных, например, слишком большими. хранить на одном компьютере. Масштабирование реляционной технологии для эффективной работы на многих серверах (физических или виртуальных) может быть сложной задачей. Или предположим, что ваше приложение работает с данными, которые не совсем подходят для реляционных систем, таких как документы JavaScript Object Notation (JSON) Возможно объединение данных в реляционные таблицы, но технология хранения, специально предназначенная для работы с такого рода информацией, может быть проще. Технологии NoSQL были созданы для решения подобных проблем. Как следует из названия, abel включает в себя множество хранилищ "}]}
** добавил мой быстрый / грязный код Poc ***
List<string> sendRequest(object data)
{
string url = "https://eastus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases";
string key = "api-code-here";
string hdr = "Ocp-Apim-Subscription-Key";
var wc = new WebClient();
wc.Headers.Add(hdr, key);
wc.Headers.Add(HttpRequestHeader.ContentType, "application/json");
TextAnalyticsResult results = null;
string json = JsonConvert.SerializeObject(data);
try
{
var bytes = Encoding.Default.GetBytes(json);
var d2 = wc.UploadData(url, bytes);
var dataString = Encoding.Default.GetString(d2);
results = JsonConvert.DeserializeObject<TextAnalyticsResult>(dataString);
}
catch (Exception ex)
{
var s = ex.Message;
}
System.Threading.Thread.Sleep(125);
if (results != null && results.documents != null)
return results.documents.SelectMany(x => x.keyPhrases).ToList();
else
return new List<string>();
}
Вызывается:
foreach (var k in vals)
{
data.documents.Clear();
int countSpaces = k.Count(Char.IsWhiteSpace);
if (countSpaces > 3)
{
if (k.Length > maxLen)
{
var v = k;
while (v.Length > maxLen)
{
var tmp = v.Substring(0, maxLen);
var idx = tmp.LastIndexOf(" ");
tmp = tmp.Substring(0, idx).Trim();
data.documents.Add(new
{
language = "en",
id = data.documents.Count() + 1,
text = tmp
});
v = v.Substring(idx + 1).Trim();
phrases.AddRange(sendRequest(data));
data.documents.Clear();
}
data.documents.Add(new
{
language = "en",
id = data.documents.Count() + 1,
text = v
});
phrases.AddRange(sendRequest(data));
data.documents.Clear();
}
else
{
data.documents.Add(new
{
language = "en",
id = 1,
text = k
});
phrases.AddRange(sendRequest(data));
data.documents.Clear();
};
}
}
2 ответа
Попробуйте изменить эту строку
var bytes = Encoding.Default.GetBytes(json);
в
var bytes = Encoding.UTF8.GetBytes(json);
Я вручную создал несколько запросов, используя образцы документов, которые вы указали, с ошибками, они были правильно обработаны службой и вернули ключевые фразы. Таким образом, проблема кодирования выглядит вероятной.
В будущем вы также можете посмотреть на внутреннюю ошибку, возвращаемую сервисом. Обычно вы увидите более подробную информацию, как в примере ниже.
{
"code": "BadRequest",
"message": "Invalid request",
"innerError": {
"code": "InvalidRequestContent",
"message": "Request contains duplicated Ids. Make sure each document has a unique Id."
}
}
Кроме того, существует.NET SDK для Text Analytics, который может помочь упростить вызов службы. https://github.com/Azure/azure-rest-api-specs/tree/current/specification/cognitiveservices/data-plane/TextAnalytics