Testing 用小空间模型创建测试环境

Testing 用小空间模型创建测试环境,testing,spacy,Testing,Spacy,这更像是一个最佳/常见做法问题 我们在生产系统中使用Spacy。在测试过程中,很多时候我们必须下载完整的spacy模型(解析器+词向量),这可能非常缓慢(约30分钟)并且令人沮丧。也许更好的策略是创建一个用于测试的定制轻量级spacy模型,例如,只有1000单词的vocab和更小的解析模型 在使用可应用于此场景的大型数据模型进行测试时,是否有建议的策略/最佳做法?这主要取决于需要测试的内容和方式。 您可能并不真的需要或想要测试spacy本身,您希望根据spacy的结果测试您的函数,在这方面的一个

这更像是一个最佳/常见做法问题

我们在生产系统中使用Spacy。在测试过程中,很多时候我们必须下载完整的spacy模型(解析器+词向量),这可能非常缓慢(约30分钟)并且令人沮丧。也许更好的策略是创建一个用于测试的定制轻量级spacy模型,例如,只有1000单词的vocab和更小的解析模型


在使用可应用于此场景的大型数据模型进行测试时,是否有建议的策略/最佳做法?

这主要取决于需要测试的内容和方式。 您可能并不真的需要或想要测试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这样的关键部分,这样我们的测试就可以尽可能的真实和“集成”。但是,正如您所说,我们现在使用的CI(Circle CI)允许缓存模型。所以现在下载的时间好多了。谢谢