Os exemplos em C# se aplicam somente ao FRE para Windows.
O ABBYY FineReader Engine permite associar dicionários de vários tipos a um idioma de reconhecimento, o que melhora significativamente a qualidade do reconhecimento.
Esse tipo de dicionário já é fornecido para os idiomas predefinidos que têm suporte interno a dicionário (consulte os comentários na lista de idiomas predefinidos). Além disso, para alguns idiomas, há dicionários de termos especializados (por exemplo, médicos e jurídicos) empacotados no arquivo .zmd. Os dicionários padrão são representados por três ou quatro arquivos. Seus nomes geralmente correspondem ao nome completo ou abreviado do idioma e têm extensão .amd, .amm, .amt ou .ame. Os arquivos com extensões .amd, .amm e .amt estão sempre presentes. Eles são armazenados nas seguintes pastas e não podem ser alterados: Data/ExtendedDictionaries (Linux), Resources/ExtendedDictionaries (macOS), Data\ExtendedDictionaries (Windows).Nenhum arquivo .ame é fornecido com o ABBYY FineReader Engine: esse é um formato para armazenar uma extensão de dicionário, ou seja, palavras adicionadas pelo usuário ao dicionário. Você pode criar uma extensão de dicionário no ABBYY FineReader, onde ela é chamada de dicionário do usuário, e depois copiar o arquivo criado para a pasta mencionada acima dentro da pasta do ABBYY FineReader Engine (ou especificar o caminho completo para ela na propriedade ILanguageDatabase::DictionaryExtensionsPath). O ABBYY FineReader armazena as extensões de dicionários padrão em %appdata%\ABBYY\FineReader\15\FineReaderShell\UserDictionaries. As extensões de dicionário podem ser editadas no ABBYY FineReader Engine usando o método ILanguageDatabase::OpenDictionaryExtension.Esse tipo de dicionário é descrito pelo objeto StandardDictionaryDescription.
Dicionário do usuário
Pode ser criado usando o objeto Dictionary. O objeto Dictionary permite adicionar e remover palavras usando seus métodos.No Windows, o objeto Dictionary também permite editar o dicionário com a caixa de diálogo Dictionary. Essa caixa de diálogo permite importar qualquer arquivo de texto nas codificações Windows ANSI e Unicode (o único requisito é que as palavras sejam separadas por espaços ou outros caracteres não alfabéticos).Esse tipo de dicionário é descrito pelo objeto UserDictionaryDescription.
O dicionário do usuário no FineReader Engine tem formato de arquivo .amd e pode ser criado para qualquer idioma. Ele pode substituir o dicionário padrão em idiomas que não têm suporte a dicionário. O dicionário do usuário do ABBYY FineReader é chamado de extensão de dicionário no FineReader Engine; ele é um arquivo .ame e só pode ser criado para idiomas com suporte a dicionário, como uma extensão do dicionário padrão desse idioma.
Dicionário baseado em expressões regulares
Especifica as regras que definem quais palavras são permitidas em um idioma e quais não são permitidas.Esse tipo de dicionário é descrito pelo objeto RegExpDictionaryDescription.
Dicionário externo
Permite implementar seu próprio tipo de dicionário. Esse dicionário é representado pela interface IExternalDictionary, que é implementada no lado do cliente. Você pode encontrar orientações para criar um dicionário externo na descrição dessa interface.Esse tipo de dicionário é descrito pelo objeto ExternalDictionaryDescription.
O ABBYY FineReader Engine fornece um objeto DictionaryDescription para descrever todos os tipos de dicionários. Esse é o objeto base do qual herdam as descrições dos diferentes tipos de dicionário.Todas essas descrições de dicionário são elementos da coleção DictionaryDescriptions.
Para um dicionário externo (ExternalDictionaryDescription), use o método SetDictionary para especificar o dicionário.
Todos os tipos de dicionário recebem um peso. O peso de um dicionário afeta o peso das palavras desse dicionário quando elas são detectadas durante o reconhecimento. O parâmetro de peso é uma porcentagem e não pode ser negativo. Um peso igual a 0 não significa automaticamente que esse dicionário não exista. São permitidos pesos acima de 100%, mas o usuário deve ter muito cuidado ao usar esses parâmetros. O peso é especificado na propriedade IDictionaryDescription::Weight e, por padrão, é definido como 100.Os dicionários padrão também têm a opção CanUseTrigrams, que permite ou impede o programa de usar trigramas criados com base no dicionário selecionado. Trigramas são combinações de três letras. Nem todas essas combinações ocorrem em palavras reais. É muito provável que uma palavra com um trigrama ausente do dicionário seja impronunciável. Os trigramas são usados para eliminar palavras não confiáveis. Recomendamos habilitar trigramas para dicionários padrão “gerais” e desabilitá-los para dicionários de termos.
Um idioma de reconhecimento de texto (o objeto TextLanguage) pode ter tanto dicionários que contêm palavras do idioma quanto dicionários de palavras proibidas. Os primeiros são especificados para cada idioma base de reconhecimento do idioma de texto e podem ser acessados por meio da propriedade IBaseLanguage::DictionaryDescriptions. Um idioma base pode não ter nenhum dicionário associado. Os dicionários de palavras proibidas são associados diretamente ao idioma de reconhecimento de texto por meio da propriedade ITextLanguage::ProhibitingDictionaries.Se você quiser permitir apenas palavras do dicionário durante o reconhecimento, defina a propriedade IBaseLanguage::AllowWordsFromDictionaryOnly como TRUE. Nesse caso, uma palavra que não for encontrada no dicionário do idioma base poderá aparecer no texto reconhecido somente se o ABBYY FineReader Engine não encontrar variantes dessa palavra no dicionário.
Obtenha a coleção de idiomas base do novo idioma de texto (use a propriedade BaseLanguages).
Crie um novo objeto BaseLanguage e adicione-o à coleção de idiomas base.
Obtenha a coleção de descrições de dicionário do novo idioma base (a propriedade DictionaryDescriptions).
Crie uma descrição de dicionário e adicione-a à coleção de descrições de dicionário do idioma base. Use o método AddNew da coleção DictionaryDescriptions.
Você pode criar vários dicionários de tipos diferentes e adicioná-los à coleção DictionaryDescriptions de um mesmo idioma base de reconhecimento.
[Opcional] Especifique o peso do dicionário criado.
Especifique a propriedade de identificação do dicionário: a propriedade LanguageId para um dicionário padrão, a propriedade FileName para um dicionário do usuário, chame o método IRegExpDictionaryDescription::SetText para um dicionário baseado em expressões regulares ou chame o método IExternalDictionaryDescription::SetDictionary para um dicionário externo.
[Opcional] Especifique outras propriedades do objeto BaseLanguage.
[Opcional] Defina os dicionários de exclusão usando a propriedade ProhibitingDictionaries do objeto TextLanguage.
Para implementar essas etapas no Windows, veja os exemplos de código abaixo.
Código C++ (COM)
// Objeto global do ABBYY FineReader EngineFREngine::IEnginePtr Engine;// Um objeto LanguageDatabaseFREngine::ILanguageDatabasePtr languageDatabase;...// Crie um objeto TextLanguage e obtenha sua coleção de idiomas baseFREngine::ITextLanguagePtr pTextLang = languageDatabase->CreateTextLanguage();FREngine::IBaseLanguagesPtr pBaseLangCollection = pTextLang->BaseLanguages;// Crie um objeto BaseLanguage e obtenha sua coleção de descrições de dicionárioFREngine::IBaseLanguagePtr pBaseLang = pBaseLangCollection->AddNew();pBaseLang->InternalName = L"SampleBaseLanguage";pBaseLang->PutLetterSet( FREngine::BLLS_Alphabet, L"abc123" );FREngine::IDictionaryDescriptionsPtr pDictDescCollection = pBaseLang->DictionaryDescriptions;// Crie uma descrição de dicionário padrão e adicione-a à coleçãoFREngine::IDictionaryDescriptionPtr pDicDescription = pDictDescCollection->AddNew( FREngine::DT_SystemDictionary);// [optional] Especifique o peso do dicionário criadopDicDescription->Weight = 100;// Especifique a propriedade de identificação do dicionárioFREngine::IStandardDictionaryDescriptionPtr pStandardDic = pDicDescription->GetAsStandardDictionaryDescription();pStandardDic->LanguageId = FREngine::LI_EnglishUnitedStates;// [optional] Especifique outras propriedades do objeto BaseLanguagepBaseLang->AllowWordsFromDictionaryOnly = VARIANT_TRUE;// Crie um objeto RecognizerParamsFREngine::IRecognizerParamsPtr pParams = Engine->CreateRecognizerParams();// Atribua o objeto TextLanguage criado à propriedade TextLanguagepParams->TextLanguage = pTextLang;...
Código C#
// Objeto global do ABBYY FineReader EngineFREngine.IEngine engine;// Um objeto LanguageDatabaseFREngine.ILanguageDatabase languageDatabase;...// Crie um objeto TextLanguage e obtenha sua coleção de idiomas baseFREngine.ITextLanguage TextLang = languageDatabase.CreateTextLanguage();FREngine.IBaseLanguages BaseLangCollection = TextLang.BaseLanguages;// Crie um objeto BaseLanguage e obtenha sua coleção de descrições de dicionárioFREngine.IBaseLanguage BaseLang = BaseLangCollection.AddNew();BaseLang.InternalName = "SampleBaseLanguage";BaseLang.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, "abc123" );FREngine.IDictionaryDescriptions DictDescCollection = BaseLang.DictionaryDescriptions;// Crie uma descrição de dicionário padrão e adicione-a à coleçãoFREngine.IDictionaryDescription DicDescription = DictDescCollection.AddNew( FREngine.DictionaryTypeEnum.DT_SystemDictionary );// [opcional] Especifique o peso do dicionário criadoDicDescription.Weight = 100;// Especifique a propriedade de identificação do dicionárioFREngine.IStandardDictionaryDescription StandardDic = DicDescription.GetAsStandardDictionaryDescription();StandardDic.LanguageId = FREngine.LanguageIdEnum.LI_EnglishUnitedStates;// [opcional] Especifique outras propriedades do idioma baseBaseLang.AllowWordsFromDictionaryOnly = true;// Crie um objeto RecognizerParamsFREngine.IRecognizerParams recParams = engine.CreateRecognizerParams();// Atribua o objeto TextLanguage criado à propriedade TextLanguagerecParams.TextLanguage = TextLang;...
Um dicionário de cache é um pequeno dicionário (cerca de cem palavras) que pode ser alterado facilmente durante o processamento. Os dicionários de cache podem ser usados quando é possível selecionar um dicionário com mais precisão, por exemplo, se você obtiver novas informações sobre o documento durante o processamento. Esses dicionários são adequados para reconhecimento de campos.Por exemplo, suponha que haja dois campos em um formulário que você precisa reconhecer: o nome de uma cidade e o nome de uma rua. Você reconheceu o nome da cidade e tem a lista de ruas dessa cidade. Nesse caso, pode carregar o dicionário de cache apropriado com os nomes das ruas e, assim, reconhecer o nome da rua com mais rapidez e precisão.O ABBYY FineReader Engine fornece os métodos AddWordsToCacheDictionary, AddWordToCacheDictionary e CleanCacheDictionary do objeto FRPage para trabalhar com dicionários de cache.
Para usar o dicionário de cache, você deve definir a propriedade IEngine::AutoCleanRecognizerSession como FALSE. Por padrão, a propriedade AutoCleanRecognizerSession é definida como TRUE, o que significa que o FineReader Engine limpa a sessão de reconhecimento após reconhecer cada página; nesse caso, o dicionário de cache também é limpo. Para evitar a destruição acidental de dados do usuário, o FineReader Engine proíbe o uso de dicionários de cache nesse modo. Se você usar o dicionário de cache, será sua responsabilidade limpar manualmente a sessão de reconhecimento chamando o método IEngine::CleanRecognizerSession quando necessário. Consulte a descrição do método para saber quando é necessário limpar a sessão de reconhecimento.