Passer au contenu principal
ABBYY FineReader Engine vous permet d’ajouter à un dictionnaire des mots contenant des espaces. Cette fonctionnalité peut être très utile pour vérifier des mots comme “New York”. Nous vous recommandons d’utiliser un dictionnaire pour les mots contenant des espaces lors de la Field-Level Recognition, lorsque vous pouvez reconnaître les champs (petites portions d’image contenant de courts fragments de texte) à l’aide d’informations spécifiques sur le type de données qu’ils peuvent contenir. Le mot “New York”, par exemple, peut être utile si vous reconnaissez des adresses. Pour reconnaître des mots avec des espaces, procédez comme suit :
  1. Ajoutez le caractère “espace” à l’alphabet de la langue active.
  2. Ajoutez au dictionnaire les mots contenant des espaces nécessaires.
  3. Définissez la propriété OneWordPerLine de l’objet RecognizerParams sur TRUE.
Vous trouverez ci-dessous une description détaillée de cette opération :
  1. Créez une nouvelle langue de texte à partir d’une langue prédéfinie. Pour ce faire, créez un objet TextLanguage à l’aide de la méthode CreateTextLanguage de l’objet LanguageDatabase, puis copiez les attributs de la langue prédéfinie.
  2. Ajoutez le caractère “espace” à l’objet BaseLanguage de l’objet TextLanguage, à l’aide de la propriété LetterSet de l’objet BaseLanguage.
  3. Créez un nouveau Dictionary et ajoutez-y tous les mots contenant des espaces nécessaires. Vous pouvez utiliser l’objet Dictionary pour cela.
  4. Créez un objet UserDictionaryDescription. Assignez le chemin du nouveau Dictionary à la propriété FileName de cet objet.
  5. Ajoutez l’objet UserDictionaryDescription à la collection DictionaryDescriptions de l’objet BaseLanguage.
  6. Dans l’objet RecognizerParams de tous les blocs de texte, assignez l’objet TextLanguage créé précédemment à la propriété TextLanguage et la valeur TRUE à la propriété OneWordPerLine.
Vous trouverez ci-dessous un exemple dans lequel le caractère “espace” a été ajouté à l’alphabet de la langue anglaise et le mot “New York” a été ajouté au Dictionary.
// Créer un objet LanguageDatabase
FREngine::ILanguageDatabasePtr pLanguageDatabase = Engine->CreateLanguageDatabase();
// Créer un objet TextLanguage
FREngine::ITextLanguagePtr pTextLanguage = pLanguageDatabase->CreateTextLanguage();
// Copier tous les attributs de la langue anglaise prédéfinie
FREngine::ITextLanguagePtr pEnglishLanguage =
          Engine->PredefinedLanguages->Find( "English" )->TextLanguage;
pTextLanguage->CopyFrom( pEnglishLanguage );
pTextLanguage->InternalName = L"SampleTL";
// Associer le nouveau Dictionary au premier objet BaseLanguage (et unique) dans TextLanguage
FREngine::IBaseLanguagePtr pBaseLanguage = pTextLanguage->BaseLanguages->Item(0);
// Remplacer le nom interne du Dictionary par un nom défini par l'utilisateur
pBaseLanguage->InternalName = L"SampleBL"; 
// Ajouter le caractère « espace »
_bstr_t alphabet = pBaseLanguage->GetLetterSet( FREngine::BLLS_Alphabet );
pBaseLanguage->put_LetterSet( FREngine::BLLS_Alphabet, alphabet + L" " );
 
// Créer un nouveau Dictionary
_bstr_t dictionaryFile = L"D:\\sample.amd";
FREngine::IDictionaryPtr pDictionary =
pLanguageDatabase->CreateNewDictionary( dictionaryFile, FREngine::LI_EnglishUnitedStates );
pDictionary->Name = L"Sample";
// Ajouter au Dictionary des mots contenant des espaces
pDictionary->AddWord( "New York", 100 );
// Récupérer la collection des descriptions de Dictionary et supprimer tous les éléments
FREngine::IDictionaryDescriptionsPtr pDictionaryDescriptions =
 pBaseLanguage->DictionaryDescriptions;
pDictionaryDescriptions->DeleteAll();
// Créer une description de Dictionary utilisateur et l'ajouter à la collection
FREngine::IDictionaryDescriptionPtr dic =
 pDictionaryDescriptions->AddNew(FREngine::DT_UserDictionary);
// Indiquer le chemin vers le Dictionary qui contient des mots avec des espaces
FREngine::IUserDictionaryDescriptionPtr userDic =
 dic->GetAsUserDictionaryDescription();
userDic->FileName = dictionaryFile;
FREngine::ILayoutPtr pLayout;
...
// Définir les propriétés de l'objet RecognizerParams pour tous les blocs de texte
// Parcourir les blocs
for( int i = pLayout->Blocks->Count - 1; i >= 0; i-- ) {
  FREngine::BlockTypeEnum blockType = pLayout->Blocks->Item( i )->Type;
  // Rechercher le bloc de texte
  if( blockType != FREngine::BT_Text ) {
    pLayout->Blocks->DeleteAt(i);
  } else {
    pLayout->Blocks->Item(i)->GetAsTextBlock()->RecognizerParams->
 TextLanguage = pTextLanguage;
    pLayout->Blocks->Item(i)->GetAsTextBlock()->RecognizerParams->
 OneWordPerLine = VARIANT_TRUE;
  }
}
...
// Créer un objet LanguageDatabase
FREngine.ILanguageDatabase languageDatabase = engineLoader.Engine.CreateLanguageDatabase();
// Créer un objet TextLanguage
FREngine.ITextLanguage textLanguage = languageDatabase.CreateTextLanguage();
// Copier tous les attributs de la langue anglaise prédéfinie
FREngine.ITextLanguage englishLanguage = engineLoader.Engine.PredefinedLanguages.Find( "English" ).TextLanguage;
textLanguage.CopyFrom( englishLanguage );
textLanguage.InternalName = "SampleTL";
// Associer le nouveau Dictionary au premier objet BaseLanguage (et au seul) de TextLanguage
FREngine.IBaseLanguage baseLanguage = textLanguage.BaseLanguages[0];
// Remplacer le nom interne du Dictionary par un nom défini par l'utilisateur
baseLanguage.InternalName = "SampleBL";
// Ajouter le caractère "espace"
string alphabet = baseLanguage.get_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet );
baseLanguage.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, alphabet + " " );
// Créer un nouveau Dictionary
string dictionaryFilePath = "D:\\sample.amd";
FREngine.IDictionary dictionary = languageDatabase.CreateNewDictionary( dictionaryFilePath, FREngine.LanguageIdEnum.LI_EnglishUnitedStates );
dictionary.Name = "Sample";
// Ajouter au Dictionary des mots contenant un espace
dictionary.AddWord( "New York", 100 );
// Récupérer la collection de descriptions de Dictionary et supprimer tous ses éléments
FREngine.IDictionaryDescriptions dictionaryDescriptions = baseLanguage.DictionaryDescriptions;
dictionaryDescriptions.DeleteAll();
// Créer une description de Dictionary utilisateur et l'ajouter à la collection
FREngine.IDictionaryDescription dic = dictionaryDescriptions.AddNew(FREngine.DictionaryTypeEnum.DT_UserDictionary);
// Indiquer le chemin du Dictionary contenant des mots avec des espaces
FREngine.IUserDictionaryDescription userDic = dic.GetAsUserDictionaryDescription();
userDic.FileName = dictionaryFilePath;
FREngine.ILayout layout;
...
// Définir les propriétés de l'objet RecognizerParams pour tous les blocs de texte
// Parcourir les blocs
for( int i = layout.Blocks.Count - 1; i >= 0; i-- ) {
    FREngine.IBlockTypeEnum blockType = layout.Blocks[i].Type;
    // Rechercher le bloc de texte
    if( blockType != FREngine.BlockTypeEnum.BT_Text ) {
        layout.Blocks.DeleteAt(i);
    } else {
        layout.Blocks[i].GetAsTextBlock().RecognizerParams.TextLanguage = textLanguage;
        layout.Blocks[i].GetAsTextBlock().RecognizerParams.OneWordPerLine = true;
    }
}
...

Voir aussi

Utilisation des langues Utilisation des Dictionaries Reconnaissance champ par champ