> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# スペースを含む単語の認識

> 言語のアルファベット、辞書、および OneWordPerLine にスペース文字を追加することで、ABBYY FineReader Engine でスペースを含む単語（「New York」など）を認識します。

ABBYY FineReader Engine では、スペースを含む単語を辞書に追加できます。この機能は、「New York」のような単語をチェックする際に非常に便利です。スペースを含む単語用の辞書は、field レベルの認識で使用することをお勧めします。これは、field (短いテキストフラグメントを含む小さな画像片) にどのような種類のデータが含まれ得るかという特定の情報を利用して認識できる場合に特に有効です。たとえば、「New York」という単語は、住所を認識する際に役立つことがあります。

スペースを含む単語を認識するには、次の操作を行います。

1. 現在の言語のアルファベットにスペース文字を追加します。
2. 必要なスペース付きの単語を辞書に追加します。
3. [RecognizerParams](/ja/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/recognizerparams) オブジェクトの [OneWordPerLine](/ja/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/recognizerparams#onewordperline) プロパティを TRUE に設定します。

以下では、この操作について詳しく説明します。

1. [predefined language](/ja/fine-reader/engine/specifications/predefined-languages) に基づいて新しい Text 言語を作成します。これを行うには、[LanguageDatabase](/ja/fine-reader/engine/api-reference/language-related-objects/languagedatabase) オブジェクトの [CreateTextLanguage](/ja/fine-reader/engine/api-reference/language-related-objects/languagedatabase/createtextlanguage-method) メソッドを使用して [TextLanguage](/ja/fine-reader/engine/api-reference/language-related-objects/textlanguage) オブジェクトを作成し、predefined language の属性をコピーします。
2. TextLanguage オブジェクト内の [BaseLanguage](/ja/fine-reader/engine/api-reference/language-related-objects/baselanguage) オブジェクトにスペース文字を追加します。これは、BaseLanguage オブジェクトの [LetterSet](/ja/fine-reader/engine/api-reference/language-related-objects/baselanguage/letterset-property) プロパティを使用して行います。
3. 新しい辞書を作成し、必要なスペース付きの単語をすべてこの辞書に追加します。これには [Dictionary](/ja/fine-reader/engine/api-reference/language-related-objects/dictionary) オブジェクトを使用できます。
4. [UserDictionaryDescription](/ja/fine-reader/engine/api-reference/language-related-objects/userdictionarydescription) オブジェクトを作成します。このオブジェクトの [FileName](/ja/fine-reader/engine/api-reference/language-related-objects/userdictionarydescription#filename) プロパティに、新しい辞書へのパスを割り当てます。
5. UserDictionaryDescription オブジェクトを、BaseLanguage オブジェクトの [DictionaryDescriptions](/ja/fine-reader/engine/api-reference/language-related-objects/baselanguage#dictionarydescriptions) collection に追加します。
6. すべてのテキストブロックの [RecognizerParams](/ja/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/recognizerparams) オブジェクトで、先に作成した TextLanguage オブジェクトを [TextLanguage](/ja/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/recognizerparams#textlanguage) プロパティに、TRUE を [OneWordPerLine](/ja/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/recognizerparams#onewordperline) プロパティに割り当てます。

以下に、スペース文字が英語のアルファベットに追加され、「New York」という単語が辞書に追加されたサンプルを示します。

<Accordion title="C++ (COM) コード">
  ```cpp theme={null}
  // 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;
    }
  }
  ...
  ```
</Accordion>

<Accordion title="C# コード">
  ```csharp theme={null}
  // 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;
      }
  }
  ...
  ```
</Accordion>

<div id="see-also">
  ## 関連項目
</div>

[言語の扱い](/ja/fine-reader/engine/guided-tour/advanced-techniques/working-with-languages)

[辞書の扱い](/ja/fine-reader/engine/guided-tour/advanced-techniques/working-with-dictionaries)

[field レベルの認識](/ja/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/field-level-recognition)
