메인 콘텐츠로 건너뛰기
ABBYY FineReader Engine에서는 공백이 있는 단어를 사전에 추가할 수 있습니다. 이 기능은 “New York”과 같은 단어를 검사할 때 매우 유용합니다. 필드 수준 인식에서는 공백이 있는 단어용 사전을 사용하는 것이 좋습니다. 이 경우 필드(짧은 텍스트 조각이 들어 있는 작은 이미지 조각)에 포함될 수 있는 데이터 유형에 대한 특정 정보를 바탕으로 필드를 인식할 수 있기 때문입니다. 예를 들어 주소를 인식하는 경우 “New York”이라는 단어가 유용할 수 있습니다. 공백이 있는 단어를 인식하려면 다음과 같이 하십시오.
  1. 현재 언어의 알파벳에 “space” 문자를 추가합니다.
  2. 필요한 공백 포함 단어를 사전에 추가합니다.
  3. RecognizerParams 객체의 OneWordPerLine 속성을 TRUE로 설정합니다.
아래에는 이 작업에 대한 자세한 설명이 나와 있습니다.
  1. predefined language를 기반으로 새 텍스트 언어를 만듭니다. 이렇게 하려면 LanguageDatabase 객체의 CreateTextLanguage 메서드를 사용하여 TextLanguage 객체를 만들고, 미리 정의된 언어의 속성을 복사합니다.
  2. BaseLanguage 객체의 LetterSet 속성을 사용하여 TextLanguage 객체 내 BaseLanguage 객체에 “space” 문자를 추가합니다.
  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();
// 미리 정의된 영어 언어의 모든 속성을 복사합니다
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();
// 미리 정의된 English 언어의 모든 속성을 복사합니다.
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;
    }
}
...

참고 항목

언어 작업 사전 작업 필드 수준 인식