Azure Когнитивный поиск навыка перевода текста ограничение 50 тыс. Символов - PullRequest
1 голос
/ 29 апреля 2020

Мы используем Azure Cognitive Search для индексации различных документов, например файлов Word или PDF, которые хранятся в Azure Blob Storage. Мы хотели бы иметь возможность переводить извлеченное содержимое не-Engli sh документов и сохранять результат перевода в специальном поле в индексе.

В настоящее время встроенный когнитивный навык «Перевод текста» поддерживает до 50000 символов на входе. Документы, которые мы имеем, могут содержать до 1 МБ текста. Согласно документации, можно разбить текст на куски с помощью встроенного навыка «Разделить», однако нет никакого навыка, который мог бы объединить переведенные куски вместе. Наша цель состоит в том, чтобы весь извлеченный текст был переведен и сохранен в одном поле индекса типа Edm.String, а не в массиве.

Существует ли способ перевода больших текстовых блоков при индексации, кроме создания собственного Cognitive Умение через веб-API для этой цели?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Да, Умение слияния действительно сделает это. Определите навык в вашем наборе навыков, как показано ниже. Входные данные «text» и «offsets» для этого навыка являются необязательными, и вы можете использовать «itemsToInsert», чтобы указать текст, который вы хотите объединить вместе (укажите соответствующий источник для вывода перевода). Используйте insertPreTag и insertPostTag, если вы хотите вставить, возможно, пробел до или после каждого объединенного раздела.

{
  "@odata.type": "#Microsoft.Skills.Text.MergeSkill",
  "description": "Merge text back together",
  "context": "/document",
  "insertPreTag": "",
  "insertPostTag": "",
  "inputs": [
    {
      "name": "itemsToInsert", 
      "source": "/document/translation_output/*/text"
    }
  ],
  "outputs": [
    {
      "name": "mergedText", 
      "targetName" : "merged_text_field_in_your_index"
    }
  ]
}
0 голосов
/ 04 мая 2020

Ниже приведен фрагмент кода C#, использующий классы Microsoft. Azure .Search. Он следует предложению, данному Дженифер в ответе выше.

Определение набора навыков было проверено на предмет правильной поддержки перевода текстовых блоков размером более 50 тыс. Символов.

private static IList<Skill> GetSkills()
{
    var skills = new List<Skill>();
    skills.AddRange(new Skill[] {
        // ...some skills in the pipeline before translation
        new ConditionalSkill(
            name: "05-1-set-language-code-for-split",
            description: "Set compatible language code for split skill (e.g. 'ru' is not supported)",
            context: "/document",
            inputs: new []
            {
                new InputFieldMappingEntry(name: "condition", source: SplitLanguageExpression),
                new InputFieldMappingEntry(name: "whenTrue", source: "/document/language_code"),
                new InputFieldMappingEntry(name: "whenFalse", source: "= 'en'")
            },
            outputs: new [] { new OutputFieldMappingEntry(name: "output", targetName: "language_code_split") }
        ),
        new SplitSkill
        (
            name: "05-2-split-original-content",
            description: "Split original merged content into chunks for translation",
            defaultLanguageCode: SplitSkillLanguage.En,
            textSplitMode: TextSplitMode.Pages,
            maximumPageLength: 50000,
            context: "/document/merged_content_original",
            inputs: new []
            {
                new InputFieldMappingEntry(name: "text", source: "/document/merged_content_original"),
                new InputFieldMappingEntry(name: "languageCode", source: "/document/language_code_split")
            },
            outputs: new [] { new OutputFieldMappingEntry(name: "textItems", targetName: "pages") }
        ),
        new TextTranslationSkill
        (
            name: "05-3-translate-original-content-pages",
            description: "Translate original merged content chunks",
            defaultToLanguageCode: TextTranslationSkillLanguage.En,
            context: "/document/merged_content_original/pages/*",
            inputs: new []
            {
                new InputFieldMappingEntry(name: "text", source: "/document/merged_content_original/pages/*"),
                new InputFieldMappingEntry(name: "fromLanguageCode", source: "/document/language_code")
            },
            outputs: new [] { new OutputFieldMappingEntry(name: "translatedText", targetName: "translated_text") }
        ),
        new MergeSkill
        (
            name: "05-4-merge-translated-content-pages",
            description: "Merge translated content into one text string",
            context: "/document",
            insertPreTag: " ",
            insertPostTag: " ",
            inputs: new []
            {
                new InputFieldMappingEntry(name: "itemsToInsert", source: "/document/merged_content_original/pages/*/translated_text")
            },
            outputs: new [] { new OutputFieldMappingEntry(name: "mergedText", targetName: "merged_content_translated") }
        ),
        // ... some skills in the pipeline after translation
    });

    return skills;
}

private static string SplitLanguageExpression
{
    get
    {
        var values = Enum.GetValues(typeof(SplitSkillLanguage)).Cast<SplitSkillLanguage>();
        var parts = values.Select(v => "($(/document/language_code) == '" + v.ToString().ToLower() +"')");
        return "= " + string.Join(" || ", parts);
    }
}

...