Поэтому я пытаюсь работать с 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 () делает свое дело!В соответствии с документы:
API поддерживает два режима проверки, доказательство а также Орфографии. Режим по умолчанию — Доказательство. Режим проверки правописания обеспечивает наиболее полные проверки, но он доступен только на рынке en-US (английский-США). Для всех остальных рынков установите параметр запроса режима на Spell. Режим Spell находит большинство орфографических ошибок, но не находит некоторых грамматических ошибок, которые улавливает Proof (например, заглавные буквы и повторяющиеся слова).
Других решений пока нет …