Vai al contenuto principale
ABBYY FineReader Engine consente di aggiungere a un dizionario parole contenenti spazi. Questa funzionalità può risultare molto utile per verificare parole come “New York”. Si consiglia di utilizzare un dizionario per le parole con spazi durante il riconoscimento a livello di field, quando è possibile riconoscere i field (piccole porzioni di immagine che contengono brevi frammenti di testo) utilizzando informazioni specifiche sul tipo di dati che possono contenere. La parola “New York”, ad esempio, può essere utile durante il riconoscimento degli indirizzi. Per riconoscere parole con spazi, procedere come segue:
  1. Aggiungere il carattere “spazio” all’alfabeto della lingua corrente.
  2. Aggiungere al dizionario le parole con spazi necessarie.
  3. Impostare su TRUE la proprietà OneWordPerLine dell’oggetto RecognizerParams.
Di seguito è riportata una descrizione dettagliata di questa operazione:
  1. Creare una nuova lingua di testo basata su una lingua predefinita. A tale scopo, creare un oggetto TextLanguage utilizzando il metodo CreateTextLanguage dell’oggetto LanguageDatabase e copiarne gli attributi.
  2. Aggiungere il carattere “spazio” all’oggetto BaseLanguage all’interno dell’oggetto TextLanguage, utilizzando la proprietà LetterSet dell’oggetto BaseLanguage.
  3. Creare un nuovo dizionario e aggiungervi tutte le parole con spazi necessarie. A questo scopo, è possibile utilizzare l’oggetto Dictionary.
  4. Creare un oggetto UserDictionaryDescription. Assegnare il percorso del nuovo dizionario alla proprietà FileName di questo oggetto.
  5. Aggiungere l’oggetto UserDictionaryDescription alla raccolta DictionaryDescriptions dell’oggetto BaseLanguage.
  6. Nell’oggetto RecognizerParams di tutti i blocchi di testo, assegnare l’oggetto TextLanguage creato in precedenza alla proprietà TextLanguage e il valore TRUE alla proprietà OneWordPerLine.
Di seguito è riportato un esempio in cui il carattere “spazio” è stato aggiunto all’alfabeto della lingua inglese e la parola “New York” è stata aggiunta al dizionario.
// Crea un oggetto LanguageDatabase
FREngine::ILanguageDatabasePtr pLanguageDatabase = Engine->CreateLanguageDatabase();
// Crea un nuovo oggetto TextLanguage
FREngine::ITextLanguagePtr pTextLanguage = pLanguageDatabase->CreateTextLanguage();
// Copia tutti gli attributi dalla lingua inglese predefinita
FREngine::ITextLanguagePtr pEnglishLanguage =
          Engine->PredefinedLanguages->Find( "English" )->TextLanguage;
pTextLanguage->CopyFrom( pEnglishLanguage );
pTextLanguage->InternalName = L"SampleTL";
// Associa il nuovo dizionario al primo (e unico) oggetto BaseLanguage all'interno di TextLanguage
FREngine::IBaseLanguagePtr pBaseLanguage = pTextLanguage->BaseLanguages->Item(0);
// Modifica il nome interno del dizionario assegnandogli un nome definito dall'utente
pBaseLanguage->InternalName = L"SampleBL"; 
// Aggiunge il carattere "spazio"
_bstr_t alphabet = pBaseLanguage->GetLetterSet( FREngine::BLLS_Alphabet );
pBaseLanguage->put_LetterSet( FREngine::BLLS_Alphabet, alphabet + L" " );
 
// Crea un nuovo dizionario
_bstr_t dictionaryFile = L"D:\\sample.amd";
FREngine::IDictionaryPtr pDictionary =
pLanguageDatabase->CreateNewDictionary( dictionaryFile, FREngine::LI_EnglishUnitedStates );
pDictionary->Name = L"Sample";
// Aggiunge al dizionario parole che contengono spazi
pDictionary->AddWord( "New York", 100 );
// Ottiene la raccolta delle descrizioni del dizionario e rimuove tutti gli elementi
FREngine::IDictionaryDescriptionsPtr pDictionaryDescriptions =
 pBaseLanguage->DictionaryDescriptions;
pDictionaryDescriptions->DeleteAll();
// Crea una descrizione di dizionario utente e la aggiunge alla raccolta
FREngine::IDictionaryDescriptionPtr dic =
 pDictionaryDescriptions->AddNew(FREngine::DT_UserDictionary);
// Specifica il percorso del dizionario che contiene parole con spazi
FREngine::IUserDictionaryDescriptionPtr userDic =
 dic->GetAsUserDictionaryDescription();
userDic->FileName = dictionaryFile;
FREngine::ILayoutPtr pLayout;
...
// Specifica le proprietà dell'oggetto RecognizerParams per tutti i blocchi di testo
// Scorre i blocchi
for( int i = pLayout->Blocks->Count - 1; i >= 0; i-- ) {
  FREngine::BlockTypeEnum blockType = pLayout->Blocks->Item( i )->Type;
  // Individua il blocco di testo
  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;
  }
}
...
// Crea un oggetto LanguageDatabase
FREngine.ILanguageDatabase languageDatabase = engineLoader.Engine.CreateLanguageDatabase();
// Crea un nuovo oggetto TextLanguage
FREngine.ITextLanguage textLanguage = languageDatabase.CreateTextLanguage();
// Copia tutti gli attributi dalla lingua inglese predefinita
FREngine.ITextLanguage englishLanguage = engineLoader.Engine.PredefinedLanguages.Find( "English" ).TextLanguage;
textLanguage.CopyFrom( englishLanguage );
textLanguage.InternalName = "SampleTL";
// Associa il nuovo dizionario al primo (e unico) oggetto BaseLanguage all'interno di TextLanguage
FREngine.IBaseLanguage baseLanguage = textLanguage.BaseLanguages[0];
// Sostituisce il nome interno del dizionario con un nome definito dall'utente
baseLanguage.InternalName = "SampleBL";
// Aggiunge il carattere "spazio"
string alphabet = baseLanguage.get_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet );
baseLanguage.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, alphabet + " " );
// Crea un nuovo dizionario
string dictionaryFilePath = "D:\\sample.amd";
FREngine.IDictionary dictionary = languageDatabase.CreateNewDictionary( dictionaryFilePath, FREngine.LanguageIdEnum.LI_EnglishUnitedStates );
dictionary.Name = "Sample";
// Aggiunge al dizionario parole contenenti spazi
dictionary.AddWord( "New York", 100 );
// Ottiene la raccolta delle descrizioni dei dizionari e rimuove tutti gli elementi
FREngine.IDictionaryDescriptions dictionaryDescriptions = baseLanguage.DictionaryDescriptions;
dictionaryDescriptions.DeleteAll();
// Crea una descrizione di dizionario utente e la aggiunge alla raccolta
FREngine.IDictionaryDescription dic = dictionaryDescriptions.AddNew(FREngine.DictionaryTypeEnum.DT_UserDictionary);
// Specifica il percorso del dizionario che contiene parole con spazi
FREngine.IUserDictionaryDescription userDic = dic.GetAsUserDictionaryDescription();
userDic.FileName = dictionaryFilePath;
FREngine.ILayout layout;
...
// Specifica le proprietà dell'oggetto RecognizerParams per tutti i blocchi di testo
// Scorre i blocchi
for( int i = layout.Blocks.Count - 1; i >= 0; i-- ) {
    FREngine.IBlockTypeEnum blockType = layout.Blocks[i].Type;
    // Individua il blocco di testo
    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;
    }
}
...

Vedi anche

Lavorare con le lingue Lavorare con i dizionari Riconoscimento a livello di field