【问题标题】:How do I evaluate a custom pipeline component with a custom attribute?如何评估具有自定义属性的自定义管道组件?
【发布时间】:2020-08-04 00:04:25
【问题描述】:

问题:

  1. 如何为GoldParse 提供自定义属性的黄金数据?
  2. 如何通过基于自定义属性的自定义分数来扩展 properties of Scorer

说明

我已经实现了一个自定义管道组件,该组件设置了一个使用Doc.set_extension('results', default=[]) 设置的自定义属性。我想用标记的数据(比如{text: "This is some text", results: ["banana", "picture"]})评估我的管道。在我看来,GoldParseScorer 正在使用默认属性做我需要的事情,但我找不到有关如何将它们与自定义属性一起使用的信息。

我见过并理解像 this 这样的例子,但它们只处理默认属性。

我尝试过的

  • 我已经尝试弄清楚是否可以以某种方式为自定义属性/分数配置这两个类,但还没有找到方法。 GoldParse 的 init 方法的参数和 Scorer 属性似乎是固定的。
  • 我曾考虑使用子类扩展这两个类,但对我来说它们似乎不容易扩展。

我想避免的事情

当然,我可以从 Scorer 和 GoldParse 复制我需要的代码并为我的自定义属性添加代码,但这似乎是一个糟糕的解决方案。此外,考虑到 spaCy 如何鼓励您扩展管道和文档,如果这些扩展的评估如此困难,我会感到惊讶。

【问题讨论】:

    标签: spacy


    【解决方案1】:

    不幸的是,在 spacy v2 中实际上就是这么难。向GoldParse 添加内容非常困难(基本上是在家中不要尝试这个级别),Scorer 也很难扩展。

    我们正在为即将推出的 spacy v3 进行这项工作,其中将更普遍地实施评分方法,并且每个组件都将能够提供自己的 score 方法。请注意,这仍然不稳定,但如果您好奇,可以查看:https://github.com/explosion/spaCy/pull/5731GoldParse 已被替换为 Example,它将黄金注解和预测注解存储在单个 Doc 对象上,摆脱了与 GoldParse 相关的限制。

    如果您有文档级扩展(如上所述),那么您可能应该只使用不同的库进行评估。您可能会使用spacy.scorer 中的ROCAUCScorePRFScore,但使用sklearn 之类的指标可能更容易。 (ROCAUCScore 只是sklearn ROC AUC 指标的简化版本。)

    如果您有令牌级别的扩展,对于 v2,我认为您可以在 spacy 中做的最好的事情是使用 PRFScore 并根据来自 GoldParse 的单词提取对齐位,以便在记分器本身之外使用。像这样的:

    import spacy
    from spacy.scorer import PRFScore
    
    nlp = spacy.load("my_model")
    score = PRFScore()
    for text, gold_words, gold_attrs in zip(texts, gold_words_list, gold_attrs_list):
        # NOTE: gold_attrs must be aligned with gold_words
        # gold_words = ["a", "b", "c", ...]
        # gold_attrs = ["a1", "b1", "c1", ...]
    
        gold = GoldParse(nlp.make_doc(text), words=gold_words)
        doc = nlp(text)
    
        gold_values = set()
        cand_values = set()
        for i, gold_attr in enumerate(gold_attrs):
            gold_values.add((i, gold_attr))
        for token in doc:
            if token.orth_.isspace():
                continue
            gold_i = gold.cand_to_gold[token.i]
            if gold_i is not None:
                cand_values.add((gold_i, doc._.attr))
        score.score_set(cand_values, gold_values)
    
    print(score.fscore)
    

    这是一个未经测试的草图,应该与token.tagScorer 中的评估方式相同。对齐位是最棘手的部分,因此如果您在黄金词和 spacy 的标记化之间没有错位,那么您最好导出结果并使用不同的库进行评估。

    【讨论】:

    • 谢谢!你碰巧知道 v3 的发布时间表吗?我好像找不到。
    • 没有固定的发布时间表,抱歉!
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2012-09-04
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多