Azure KeyPhrase API 有时返回 400
Azure KeyPhrase API returning 400 at times
我使用 Azure KeyPhrase API 得到了混合结果 - 有时成功(我的意思是 200 个结果)和其他我得到 400 个错误请求。为了测试该服务,我在他们的 NoSQL 服务上从 Azure PDF 发送内容。
文档说每个文档最多可以包含 5k 个字符。为了排除这种情况,(我从 5k 开始)我将每个限制为最多 1k 个字符。
我怎样才能获得有关失败原因的更多信息?我已经查看了 Portal,但那里没有太多细节。
我正在使用这个端点:https://eastus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases
一些样本失败:
{"documents":[{"language":"en","id":1,"text":"David Chappell Understanding NoSQL on Microsoft Azure Sponsored by Microsoft Corporation Copyright © 2014 Chappell & Associates" }]}
{"documents":[{"language":"en","id":1,"text":"3 关系技术有几十年来一直是处理数据的主要方法。通常使用结构化查询语言 (SQL) 访问,关系数据库非常有用。正如它们的受欢迎程度所表明的那样,它们可以应用于许多不同的情况。但是关系技术不是“始终是最好的方法。假设您需要处理大量数据,例如,太多而无法存储在一台机器上。扩展关系技术以跨多个服务器(物理或虚拟)有效地工作可能具有挑战性。或者假设您的应用程序使用不适合关系系统的数据,例如 JavaScript 对象表示法 (JSON) 文档。将数据硬塞进关系表中是可能的,但是专门设计用于工作的存储技术有了这种信息可能会更简单。没有SQL技术被创造来解决这些问题。正如名字 sug gests,标签包含多种存储"}]}
** 添加了我的 quick/dirty 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();
};
}
}
尝试更改此行
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 可以帮助简化服务调用。
https://github.com/Azure/azure-rest-api-specs/tree/current/specification/cognitiveservices/data-plane/TextAnalytics
我使用 Azure KeyPhrase API 得到了混合结果 - 有时成功(我的意思是 200 个结果)和其他我得到 400 个错误请求。为了测试该服务,我在他们的 NoSQL 服务上从 Azure PDF 发送内容。
文档说每个文档最多可以包含 5k 个字符。为了排除这种情况,(我从 5k 开始)我将每个限制为最多 1k 个字符。
我怎样才能获得有关失败原因的更多信息?我已经查看了 Portal,但那里没有太多细节。
我正在使用这个端点:https://eastus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases
一些样本失败:
{"documents":[{"language":"en","id":1,"text":"David Chappell Understanding NoSQL on Microsoft Azure Sponsored by Microsoft Corporation Copyright © 2014 Chappell & Associates" }]}
{"documents":[{"language":"en","id":1,"text":"3 关系技术有几十年来一直是处理数据的主要方法。通常使用结构化查询语言 (SQL) 访问,关系数据库非常有用。正如它们的受欢迎程度所表明的那样,它们可以应用于许多不同的情况。但是关系技术不是“始终是最好的方法。假设您需要处理大量数据,例如,太多而无法存储在一台机器上。扩展关系技术以跨多个服务器(物理或虚拟)有效地工作可能具有挑战性。或者假设您的应用程序使用不适合关系系统的数据,例如 JavaScript 对象表示法 (JSON) 文档。将数据硬塞进关系表中是可能的,但是专门设计用于工作的存储技术有了这种信息可能会更简单。没有SQL技术被创造来解决这些问题。正如名字 sug gests,标签包含多种存储"}]}
** 添加了我的 quick/dirty 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();
};
}
}
尝试更改此行
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 可以帮助简化服务调用。 https://github.com/Azure/azure-rest-api-specs/tree/current/specification/cognitiveservices/data-plane/TextAnalytics