【问题标题】:Creating testing environment with small Spacy models使用小型 Spacy 模型创建测试环境
【发布时间】:2019-08-27 16:42:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: testing spacy


    【解决方案1】:

    这基本上取决于您需要测试什么以及如何测试。 您可能并不真正需要或不想测试 spacy 本身,您想根据 spacy 的结果来测试您的函数,并且在这方面的一个好的做法是模拟来自 spacy 的响应并测试您的代码信任 spacy 是否正常工作(它确实有测试;))。在我们的环境中,我们在导入 spacy 时加载了模型,因此我们必须模拟导入的模块才能不加载这些数据。

    当然可以选择创建模型的轻量级版本,但这不是一个简单的例子,它可能需要对每个 spacy 版本进行更改,并且您必须记住其他开发人员应该能够更新模型之后,当测试/需求发生变化时。

    如果您确实需要模型并且最大的问题是等待它们被下载,请考虑使用缓存来存储数据。许多 CI 环境可以为您缓存模型,并且在引入新版本的 spacy 之前它们将一直有效。

    【讨论】:

    • 我不喜欢嘲笑像 spacy 这样的关键部分,这样我们的测试就可以尽可能地真实和“集成”。但是,正如您所说,我们现在使用的 CI(Circle CI)允许缓存模型。所以现在下载时间好多了。谢谢!
    【解决方案2】:

    尽管@aniav 的提议似乎已经解决了@Rajhans 的问题,并且在大多数情况下模拟和缓存可能是一个好主意,但我想添加一些可以帮助我减少单元测试持续时间的内容:

    我意识到我正在加载几个我什至没有使用的 spaCy 组件,即 spaCy 可能会加载 NER 组件,而你甚至不使用它。您可以使用

    停用单个组件
    nlp = spacy.load("en_core_web_lg", disable=["tagger", "ner"])
    

    这将禁用标记器和 ner 识别。详情请见spaCy documentation

    这不仅减少了您的单元测试持续时间,而且还具有使您的生产代码启动速度更快的好处。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 2020-02-03
      • 2015-10-11
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多