- 创建分类数据库
- 对文档进行分类
场景实现
本主题中提供的代码示例仅适用于 Windows。
步骤 1. 加载 ABBYY FineReader Engine
步骤 1. 加载 ABBYY FineReader Engine
要开始使用 ABBYY FineReader Engine,您需要创建 Engine 对象。Engine 对象是 ABBYY FineReader Engine 对象层次结构中的顶层对象,提供各种全局设置、一些处理方法,以及用于创建其他对象的方法。要创建 Engine 对象,您可以使用 InitializeEngine 函数。另请参阅 加载 Engine 对象的其他方式 (Win) 。
C#
步骤 2. 创建 ClassificationEngine
步骤 2. 创建 ClassificationEngine
创建 ClassificationEngine 对象,它可作为其他 Classification API 对象的工厂。请使用 Engine 对象的 CreateClassificationEngine 方法。
C#
步骤 3. 准备分类对象
步骤 3. 准备分类对象
训练和分类方法使用一种从文档或页面创建的特殊对象:ClassificationObject,其中包含与分类相关的所有信息。要为分类场景准备文档,请按以下步骤操作:
- 加载待处理图像。可通过多种方式完成,例如,借助 Engine 对象的 CreateFRDocument 方法创建 FRDocument 对象,然后使用 AddImageFile 方法从文件向创建好的 FRDocument 对象中添加图像。
- 如果要训练或使用会考虑文本特征的分类器类型 (CT_Combined、CT_Text) ,请先通过任意方便的方法识别文档。这里我们将使用 FRDocument 对象的 Analyze 和 Recognize 方法。分类不需要进行文档合成。
虽然分类本身不支持并行处理,但在 Windows 和 Linux 中,对文档进行前期识别准备时,你可能需要使用并行处理。如果待分类的文档数量较多,建议使用 Batch Processor 或 Parallel Processing with ABBYY FineReader Engine 中介绍的其他并行处理方法。
- 使用 ClassificationEngine 对象的 CreateObjectFromDocument 方法,创建包含文档第一页信息的 ClassificationObject。如果需要使用文档中的其他页面,请调用 CreateObjectFromPage 方法。
- 默认情况下,ClassificationObject 的 Description 属性为空。如果需要相关描述,请设置此属性。
有时会出现这样的情况:识别后的文档或页面实际上不包含任何已识别文本 (例如,误用了空白页) 。在这种情况下,ClassificationObject 不能用于需要文本特征的分类器。你可以使用其 SuitableClassifiers 属性再次检查。
C#
第 4 步:创建训练数据集
第 4 步:创建训练数据集
要训练一个能够区分多种文档类型的分类器,你需要一个按类别组织的数据集,其中包含每种类型的样本。使用 TrainingData 对象填充并管理此数据集:
- 使用 ClassificationEngine 对象的 CreateTrainingData 方法创建一个空对象。
- 通过 Categories 属性访问类别集合。
- 多次调用 Categories 对象的 AddNew 方法,为要分类的每种文档类型添加一个类别。该方法要求输入一个表示类别标签的 string。该标签会由分类方法返回,因此在类别集合中必须唯一。
- 对于每个新添加的 Category 对象,使用 Objects 属性访问分类对象集合。借助 IClassificationObjects::Add 方法,添加与该类别对应的分类对象。
任何类别都不能为空。显然,训练至少需要两个类别。 - 配置好训练数据集后,你可能希望将其保存到磁盘上的文件中,以便后续使用:例如,如果训练出的模型精度不理想,而你希望添加或更正一些数据来提高质量。TrainingData 对象提供了 SaveToFile 方法。
C#
步骤 5:训练分类模型
步骤 5:训练分类模型
模型训练功能由 Trainer 对象提供。使用 ClassificationEngine 对象的 CreateTrainer 方法可创建该对象。它包含分类器类型和训练过程的所有设置,分布在两个子对象 TrainingParams 和 ValidationParams 中。请根据需要确定相应设置并修改对应的属性:ITrainingResult::Model 属性用于访问已训练的分类模型。您可以通过 SaveToFile 方法将其保存到文件,也可以直接用于对文档进行分类 (继续执行步骤 6) 。
- 分类器的类型 (ITrainingParams::ClassifierType) 。此设置决定了在分配类别时会考虑文档的哪些特征:图像特征、已识别的文本内容,或两者兼顾。要选择使用文本内容的类型,您需要确保训练数据集中的所有分类对象均由先前已识别的文档创建。
- 训练模式 (ITrainingParams::TrainingMode) 。此设置决定训练过程应优先追求高精确率 (选中的元素中有多少是正确的) 、高召回率 (有多少正确元素被选中) ,还是在两者之间取得平衡。
- 是否应使用 k 折交叉验证 (IValidationParams::ShouldPerformValidation) 。当训练样本量较小时,我们建议使用交叉验证,因为这样可以基于同一样本的不同分区训练多个模型,并从中选出最佳模型。如果您拥有大量已分类数据,则最好关闭验证,在整个训练样本上训练模型,然后使用分类方法 (步骤 6) 在另一组样本上测试该模型,并自行计算性能指标。
- k 折交叉验证的参数包括:训练样本被划分的份数 (IValidationParams::FoldsCount) 以及迭代次数 (IValidationParams::RepeatCount) 。请注意,对于 文本分类器,每次迭代中的训练集所需对象数不能少于 4;对于 组合分类器,不能少于 8。请确保训练样本中包含足够数量的对象。
模型训练和分类将在 Linux 和 Windows 中以串行模式执行,而不受 IMultiProcessingParams::MultiProcessingMode 值的影响。
C#
步骤 6. 对文档进行分类
步骤 6. 对文档进行分类
要使用训练后的模型进行分类,请执行以下操作:
- 如果模型当前尚未加载,请调用 ClassificationEngine 对象的 CreateModelFromFile 方法,从磁盘上的文件加载模型。
- 按照步骤 3 中所述,根据需要分类的文档准备分类对象。
- 对每个分类对象,调用 Model 对象的 Classify 方法,并将 ClassificationObject 作为输入参数。该方法会返回一个 ClassificationResult 对象集合,其中每个对象都包含类别标签以及该类别的概率。结果会按概率从高到低排序。获取结果并检查该概率值是否在您可接受的范围内。
如果分类器无法分配类别,则返回 null,而不是结果集合。
无论 IMultiProcessingParams::MultiProcessingMode 的值如何,模型训练和分类在 Linux 和 Windows 中都将以顺序模式执行。
C#
步骤 7. 卸载 ABBYY FineReader Engine
步骤 7. 卸载 ABBYY FineReader Engine
必需资源
进一步优化
- 加载引擎 - 仅限 Windows
- Engine 对象的不同加载方式
详细介绍了加载 Engine 对象的各种方式。 - 在多线程服务器应用程序中使用 ABBYY FineReader Engine
讨论了在服务器应用程序中使用 FineReader Engine 的相关细节。
- Engine 对象的不同加载方式
- 识别 - 适用于 Linux 和 Windows
- 使用 ABBYY FineReader Engine 进行并行处理
如需快速将识别后的文档或页面准备用于带有文本特征的分类器,可在识别阶段使用并行处理,然后在分类阶段关闭多进程处理。
- 使用 ABBYY FineReader Engine 进行并行处理
