语言资源和最佳做法疑难解答
本主题提供有关验证 和排查 IWordBreaker 和 IStemmer 实现的最佳做法和建议。
本主题的组织方式如下:
最佳实践
- 确保在注册表中将语言资源的线程模型设置为“两者”。
- 在可能的情况下,将语言数据放入 DLL 中的资源中,而不是放在单独的文件中。 这使 DLL 更易于安装,并且更安全。 此外,将语言数据放入资源将提高该语言资源组件的性能。
- 尽量减少语言资源组件使用的系统资源。 例如,如果语言资源对象的每个实例都需要对词典进行只读访问,请考虑在所有实例之间共享词典。
- 请考虑使用中性断字符来处理不采用断字符实现的语言或区域设置的文本。 这将有助于确保跨所有语言一致地处理文本。
- 检查所有返回代码,并从 IStemmer::GenerateWordForms 和 IWordBreaker::BreakText 等函数返回它们。 如果索引编制失败,请务必传递错误,以便通知用户哪些文档已编制索引。
测试词干分析器一致性
建议在以下情况下监视 IStemmer 实现的性能,以确保一致性:
- 词干分析器在对 IStemmer::Init 的多个调用中一致地执行。 词干分析器使用与上一次初始化相同的参数重新初始化,而无需释放参数。
- 给定相同的测试语料库和同一查询的重复, IStemmer::GenerateWordForms 将生成相同的输出,并对 IWordFormSink 对象的方法进行相同的调用。
在词干分析器中测试无效输入
建议监视 IStemmer 方法如何处理与无效参数相关的所有错误。 此外,建议确保词干分析器方法不会引发未经处理的异常。 词干分析器应处理以下错误:
- 调用 IStemmer::Init ,将 pfLicense 设置为 NULL。 Init 失败,不会导致访问冲突。
- 调用 IStemmer::GetLicenseToUse ,并将 ppwcsLicense 参数设置为 NULL。 IStemmer::GetLicenseToUse 不会导致访问冲突。
- 调用 IStemmer::GenerateWordForms ,并将 pwcInBuf 参数设置为 NULL。 IStemmer::GenerateWordForms 失败 (返回E_FAIL) 且不会导致访问冲突。
- 调用 cwc 参数等于 0 的 IStemmer::GenerateWordForms。 IStemmer::GenerateWordForms 成功返回 (返回S_OK) 且不会导致访问冲突。
- 调用 IStemmer::GenerateWordForms ,其中 pwcInBuf 参数设置为 NULL , cwc 参数等于 0。 IStemmer::GenerateWordForms 失败 (返回E_FAIL) 且不会导致访问冲突。
测试Word中断程序一致性
建议确保 IWordBreaker 实现在以下情况下一致地执行:
- Word断路器在其 IWordBreaker::Init 方法的多个调用中一致地执行。 断字符使用与上一次初始化相同的参数重新初始化,而无需释放参数。
- 鉴于相同的测试语料库和同一查询的重复, IWordBreaker::BreakText 方法将生成相同的输出,并对 IWordSink 和 IPhraseSink 对象的方法进行相同的调用。
测试Word断路器中的无效输入
建议确保 IWordBreaker 方法处理与无效参数相关的所有错误。 此外,建议确保断字符方法不会引发未经处理的异常。 断字符应执行以下函数并处理以下错误:
- 调用 IWordBreaker::Init 必须返回LANGUAGE_E_DATABASE_NOT_FOUND或S_OK。
- 调用 IWordBreaker::Init 会将 pfLicense 参数成功初始化为 FALSE ,并调用 IStemmer::GetLicenseToUse ,不会导致访问冲突。
- Word breaker 不会读到 IWordBreaker::BreakText 方法中 awcBuffer 参数的末尾。
- 调用 IWordBreaker::BreakText ,并将 pwcInBuf 设置为 NULL。 IWordBreaker::BreakText 失败 (返回E_FAIL) ,不会导致访问冲突。
- 调用 cwc 参数等于 0 的 IWordBreaker::BreakText。 IWordBreaker::BreakText 成功返回 (返回S_OK) 且不会导致访问冲突。
- 调用 IWordBreaker::BreakText 方法,其中 pwcInBuf 参数设置为 NULL , cwc 参数等于 0。 IWordBreaker::BreakText 失败 (返回E_FAIL) ,不会导致访问冲突。
- 在创建索引期间生成的短语包含相同数量的单词。
- 在索引创建过程中,通过连续调用 IWordFormSink::P utWord 和 IWordFormSink::P utAltWord 方法生成短语。 断字符在查询期间仅使用 IPhraseSink 对象。
相关主题