语言资源及最佳实践的故障排除

本主题提供了验证和故障排除 IWordBreakerIStemmer 实现的最佳实践与建议。

本主题按如下所示进行组织:

最佳做法

  • 确保语言资源的线程模型在注册表中设置为“两者”。
  • 如果可能,请将语言数据放在 DLL 中的资源中,而不是放在单独的文件中。 这使得 DLL 更易于安装和更安全。 此外,将语言数据放在资源中将导致该语言资源组件的性能得到提高。
  • 最大程度地减少语言资源组件使用的系统资源。 例如,如果语言资源对象的每个实例都需要对词典的只读访问权限,请考虑在所有实例之间共享词典。
  • 请考虑使用中性分词器来处理不属于您的分词器实现的语言或区域设置的文本。 这有助于确保在所有语言中一致地处理文本。
  • 检查所有返回代码,并从 IStemmer::GenerateWordFormsIWordBreaker::BreakText 等函数中返回它们。 如果索引编制失败,必须传递错误,以便通知用户哪些文档已编制索引。

测试词干分析器一致性

建议监视 IStemmer 实现的性能,以便在以下条件下保持一致性:

  • 词干分析器在多次调用IStemmer::Init时表现一致。 词干分析器使用与上一初始化中相同的参数重新初始化,而无需释放参数。
  • 给定相同的测试语料库和同一查询的重复, IStemmer::GenerateWordForms 将生成相同的输出,并使用相同的调用 IWordFormSink 对象的方法。

测试词干分析器中的无效输入

建议监视 IStemmer 方法如何处理与无效参数相关的所有错误。 此外,我们建议确保词干提取法不会引发未经处理的异常。 词干分析器应处理以下错误:

  • 调用 IStemmer::Init ,将 pfLicense 设置为 NULL。 Init 失败,但不会导致访问权限错误。
  • 调用 IStemmer::GetLicenseToUse ,并将 ppwcsLicense 参数设置为 NULLIStemmer::GetLicenseToUse 不会导致访问冲突。
  • 调用 IStemmer::GenerateWordForms ,其中参数 pwcInBuf 设置为 NULLIStemmer::GenerateWordForms 失败(返回E_FAIL),并且不会导致访问冲突。
  • 调用IStemmer::GenerateWordForms,其中cwc参数等于0。 IStemmer::GenerateWordForms 成功返回(返回S_OK),并且不会导致访问冲突。
  • 调用 IStemmer::GenerateWordForms 时将 pwcInBuf 参数设置为 NULL,并将 cwc 参数设置为 0。 IStemmer::GenerateWordForms 失败(返回E_FAIL),并且不会导致访问冲突。

测试分词器一致性

我们建议确保 IWordBreaker 实现在以下条件下具有一致性表现:

  • 断字符在对其 IWordBreaker::Init 方法的多次调用中均表现一致。 断字符使用与上一初始化中相同的参数重新初始化,而无需释放参数。
  • 给定相同的测试语料库和同一查询的重复, IWordBreaker::BreakText 方法将生成相同的输出,并使用相同的调用 IWordSinkIPhraseSink 对象的方法。

测试分词器的无效输入

建议确保 IWordBreaker 方法处理与无效参数相关的所有错误。 此外,我们建议确保断字符方法不会引发未经处理的异常。 分词器应实现以下功能并处理以下错误:

  • 调用 IWordBreaker::Init 必须返回LANGUAGE_E_DATABASE_NOT_FOUND或S_OK。
  • 调用 IWordBreaker::InitpfLicense 参数成功初始化为 FALSE ,并调用 IStemmer::GetLicenseToUse ,并且不会导致访问冲突。
  • 断字符在 IWordBreaker::BreakText 方法中不会读取超过 awcBuffer 参数末尾的内容。
  • 调用 IWordBreaker::BreakText,pwcInBuf 设置为 NULLIWordBreaker::BreakText 失败(返回E_FAIL),并且不会导致访问冲突。
  • 调用 IWordBreaker::BreakText,并将 cwc 参数设置为 0。 IWordBreaker::BreakText 成功返回(返回S_OK),并且不会导致访问冲突。
  • 调用 IWordBreaker::BreakText 方法,pwcInBuf 参数设置为 NULL,cwc 参数等于 0。 IWordBreaker::BreakText 失败(返回E_FAIL),并且不会导致访问冲突。
  • 在创建索引期间生成的短语包含相同数量的单词。
  • 短语在索引创建过程中通过对 IWordFormSink::PutWordIWordFormSink::PutAltWord 方法的连续调用生成。 分词器仅在查询期间使用 IPhraseSink 对象。

扩展语言资源

了解语言资源组件

实现分词器和词干分析器

语言和 Unicode 注意事项