跳轉到主要內容
ABBYY FineReader Engine 可讓您將含空格的字詞加入字典。這項功能對於檢查像「New York」這類詞非常實用。我們建議在欄位層級辨識時,對含空格的字詞使用字典;在這種情況下,您可以根據欄位可能包含的資料類型,利用特定資訊來辨識欄位 (包含短文字片段的小型影像區塊) 。例如,如果您正在辨識地址,「New York」這個詞就可能很有幫助。 若要辨識含空格的字詞,請執行下列操作:
  1. 將「space」字元新增至目前語言的字母表。
  2. 將所需的含空格字詞加入字典。
  3. RecognizerParams 物件的 OneWordPerLine 屬性設為 TRUE。
以下是此操作的詳細說明:
  1. 預先定義語言為基礎建立新的文字語言。若要這麼做,請使用 LanguageDatabase 物件的 CreateTextLanguage 方法建立 TextLanguage 物件,並複製預先定義語言的屬性。
  2. 使用 BaseLanguage 物件的 LetterSet 屬性,將「space」字元新增至 TextLanguage 物件中的 BaseLanguage 物件。
  3. 建立新的字典,並將所有需要的含空格字詞加入此字典。您可以使用 Dictionary 物件來完成此操作。
  4. 建立 UserDictionaryDescription 物件。將新字典的路徑指定給此物件的 FileName 屬性。
  5. 將 UserDictionaryDescription 物件加入 BaseLanguage 物件的 DictionaryDescriptions 集合。
  6. 在所有文字區塊的 RecognizerParams 物件中,將先前建立的 TextLanguage 物件指定給 TextLanguage 屬性,並將 OneWordPerLine 屬性設為 TRUE。
下面您可以看到一個範例,其中已將「space」字元新增至英文字母表,並將「New York」這個詞加入字典。
// 建立 LanguageDatabase 物件
FREngine::ILanguageDatabasePtr pLanguageDatabase = Engine->CreateLanguageDatabase();
// 建立新的 TextLanguage 物件
FREngine::ITextLanguagePtr pTextLanguage = pLanguageDatabase->CreateTextLanguage();
// 從預先定義的 English 語言複製所有屬性
FREngine::ITextLanguagePtr pEnglishLanguage =
          Engine->PredefinedLanguages->Find( "English" )->TextLanguage;
pTextLanguage->CopyFrom( pEnglishLanguage );
pTextLanguage->InternalName = L"SampleTL";
// 將新字典繫結到 TextLanguage 中的第一個(也是唯一一個)BaseLanguage 物件
FREngine::IBaseLanguagePtr pBaseLanguage = pTextLanguage->BaseLanguages->Item(0);
// 將內部字典名稱變更為使用者自訂的名稱
pBaseLanguage->InternalName = L"SampleBL"; 
// 新增空格字元
_bstr_t alphabet = pBaseLanguage->GetLetterSet( FREngine::BLLS_Alphabet );
pBaseLanguage->put_LetterSet( FREngine::BLLS_Alphabet, alphabet + L" " );
 
// 建立新字典
_bstr_t dictionaryFile = L"D:\\sample.amd";
FREngine::IDictionaryPtr pDictionary =
pLanguageDatabase->CreateNewDictionary( dictionaryFile, FREngine::LI_EnglishUnitedStates );
pDictionary->Name = L"Sample";
// 將含空格的字詞新增到字典中
pDictionary->AddWord( "New York", 100 );
// 取得字典描述集合並刪除所有項目
FREngine::IDictionaryDescriptionsPtr pDictionaryDescriptions =
 pBaseLanguage->DictionaryDescriptions;
pDictionaryDescriptions->DeleteAll();
// 建立使用者字典描述並將其加入集合
FREngine::IDictionaryDescriptionPtr dic =
 pDictionaryDescriptions->AddNew(FREngine::DT_UserDictionary);
// 指定包含含空格字詞的字典路徑
FREngine::IUserDictionaryDescriptionPtr userDic =
 dic->GetAsUserDictionaryDescription();
userDic->FileName = dictionaryFile;
FREngine::ILayoutPtr pLayout;
...
// 指定所有文字區塊的 RecognizerParams 物件屬性
// 逐一巡覽區塊
for( int i = pLayout->Blocks->Count - 1; i >= 0; i-- ) {
  FREngine::BlockTypeEnum blockType = pLayout->Blocks->Item( i )->Type;
  // 找出文字區塊
  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;
  }
}
...
// 建立 LanguageDatabase 物件
FREngine.ILanguageDatabase languageDatabase = engineLoader.Engine.CreateLanguageDatabase();
// 建立新的 TextLanguage 物件
FREngine.ITextLanguage textLanguage = languageDatabase.CreateTextLanguage();
// 從預先定義的英文語言複製所有屬性
FREngine.ITextLanguage englishLanguage = engineLoader.Engine.PredefinedLanguages.Find( "English" ).TextLanguage;
textLanguage.CopyFrom( englishLanguage );
textLanguage.InternalName = "SampleTL";
// 將新字典繫結至 TextLanguage 中第一個(也是唯一一個)BaseLanguage 物件
FREngine.IBaseLanguage baseLanguage = textLanguage.BaseLanguages[0];
// 將內部字典名稱變更為使用者自訂的名稱
baseLanguage.InternalName = "SampleBL";
// 新增空格字元
string alphabet = baseLanguage.get_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet );
baseLanguage.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, alphabet + " " );
// 建立新字典
string dictionaryFilePath = "D:\\sample.amd";
FREngine.IDictionary dictionary = languageDatabase.CreateNewDictionary( dictionaryFilePath, FREngine.LanguageIdEnum.LI_EnglishUnitedStates );
dictionary.Name = "Sample";
// 將含有空格的字詞新增至字典
dictionary.AddWord( "New York", 100 );
// 取得字典描述集合並刪除所有項目
FREngine.IDictionaryDescriptions dictionaryDescriptions = baseLanguage.DictionaryDescriptions;
dictionaryDescriptions.DeleteAll();
// 建立使用者字典描述並將其新增至集合
FREngine.IDictionaryDescription dic = dictionaryDescriptions.AddNew(FREngine.DictionaryTypeEnum.DT_UserDictionary);
// 指定包含含空格字詞之字典的路徑
FREngine.IUserDictionaryDescription userDic = dic.GetAsUserDictionaryDescription();
userDic.FileName = dictionaryFilePath;
FREngine.ILayout layout;
...
// 指定所有文字區塊之 RecognizerParams 物件的屬性
// 逐一疊代區塊
for( int i = layout.Blocks.Count - 1; i >= 0; i-- ) {
    FREngine.IBlockTypeEnum blockType = layout.Blocks[i].Type;
    // 尋找文字區塊
    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;
    }
}
...

另請參閱

處理語言 使用字典 欄位層級辨識