【问题标题】:Correct annotation to train spaCy's NER正确标注以训练 spaCy 的 NER
【发布时间】:2020-12-15 16:32:56
【问题描述】:

我在寻找注释数据的正确方法时遇到了一些麻烦。我正在处理与实验室测试相关的文本,我正在使用以下标签:

1) 测试规范(例如电压、长度……)

2) 测试对象(例如电池、偷梁...)

3) 测试值(例如 5 V;5 m...)

我们来看这个例句:

电池电压应为 5 V。

我会这样注释这些句子:

The
battery voltage (test specification)
should
be
5 V (Test value)
.

但是,如果这句话看起来像这样:

电池电压应为 5 V。

我会使用以下注释:

The
voltage (Test specification)
of
the
battery (Test object)
should
be
5 V (Test value)
.

有没有人在注释数据方面有经验来解释这是否是正确的方法?或者我应该在他的第一个示例中使用 battery 的测试对象标签吗?或者我应该将第二个示例电池电压中的标签组合为测试规范?

我正在对数据进行注释以执行信息提取。

感谢您的帮助!

【问题讨论】:

    标签: spacy named-entity-recognition information-extraction


    【解决方案1】:

    您的所有示例都是不寻常的注释格式。标记 NER 数据(以文本形式)的典型方法是使用 IOB/BILOU 格式,其中每个标记位于一行,文件是 TSV,其中一列是标签。因此,对于您的数据,它看起来像:

    The
    voltage U-SPEC
    of
    the
    battery U-OBJ
    should
    be
    5 B-VALUE
    V L-VALUE
    .
    

    假装是TSV,我省略了O标签,用于“其他”项目。

    您可以在 the spaCy docs 中找到这些架构的文档。

    如果您已经拥有您提供的格式的数据,或者您发现这样做更容易,那么至少应该很容易转换。对于训练 NER spaCy 需要以特定格式提供数据,有关详细信息,请参阅the docs,但基本上您需要输入文本、字符跨度和这些跨度的标签。这是示例数据:

    TRAIN_DATA = [
        ("Who is Shaka Khan?", {"entities": [(7, 17, "PERSON")]}),
        ("I like London and Berlin.", {"entities": [(7, 13, "LOC"), (18, 24, "LOC")]}),
    ]
    

    这种格式手动生成比上面的 TSV 类型格式更棘手,所以通常你会生成类似 TSV 的格式,可能使用工具,然后转换它。

    【讨论】:

      【解决方案2】:

      正确注释实体的主要规则是保持一致(即在决定哪个实体是什么时始终应用相同的规则)。我可以看到你已经有一些规则,关于何时应该考虑 battery voltagetest objecttest specification
      始终如一地应用这些规则,你会没事的。

      看看spacy-annotator
      它是一个库,可帮助您以所需的方式注释数据。
      示例:

      import pandas as pd
      import re
      from spacy_annotator.pandas_annotations import annotate as pd_annotate
      
      # Data
      df = pd.DataFrame.from_dict({'full_text' : [The battery voltage should be 5 V., 'The voltage of the battery should be 5 V.']})
      
      # Annotations
      pd_dd = pd_annotate(df,
                  col_text = 'full_text',     # Column in pandas dataframe containing text to be labelled
                  labels = ['test_specification', 'test object', 'test_value'], # List of labels
                  sample_size=1,              # Size of the sample to be labelled
                  delimiter=',',              # Delimiter to separate entities in GUI
                  model = None,               # spaCy model for noisy pre-labelling
                  regex_flags=re.IGNORECASE   # One (or more) regex flags to be applied when searching for entities in text
                  )
      
      # Example output
      pd_dd['annotations'][0]
      

      代码将向您展示一个用户界面,您可以使用它来注释每个相关实体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        相关资源
        最近更新 更多