Я использую API перевода Microsoft для перевода некоторых научных статей на разные языки.Однако, когда я перевожу предложение с некоторыми экранированными греческими символами и надстрочным текстом, результат не очень хорошо соответствует смыслу.Например, это исходный текст HTML:
<p>DNA polymerases (Pols) α, ε, and δ<sup class="xref">1</sup><sup>,</sup><sup class="xref">2</sup></p>.
Объектами HTML являются альфа, эпсилон и дельта, тэг sup 1,2 является ссылкой на это предложение.
Код, который я использую для перевода предложения, взят из примера MicrosoftTranslator / Text-Translation-API-V3-PHP.
<?php
// NOTE: Be sure to uncomment the following line in your php.ini file.
// ;extension=php_openssl.dll
// **********************************************
// *** Update or verify the following values. ***
// **********************************************
// Replace the subscriptionKey string value with your valid subscription key.
$key = 'ENTER YOUR KEY';
$host = "https://api.cognitive.microsofttranslator.com";
$path = "/translate?api-version=3.0";
// Translate to German and Italian.
$params = "&to=de&textType=html";
$text = '<p>DNA polymerases (Pols) α, ε, and δ<sup class="xref">1</sup><sup>,</sup><sup class="xref">2</sup>. ';
if (!function_exists('com_create_guid')) {
function com_create_guid() {
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
mt_rand( 0, 0xffff ),
mt_rand( 0, 0x0fff ) | 0x4000,
mt_rand( 0, 0x3fff ) | 0x8000,
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);
}
}
function Translate ($host, $path, $key, $params, $content) {
$headers = "Content-type: application/json\r\n" .
"Content-length: " . strlen($content) . "\r\n" .
"Ocp-Apim-Subscription-Key: $key\r\n" .
"X-ClientTraceId: " . com_create_guid() . "\r\n";
// NOTE: Use the key 'http' even if you are making an HTTPS request. See:
// http://php.net/manual/en/function.stream-context-create.php
$options = array (
'http' => array (
'header' => $headers,
'method' => 'POST',
'content' => $content
)
);
$context = stream_context_create ($options);
$result = file_get_contents ($host . $path . $params, false, $context);
return $result;
}
$requestBody = array (
array (
'Text' => $text,
),
);
$content = json_encode($requestBody, JSON_UNESCAPED_UNICODE);
$result = Translate ($host, $path, $key, $params, $content);
// Note: We convert result, which is JSON, to and from an object so we can pretty-print it.
// We want to avoid escaping any Unicode characters that result contains. See:
// http://php.net/manual/en/function.json-encode.php
$json = json_encode(json_decode($result), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;
?>
Я установил параметры textType = html, чтобы прекратить перевод HTML-тегов.
Вот что я получил:
[
{
"detectedLanguage": {
"language": "en",
"score": 0.77
},
"translations": [
{
"text": "<p>DNA-Polymerasen (Pols) α,-, und<sup class=\"xref\"><\/sup>,-1<sup>,<\/sup><sup class=\"xref\">2<\/sup>.",
"to": "de"
}
]
}
]
Именапосле перевода теряются полимеразы, а также изменяется текст в надстрочном теге.
Затем я попытался обернуть объекты HTML в class = "notranslate", как это упоминается в документе.
$text = '<p>DNA polymerases (Pols) <span class="notranslate">α</span>, <span class="notranslate">ε</span>, and <span class="notranslate">δ</span><sup class="xref">1</sup><sup>,</sup><sup class="xref">2</sup>. ';
Переведенный результат:
[
{
"detectedLanguage": {
"language": "en",
"score": 1
},
"translations": [
{
"text": "<p>DNA-Polymerasen (Pols <span class=\"notranslate\"> α <\/span>) <span class=\"notranslate\"> ε <\/span>, und <span class=\"notranslate\"> δ <\/span> <sup class=\"xref\">1,2<\/sup><sup><\/sup><sup class=\"xref\"><\/sup>.",
"to": "de"
}
]
}
]
И это также меняет смысл предложения.
Мне было интересно, изменились ли сущности HTML во время кодирования и декодирования, но когдаЯ перевел это на испанский язык, это хорошо переведено без использования "notranslate" переноса.
У кого-нибудь есть такая же проблема во время перевода или у вас есть идеи?На самом деле, он хорошо работал до того, как я перенес его в API версии 3, но старая версия устареет после апреля 2019 года.