首页 > 解决方案 > 如何避免 spaCy 训练数据中的重复标签?

问题描述

我正在使用以下代码为 spaCy 管道训练生成标记数据:

products = []
TRAIN_DATA = []
nlp = spacy.load("en_core_web_md")
legacy_entities = []

for index, row in rawdata.head(1000).iterrows():
    line = row['Activity.Description']
    if not (line is None):
        result = re.finditer(r"(product1|product2|product3)", str(line), re.IGNORECASE)
        entities = []
        for match in result:
            train_tuple = (match.start(), match.end(), "PRODUCT")
            entities.append(train_tuple)
        doc = nlp(str(line))
        for ent in doc.ents:
            train_tuple = (ent.start_char, ent.end_char, ent.label_)
            entities.append(train_tuple)
        if entities:
            products.append((line, {"entities": entities}))

TRAIN_DATA = products

为了避免灾难性的遗忘问题,我还添加了未经训练的模型识别的本机实体。在某些情况下,“product1”可能被错误地标记为不同的实体,例如“ORG”或“PERSON”。当这种情况发生时(不幸的是,它经常发生......)训练过程由于以下原因无法获取 TRAIN_DATA:

ValueError: [E103] 试图设置冲突的 doc.ents: '(0, 14, 'PRODUCT')' 和 '(0, 5, 'ORG')'。令牌只能是一个实体的一部分,因此请确保您设置的实体不重叠。要使用重叠实体,请考虑改用 doc.spans。

这是有道理的。

验证和删除与 PRODUCT 实体分配相同跨度的实体的最佳方法是什么?我是否需要实现另一个循环来交叉检查每个实体与其他实体,还是在 python 中有更聪明的方法来做到这一点?

标签: python

解决方案


推荐阅读