メインコンテンツへスキップ
ABBYY FineReader Engine では、スペースを含む単語を辞書に追加できます。この機能は、「New York」のような単語をチェックする際に非常に便利です。スペースを含む単語用の辞書は、field レベルの認識で使用することをお勧めします。これは、field (短いテキストフラグメントを含む小さな画像片) にどのような種類のデータが含まれ得るかという特定の情報を利用して認識できる場合に特に有効です。たとえば、「New York」という単語は、住所を認識する際に役立つことがあります。 スペースを含む単語を認識するには、次の操作を行います。
  1. 現在の言語のアルファベットにスペース文字を追加します。
  2. 必要なスペース付きの単語を辞書に追加します。
  3. RecognizerParams オブジェクトの OneWordPerLine プロパティを TRUE に設定します。
以下では、この操作について詳しく説明します。
  1. predefined language に基づいて新しい Text 言語を作成します。これを行うには、LanguageDatabase オブジェクトの CreateTextLanguage メソッドを使用して TextLanguage オブジェクトを作成し、predefined language の属性をコピーします。
  2. TextLanguage オブジェクト内の BaseLanguage オブジェクトにスペース文字を追加します。これは、BaseLanguage オブジェクトの LetterSet プロパティを使用して行います。
  3. 新しい辞書を作成し、必要なスペース付きの単語をすべてこの辞書に追加します。これには Dictionary オブジェクトを使用できます。
  4. UserDictionaryDescription オブジェクトを作成します。このオブジェクトの FileName プロパティに、新しい辞書へのパスを割り当てます。
  5. UserDictionaryDescription オブジェクトを、BaseLanguage オブジェクトの DictionaryDescriptions collection に追加します。
  6. すべてのテキストブロックの RecognizerParams オブジェクトで、先に作成した TextLanguage オブジェクトを TextLanguage プロパティに、TRUE を OneWordPerLine プロパティに割り当てます。
以下に、スペース文字が英語のアルファベットに追加され、「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();
// 定義済みの英語言語からすべての属性をコピーします
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;
    }
}
...

関連項目

言語の扱い 辞書の扱い field レベルの認識