这更像是一个最佳/常见做法问题。
我们在生产系统中使用 Spacy。在测试时,很多时候我们必须下载完整的 spacy 模型(解析器 + 词向量),这可能非常慢(约 30 分钟)并且令人沮丧。也许更好的策略是创建一个自定义的轻量级 spacy 模型进行测试,例如,只有 1000 个单词的词汇和一个较小的解析模型。
在使用可应用于此场景的大型数据模型进行测试时,是否有建议的策略/最佳实践?
这基本上取决于您需要测试什么以及如何测试。您可能并不真正需要或不想测试 spacy 本身,您想根据 spacy 的结果来测试您的函数,并且在这方面的一个好的做法是模拟来自 spacy 的响应并测试您的代码信任 spacy 是否正常工作(它确实有测试;))。在我们的环境中,我们在导入 spacy 时加载了模型,因此我们必须模拟导入的模块才能不加载这些数据。
当然可以选择创建模型的轻量级版本,但这不是一个简单的例子,它可能需要在每个 spacy 版本更改上工作,你必须记住,其他开发人员应该能够在测试后更新模型/ 需求变化。
如果您实际上需要模型并且最大的问题是等待它们被下载,请考虑对数据使用缓存。许多 CI 环境可以为您缓存模型,并且在引入更新版本的 spacy 之前它们将一直有效。
尽管@aniav 的提议似乎已经解决了@Rajhans 问题,并且在大多数情况下模拟和缓存可能是一个好主意,但我想添加一些有助于我减少单元测试持续时间的内容:
我意识到我正在加载几个我什至没有使用的 spaCy 组件,即 spaCy 可能会加载 NER 组件,而你甚至不使用它。您可以使用停用单个组件
nlp = spacy.load("en_core_web_lg", disable=["tagger", "ner"])
这将禁用标记器和 ner 识别。有关更多详细信息,请参阅spaCy 文档。
这不仅减少了您的单元测试持续时间,而且还具有使您的生产代码启动更快的良好副作用。