Экранированные символы в Microsoft Translator API - Как избежать перевода экранированных объектов? - PullRequest
0 голосов
/ 12 апреля 2019

Я использую API перевода Microsoft для перевода некоторых научных статей на разные языки.Однако, когда я перевожу предложение с некоторыми экранированными греческими символами и надстрочным текстом, результат не очень хорошо соответствует смыслу.Например, это исходный текст HTML:

<p>DNA polymerases (Pols) &#945;, &#949;, and &#948;<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) &#945;, &#949;, and &#948;<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">&#945;</span>, <span class="notranslate">&#949;</span>, and <span class="notranslate">&#948;</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\"> &#945; <\/span>) <span class=\"notranslate\"> &#949; <\/span>, und <span class=\"notranslate\"> &#948; <\/span> <sup class=\"xref\">1,2<\/sup><sup><\/sup><sup class=\"xref\"><\/sup>.",
                "to": "de"
            }
        ]
    }
]

И это также меняет смысл предложения.

Мне было интересно, изменились ли сущности HTML во время кодирования и декодирования, но когдаЯ перевел это на испанский язык, это хорошо переведено без использования "notranslate" переноса.

У кого-нибудь есть такая же проблема во время перевода или у вас есть идеи?На самом деле, он хорошо работал до того, как я перенес его в API версии 3, но старая версия устареет после апреля 2019 года.

...