Проблема с акцентами и кодированием с помощью Bing Spell Check API v7

Поэтому я пытаюсь работать с Bing’s Spell Check API в PHP, но у меня возникают проблемы, когда акценты и другие специальные символы не декодируются должным образом, создавая много ошибок, которых нет в исходном тексте, и портя смещения.

Моя реализация довольно проста — она ​​основана на примере, который они приводят в своей документации. Я не уверен, что я должен делать что-то по-другому или это проблема с их стороны в том, как они декодируют эти специальные символы (что кажется крайне маловероятным — я что-то напутал, гораздо более вероятно …!)

Вот код:

$host = 'https://api.cognitive.microsoft.com';
$path = '/bing/v7.0/spellcheck?';

$data = array (
'mkt' => $lang,
'mode' => 'proof',
'text' => urlencode($text)
);

$encodedData = http_build_query($data);
$key = 'subscription key redacted for obvious reasons';

$headers =  "Content-type: application/x-www-form-urlencoded\r\n" .
"Ocp-Apim-Subscription-Key: $key\r\n";

if (isset($_SERVER['REMOTE_ADDR']))
$headers .= "X-MSEdge-ClientIP: " . $_SERVER['REMOTE_ADDR'] . "\r\n";

$options = array (
'http' => array (
'header' => $headers,
'method' => 'POST',
'content' => $encodedData
)
);
$context  = stream_context_create ($options);
$result = file_get_contents ($host . $path, false, $context);

if ($result === FALSE) {
# Handle error
}

$decodedResult = json_decode($result, true);

Если, например, я пытаюсь проверить правильность написания следующей строки:

d’учреждение

$ encodedData становится следующим:

mkt=fr-CA&method=proof&text=d%25E2%2580%2599institutions

И результаты, которые я получаю от API, следующие:

array(2) {
["_type"]=>
string(10) "SpellCheck"["flaggedTokens"]=>
array(1) {
[0]=>
array(4) {
["offset"]=>
int(8)
["token"]=>
string(14) "99institutions"["type"]=>
string(12) "UnknownToken"["suggestions"]=>
array(2) {
[0]=>
array(2) {
["suggestion"]=>
string(15) "99 institutions"["score"]=>
float(0.93191315174102)
}
[1]=>
array(2) {
["suggestion"]=>
string(14) "99 institution"["score"]=>
float(0.6518044080768)
}
}
}
}
}

Как вы можете видеть, декодирование кажется проблематичным, так как% кодируется дважды, и, по-видимому, декодируется только один раз. Теперь, если я уберу url_encode () при установке значения ‘text’ в $ data, он будет отлично работать для апострофа, но он не работает с акцентами. Например, следующая строка:

responsabilité

интерпретируется API как

RESPONSABILITA ©

который возвращает ошибку.

Это может быть что-то простое, что я упускаю из виду, но я боролся с этим уже довольно давно и был бы признателен за любую помощь, которую я могу получить.

Спасибо,

— Émile

[Править] Ну, как всегда … если вы сомневаетесь, предположите, что вы не правы. API рекомендовал изменить все акценты для обычных букв, потому что, даже если указанный язык был французским, он по-прежнему давал предложения на английском языке вместо того, чтобы возвращать пустой массив. Что касается акцентов, которые, похоже, не были декодированы, ну … Я обрабатывал эти данные без какого-либо набора типов документов, так что, конечно, они показывались бы без правильного кодирования. Извините за это — в конце концов, простое удаление urlencode () делает свое дело!

1

Решение

В соответствии с документы:

API поддерживает два режима проверки, доказательство а также Орфографии. Режим по умолчанию — Доказательство. Режим проверки правописания обеспечивает наиболее полные проверки, но он доступен только на рынке en-US (английский-США). Для всех остальных рынков установите параметр запроса режима на Spell. Режим Spell находит большинство орфографических ошибок, но не находит некоторых грамматических ошибок, которые улавливает Proof (например, заглавные буквы и повторяющиеся слова).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]