跳转到主要内容
C# 示例仅适用于 Windows 版 FRE。
ABBYY FineReader Engine 允许您为识别语言附加各种类型的词典,从而显著提升识别质量。

字典类型

字典可分为多种类型:
对于具有内置字典支持的预定义语言,系统已提供这种类型的字典 (请参见预定义语言列表中的注释) 。此外,某些语言还提供了打包在 .zmd 存档中的专业术语字典 (例如医学和法律术语字典) 。标准字典由三个或四个文件组成。这些文件的名称通常与语言的全称或简称相同,扩展名为 .amd、.amm、.amt 或 .ame。其中,扩展名为 .amd、.amm 和 .amt 的文件始终存在。它们存储在以下文件夹中,且不能更改:Data/ExtendedDictionaries (Linux)、Resources/ExtendedDictionaries (macOS)、Data\ExtendedDictionaries (Windows)。ABBYY FineReader Engine 不提供 .ame 文件:这是一种用于存储字典扩展的格式,也就是用户添加到字典中的单词。您可以在 ABBYY FineReader 中创建字典扩展 (在其中称为用户字典) ,然后将生成的文件复制到上面提到的 ABBYY FineReader Engine 文件夹下的目录中 (或者,也可以在 ILanguageDatabase::DictionaryExtensionsPath 属性中指定其完整路径) 。ABBYY FineReader 将标准字典的扩展存储在 %appdata%\ABBYY\FineReader\15\FineReaderShell\UserDictionaries 中。字典扩展可通过 ILanguageDatabase::OpenDictionaryExtension 方法在 ABBYY FineReader Engine 中进行编辑。这种字典类型由 StandardDictionaryDescription 对象描述。
可使用 Dictionary 对象创建。Dictionary 对象允许您通过其方法添加和删除单词。在 Windows 中,Dictionary 对象还允许您借助 Dictionary 对话框 编辑字典。该对话框支持导入任何采用 Windows ANSI 或 Unicode 编码的文本文件 (唯一要求是单词之间必须用空格或其他非字母字符分隔) 。这种字典类型由 UserDictionaryDescription 对象描述。
FineReader Engine 中的用户字典采用 .amd 文件格式,可为任何语言创建。对于不支持字典的语言,它可以替代标准字典。ABBYY FineReader 的用户字典在 FineReader Engine 中称为字典扩展;它是 .ame 文件,并且只能为支持字典的语言创建,作为该语言标准字典的扩展。
指定用于定义某种语言中哪些单词允许出现、哪些单词不允许出现的规则。这种字典类型由 RegExpDictionaryDescription 对象描述。
允许您实现自己的字典类型。此类字典以 IExternalDictionary 接口的形式表示,并在客户端实现。有关创建外部字典的指导,请参见该接口的说明。这种字典类型由 ExternalDictionaryDescription 对象描述。
ABBYY FineReader Engine 提供了 DictionaryDescription 对象,用于描述所有类型的字典。它是一个基础对象,不同字典类型的描述均继承自它。 所有这些字典描述都是 DictionaryDescriptions 集合中的元素。

创建字典描述

要创建字典描述,可使用 DictionaryDescriptions 对象的 AddNew 方法。该方法返回对 DictionaryDescription 对象的引用。要获取对描述相应字典类型的对象的引用,请使用 DictionaryDescription 对象的 GetAsStandardDictionaryDescriptionGetAsUserDictionaryDescriptionGetAsRegExpDictionaryDescriptionGetAsExternalDictionaryDescription 方法。

字典属性

对于每个字典,都必须指定其标识属性:
  • 对于标准字典 (StandardDictionaryDescription) ,请指定其 LanguageId 属性,该属性定义语言 ID。
  • 对于用户字典 (UserDictionaryDescription) ,请指定其 FileName 属性,该属性提供用户字典的路径。
  • 对于基于正则表达式的字典 (RegExpDictionaryDescription) ,请使用 SetText 方法指定正则表达式。请参阅使用 ABBYY FineReader Engine 正则表达式
  • 对于外部字典 (ExternalDictionaryDescription) ,请使用 SetDictionary 方法指定字典。
所有类型的字典都带有一个权重。字典的权重会影响识别过程中检测到的该字典中单词的权重。权重参数以百分比表示,且必须为非负数。权重为 0 并不自动意味着不存在这样的字典。允许使用超过 100% 的权重,但使用此类参数时必须格外谨慎。权重通过 IDictionaryDescription::Weight 属性指定,默认值为 100。 标准字典还具有 CanUseTrigrams 选项,用于允许或禁止程序使用基于所选字典构建的三元字母组合。三元字母组合是由三个字母组成的组合。并非所有这类组合都会出现在真实单词中。包含非字典三元字母组合的单词很可能无法发音。三元字母组合用于剔除不可靠的单词。我们建议对“通用”标准字典启用三元字母组合,而对术语字典禁用该选项。

识别语言的字典

文本识别语言 (TextLanguage 对象) 既可以有包含该语言词汇的字典,也可以有包含禁用词的字典。前者是为文本语言的每种基础识别语言指定的,可通过 IBaseLanguage::DictionaryDescriptions 属性访问。基础语言也可以不附加任何字典。禁用词字典则通过 ITextLanguage::ProhibitingDictionaries 属性直接附加到文本识别语言。 如果您希望识别过程中只允许使用字典中的词,请将 IBaseLanguage::AllowWordsFromDictionaryOnly 属性设置为 TRUE。在这种情况下,如果某个词在基础语言的字典中找不到,则只有在 ABBYY FineReader Engine 未找到任何字典中的候选词时,它才会出现在识别结果文本中。

如何将字典附加到识别语言

  1. 使用一种可用的方法创建 TextLanguage 对象 (例如,LanguageDatabase 对象的 CreateTextLanguage 方法) 。
  2. 获取新文本语言的基础语言集合 (使用 BaseLanguages 属性) 。
  3. 创建一个新的 BaseLanguage 对象,并将其添加到基础语言集合中。
  4. 获取新基础语言的字典描述集合 (即 DictionaryDescriptions 属性) 。
  5. 创建一个字典描述,并将其添加到该基础语言的字典描述集合中。使用 DictionaryDescriptions 集合的 AddNew 方法。
您可以创建多个不同类型的字典,并将它们添加到同一个基础识别语言的 DictionaryDescriptions 集合中。
  1. [可选] 指定所创建字典的权重。
  2. 指定字典的标识属性:标准字典使用 LanguageId 属性,用户字典使用 FileName 属性,基于正则表达式的字典调用 IRegExpDictionaryDescription::SetText 方法,外部字典调用 IExternalDictionaryDescription::SetDictionary 方法。
  3. [可选] 指定 BaseLanguage 对象的其他属性。
  4. [可选] 使用 TextLanguage 对象的 ProhibitingDictionaries 属性设置禁止字典。
  5. 将创建的 TextLanguage 对象赋给 RecognizerParams 对象的 TextLanguage 属性。
要在 Windows 中实现这些步骤,请参见下面的代码示例。
// 全局 ABBYY FineReader Engine 对象
FREngine::IEnginePtr Engine;
// LanguageDatabase 对象
FREngine::ILanguageDatabasePtr languageDatabase;
...
// 创建一个 TextLanguage 对象并获取其基础语言集合
FREngine::ITextLanguagePtr pTextLang = languageDatabase->CreateTextLanguage();
FREngine::IBaseLanguagesPtr pBaseLangCollection = pTextLang->BaseLanguages;
// 创建一个 BaseLanguage 对象并获取其字典描述集合
FREngine::IBaseLanguagePtr pBaseLang = pBaseLangCollection->AddNew();
pBaseLang->InternalName = L"SampleBaseLanguage";
pBaseLang->PutLetterSet( FREngine::BLLS_Alphabet, L"abc123" );
FREngine::IDictionaryDescriptionsPtr pDictDescCollection = pBaseLang->DictionaryDescriptions;
// 创建一个标准字典描述并将其添加到集合中
FREngine::IDictionaryDescriptionPtr pDicDescription =
 pDictDescCollection->AddNew( FREngine::DT_SystemDictionary);
// [可选] 指定所创建字典的权重
pDicDescription->Weight = 100;
// 指定字典的标识属性
FREngine::IStandardDictionaryDescriptionPtr pStandardDic = pDicDescription->GetAsStandardDictionaryDescription();
pStandardDic->LanguageId = FREngine::LI_EnglishUnitedStates;
// [可选] 指定 BaseLanguage 的其他属性
pBaseLang->AllowWordsFromDictionaryOnly = VARIANT_TRUE;
// 创建一个 RecognizerParams 对象
FREngine::IRecognizerParamsPtr pParams = Engine->CreateRecognizerParams();
// 将创建的 TextLanguage 对象赋给 TextLanguage 属性
pParams->TextLanguage = pTextLang;
...
// 全局 ABBYY FineReader Engine 对象
FREngine.IEngine engine;
// LanguageDatabase 对象
FREngine.ILanguageDatabase languageDatabase;
...
// 创建一个 TextLanguage 对象,并获取其基础语言集合
FREngine.ITextLanguage TextLang = languageDatabase.CreateTextLanguage();
FREngine.IBaseLanguages BaseLangCollection = TextLang.BaseLanguages;
// 创建一个 BaseLanguage 对象,并获取其字典描述集合
FREngine.IBaseLanguage BaseLang = BaseLangCollection.AddNew();
BaseLang.InternalName = "SampleBaseLanguage";
BaseLang.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, "abc123" );
FREngine.IDictionaryDescriptions DictDescCollection = BaseLang.DictionaryDescriptions;
// 创建标准字典描述并将其添加到集合中
FREngine.IDictionaryDescription DicDescription = DictDescCollection.AddNew( FREngine.DictionaryTypeEnum.DT_SystemDictionary );
// [可选] 指定所创建字典的权重
DicDescription.Weight = 100;
// 指定字典的标识属性
FREngine.IStandardDictionaryDescription StandardDic = DicDescription.GetAsStandardDictionaryDescription();
StandardDic.LanguageId = FREngine.LanguageIdEnum.LI_EnglishUnitedStates;
// [可选] 指定 BaseLanguage 的其他属性
BaseLang.AllowWordsFromDictionaryOnly = true;
// 创建一个 RecognizerParams 对象
FREngine.IRecognizerParams recParams = engine.CreateRecognizerParams();
// 将创建的 TextLanguage 对象赋值给 TextLanguage 属性
recParams.TextLanguage = TextLang;
...

缓存字典

缓存字典是一种小型字典 (约含一百个词) ,可在处理过程中方便地修改。当可以更精确地选择字典时,可以使用缓存字典。例如,如果您在处理过程中发现了有关文档的新信息,就可以使用缓存字典。这类字典适用于字段级识别。 例如,假设表单上有两个需要识别的字段:城市名称和街道名称。您已经识别出了城市名称,并且有该城市的街道列表。在这种情况下,您可以加载包含街道名称的相应缓存字典,从而更快、更准确地识别街道名称。 ABBYY FineReader Engine 提供了 FRPage 对象的 AddWordsToCacheDictionaryAddWordToCacheDictionaryCleanCacheDictionary 方法,用于操作缓存字典。
要使用缓存字典,您应将 IEngine::AutoCleanRecognizerSession 属性设置为 FALSE。默认情况下,AutoCleanRecognizerSession 属性设置为 TRUE,这意味着 FineReader Engine 会在每页识别完成后清理识别会话,在这种情况下,缓存字典也会一并清理。为防止用户数据被意外销毁,FineReader Engine 禁止在此模式下使用缓存字典。如果您使用缓存字典,则需要由您在必要时调用 IEngine::CleanRecognizerSession 方法手动清理识别会话。有关何时需要清理识别会话,请参阅该方法的说明。

另请参阅

处理语言 识别包含空格的单词