Les exemples en C# s’appliquent uniquement à FRE pour Windows.
ABBYY FineReader Engine vous permet d’associer à une langue de reconnaissance des dictionnaires de différents types, ce qui améliore considérablement la qualité de la reconnaissance.
Les dictionnaires peuvent être de plusieurs types :
Dictionnaire standard
Ce type de dictionnaire est déjà fourni pour les langues prédéfinies qui disposent d’une prise en charge intégrée des dictionnaires (voir les commentaires dans la liste des langues prédéfinies). En outre, pour certaines langues, il existe des dictionnaires de termes spécialisés (par ex. médicaux et juridiques) regroupés dans l’archive .zmd. Les dictionnaires standard sont représentés par trois ou quatre fichiers. Leurs noms correspondent généralement au nom complet ou abrégé de la langue et ont une extension .amd, .amm, .amt ou .ame. Les fichiers portant les extensions .amd, .amm et .amt sont toujours présents. Ils sont stockés dans les dossiers suivants et ne peuvent pas être modifiés : Data/ExtendedDictionaries (Linux), Resources/ExtendedDictionaries (macOS), Data\ExtendedDictionaries (Windows).Aucun fichier .ame n’est fourni avec ABBYY FineReader Engine : il s’agit d’un format servant à stocker une extension de dictionnaire, c’est-à-dire les mots ajoutés au dictionnaire par l’utilisateur. Vous pouvez créer une extension de dictionnaire dans ABBYY FineReader, où elle est appelée dictionnaire utilisateur, puis copier le fichier créé dans le dossier mentionné ci-dessus, sous le dossier ABBYY FineReader Engine (ou en spécifier le chemin d’accès complet dans la propriété ILanguageDatabase::DictionaryExtensionsPath). ABBYY FineReader stocke les extensions des dictionnaires standard dans %appdata%\ABBYY\FineReader\15\FineReaderShell\UserDictionaries. Les extensions de dictionnaire peuvent être modifiées dans ABBYY FineReader Engine à l’aide de la méthode ILanguageDatabase::OpenDictionaryExtension.Ce type de dictionnaire est décrit par l’objet StandardDictionaryDescription.
Dictionnaire utilisateur
Peut être créé à l’aide de l’objet Dictionary. L’objet Dictionary vous permet d’ajouter et de supprimer des mots à l’aide de ses méthodes.Sous Windows, l’objet Dictionary vous permet également de modifier le dictionnaire à l’aide de la boîte de dialogue Dictionary. Cette boîte de dialogue vous permet d’importer n’importe quel fichier texte encodé en Windows ANSI ou en Unicode (la seule exigence étant que les mots soient séparés par des espaces ou d’autres caractères non alphabétiques).Ce type de dictionnaire est décrit par l’objet UserDictionaryDescription.
Dans FineReader Engine, le dictionnaire utilisateur utilise le format de fichier .amd et peut être créé pour n’importe quelle langue. Il peut remplacer le dictionnaire standard pour les langues qui ne disposent pas d’une prise en charge des dictionnaires. Dans FineReader Engine, le dictionnaire utilisateur d’ABBYY FineReader est appelé extension de dictionnaire ; il s’agit d’un fichier .ame qui ne peut être créé que pour les langues prenant en charge les dictionnaires, comme extension du dictionnaire standard de cette langue.
Dictionnaire basé sur des expressions régulières
Spécifie les règles qui définissent quels mots sont autorisés dans une langue et quels mots ne le sont pas.Ce type de dictionnaire est décrit par l’objet RegExpDictionaryDescription.
Dictionnaire externe
Vous permet d’implémenter votre propre type de dictionnaire. Ce dictionnaire est représenté par l’interface IExternalDictionary, qui est implémentée côté client. Vous trouverez dans la description de cette interface des recommandations pour créer un dictionnaire externe.Ce type de dictionnaire est décrit par l’objet ExternalDictionaryDescription.
ABBYY FineReader Engine fournit un objet DictionaryDescription pour décrire tous les types de dictionnaires. Il s’agit de l’objet de base dont héritent les descriptions des différents types de dictionnaires.Toutes ces descriptions de dictionnaires sont des éléments de la collection DictionaryDescriptions.
Pour un dictionnaire externe (ExternalDictionaryDescription), utilisez la méthode SetDictionary pour spécifier le dictionnaire.
Un poids est attribué à tous les types de dictionnaires. Le poids d’un dictionnaire influe sur celui des mots provenant de ce dictionnaire lorsqu’ils sont détectés lors de la reconnaissance. Le paramètre de poids est exprimé en pourcentage et doit être positif ou nul. Un poids de 0 ne signifie pas automatiquement qu’il n’existe pas de dictionnaire de ce type. Des poids supérieurs à 100 % sont autorisés, mais l’utilisateur doit faire preuve d’une grande prudence lorsqu’il utilise de tels paramètres. Le poids est spécifié dans la propriété IDictionaryDescription::Weight et sa valeur par défaut est 100.Les dictionnaires standard disposent également d’une option CanUseTrigrams qui autorise ou interdit au programme d’utiliser des trigrammes construits à partir du dictionnaire sélectionné. Les trigrammes sont des combinaisons de trois lettres. Toutes ces combinaisons n’apparaissent pas dans des mots réels. Un mot contenant un trigramme absent du dictionnaire a de fortes chances d’être imprononçable. Les trigrammes servent à écarter les mots peu fiables. Nous recommandons d’activer les trigrammes pour les dictionnaires standard « généraux » et de les désactiver pour les dictionnaires de termes.
Une langue de reconnaissance de texte (l’objet TextLanguage) peut comporter à la fois des dictionnaires contenant des mots de la langue et des dictionnaires de mots interdits. Les premiers sont définis pour chaque langue de reconnaissance de base de la langue de texte et sont accessibles via la propriété IBaseLanguage::DictionaryDescriptions. Une langue de base peut ne pas avoir de dictionnaire associé. Les dictionnaires de mots interdits sont associés directement à la langue de reconnaissance de texte via la propriété ITextLanguage::ProhibitingDictionaries.Si vous souhaitez que seuls les mots du dictionnaire soient autorisés lors de la reconnaissance, définissez la propriété IBaseLanguage::AllowWordsFromDictionaryOnly sur TRUE. Dans ce cas, un mot absent du dictionnaire de la langue de base ne peut apparaître dans le texte reconnu que si ABBYY FineReader Engine n’a trouvé aucune variante dans le dictionnaire.
Récupérez la collection des langues de base de la nouvelle langue de texte (utilisez la propriété BaseLanguages).
Créez un nouvel objet BaseLanguage et ajoutez-le à la collection des langues de base.
Récupérez la collection des descriptions de dictionnaire de la nouvelle langue de base (propriété DictionaryDescriptions).
Créez une description de dictionnaire et ajoutez-la à la collection des descriptions de dictionnaire de la langue de base. Utilisez la méthode AddNew de la collection DictionaryDescriptions.
Vous pouvez créer plusieurs dictionnaires de types différents et les ajouter à la collection DictionaryDescriptions d’une même langue de reconnaissance de base.
[Facultatif] Spécifiez le poids du dictionnaire créé.
Spécifiez la propriété d’identification du dictionnaire : la propriété LanguageId pour un dictionnaire standard, la propriété FileName pour un dictionnaire utilisateur, appelez la méthode IRegExpDictionaryDescription::SetText pour un dictionnaire basé sur des expressions régulières, ou la méthode IExternalDictionaryDescription::SetDictionary pour un dictionnaire externe.
[Facultatif] Spécifiez d’autres propriétés de l’objet BaseLanguage.
[Facultatif] Définissez les dictionnaires de mots interdits à l’aide de la propriété ProhibitingDictionaries de l’objet TextLanguage.
Pour implémenter ces étapes sous Windows, consultez les exemples de code ci-dessous.
Code C++ (COM)
// Objet global ABBYY FineReader EngineFREngine::IEnginePtr Engine;// Un objet LanguageDatabaseFREngine::ILanguageDatabasePtr languageDatabase;...// Créez un objet TextLanguage et récupérez sa collection de langues de baseFREngine::ITextLanguagePtr pTextLang = languageDatabase->CreateTextLanguage();FREngine::IBaseLanguagesPtr pBaseLangCollection = pTextLang->BaseLanguages;// Créez un objet BaseLanguage et récupérez sa collection de descriptions de dictionnaireFREngine::IBaseLanguagePtr pBaseLang = pBaseLangCollection->AddNew();pBaseLang->InternalName = L"SampleBaseLanguage";pBaseLang->PutLetterSet( FREngine::BLLS_Alphabet, L"abc123" );FREngine::IDictionaryDescriptionsPtr pDictDescCollection = pBaseLang->DictionaryDescriptions;// Créez une description de dictionnaire standard et ajoutez-la à la collectionFREngine::IDictionaryDescriptionPtr pDicDescription = pDictDescCollection->AddNew( FREngine::DT_SystemDictionary);// [facultatif] Spécifiez le poids du dictionnaire créépDicDescription->Weight = 100;// Spécifiez la propriété d’identification du dictionnaireFREngine::IStandardDictionaryDescriptionPtr pStandardDic = pDicDescription->GetAsStandardDictionaryDescription();pStandardDic->LanguageId = FREngine::LI_EnglishUnitedStates;// [facultatif] Spécifiez d’autres propriétés de l’objet BaseLanguagepBaseLang->AllowWordsFromDictionaryOnly = VARIANT_TRUE;// Créez un objet RecognizerParamsFREngine::IRecognizerParamsPtr pParams = Engine->CreateRecognizerParams();// Affectez l’objet TextLanguage créé à la propriété TextLanguagepParams->TextLanguage = pTextLang;...
Code C#
// Objet ABBYY FineReader Engine globalFREngine.IEngine engine;// Objet LanguageDatabaseFREngine.ILanguageDatabase languageDatabase;...// Créer un objet TextLanguage et récupérer sa collection de langues de baseFREngine.ITextLanguage TextLang = languageDatabase.CreateTextLanguage();FREngine.IBaseLanguages BaseLangCollection = TextLang.BaseLanguages;// Créer un objet BaseLanguage et récupérer sa collection de descriptions de dictionnaireFREngine.IBaseLanguage BaseLang = BaseLangCollection.AddNew();BaseLang.InternalName = "SampleBaseLanguage";BaseLang.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, "abc123" );FREngine.IDictionaryDescriptions DictDescCollection = BaseLang.DictionaryDescriptions;// Créer une description de dictionnaire standard et l'ajouter à la collectionFREngine.IDictionaryDescription DicDescription = DictDescCollection.AddNew( FREngine.DictionaryTypeEnum.DT_SystemDictionary );// [facultatif] Indiquer le poids du dictionnaire crééDicDescription.Weight = 100;// Indiquer la propriété d'identification du dictionnaireFREngine.IStandardDictionaryDescription StandardDic = DicDescription.GetAsStandardDictionaryDescription();StandardDic.LanguageId = FREngine.LanguageIdEnum.LI_EnglishUnitedStates;// [facultatif] Indiquer d'autres propriétés de la langue de base BaseLanguageBaseLang.AllowWordsFromDictionaryOnly = true;// Créer un objet RecognizerParamsFREngine.IRecognizerParams recParams = engine.CreateRecognizerParams();// Affecter l'objet TextLanguage créé à la propriété TextLanguagerecParams.TextLanguage = TextLang;...
Un dictionnaire cache est un petit dictionnaire (d’environ une centaine de mots) qui peut être facilement modifié pendant le traitement. Les dictionnaires cache peuvent être utilisés lorsqu’il est possible de sélectionner un dictionnaire de manière plus précise, par exemple si vous obtenez de nouvelles informations sur le document en cours de traitement. Ces dictionnaires conviennent à la reconnaissance au niveau du champ.Par exemple, supposons qu’un formulaire comporte deux champs à reconnaître : le nom d’une ville et le nom d’une rue. Vous avez reconnu le nom de la ville et vous disposez de la liste des rues de cette ville. Dans ce cas, vous pouvez charger dans le dictionnaire cache approprié les noms de rues, puis reconnaître le nom de la rue plus rapidement et avec plus de précision.ABBYY FineReader Engine fournit les méthodes AddWordsToCacheDictionary, AddWordToCacheDictionary et CleanCacheDictionary de l’objet FRPage pour travailler avec les dictionnaires cache.
Pour utiliser le dictionnaire cache, vous devez définir la propriété IEngine::AutoCleanRecognizerSession sur FALSE. La propriété AutoCleanRecognizerSession est définie sur TRUE par défaut, ce qui signifie que FineReader Engine efface sa session de reconnaissance après la reconnaissance de chaque page ; dans ce cas, le dictionnaire cache est lui aussi effacé. Pour éviter toute suppression accidentelle des données utilisateur, FineReader Engine interdit l’utilisation des dictionnaires cache dans ce mode. Si vous utilisez le dictionnaire cache, c’est à vous de nettoyer manuellement la session de reconnaissance en appelant la méthode IEngine::CleanRecognizerSession lorsque nécessaire. Consultez la description de la méthode pour savoir à quel moment il est nécessaire de nettoyer la session de reconnaissance.