跳转到主要内容
ABBYY FineReader Engine 允许您向词典中添加带空格的单词。此功能对于检查诸如“New York”之类的词非常有用。我们建议您在字段级识别时,对这类带空格的词使用词典;前提是您能够根据字段中可能包含的数据类型等特定信息来识别这些字段 (即包含短文本片段的小图像块) 。例如,如果您要识别地址,“New York”这个词就可能很有用。 要识别带空格的单词,请执行以下操作:
  1. 将“空格”字符添加到当前语言的字母表中。
  2. 将所需的带空格单词添加到词典中。
  3. RecognizerParams 对象的 OneWordPerLine 属性设置为 TRUE。
下面是此操作的详细说明:
  1. 基于一种预定义语言创建新的文本语言。为此,请使用 LanguageDatabase 对象的 CreateTextLanguage 方法创建一个 TextLanguage 对象,并复制该预定义语言的属性。
  2. 使用 BaseLanguage 对象的 LetterSet 属性,将“空格”字符添加到 TextLanguage 对象中的 BaseLanguage 对象。
  3. 创建一个新词典,并将所有必需的带空格单词添加到该词典中。您可以使用 Dictionary 对象来完成此操作。
  4. 创建一个 UserDictionaryDescription 对象。将新词典的路径赋给该对象的 FileName 属性。
  5. 将 UserDictionaryDescription 对象添加到 BaseLanguage 对象的 DictionaryDescriptions 集合中。
  6. 在所有文本块的 RecognizerParams 对象中,将先前创建的 TextLanguage 对象赋给 TextLanguage 属性,并将 OneWordPerLine 属性设置为 TRUE。
下面您可以看到一个示例,其中“空格”字符已添加到英语字母表中,并且单词“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;
    }
}
...

另请参见

使用语言 使用词典 字段级识别