python - 如何避免 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 中有更聪明的方法来做到这一点?
解决方案
推荐阅读
- android - Recycler View添加Item Animator没有动画
- php - 如何使用 PHP 在 JSON 中获取这个嵌套字符串?
- python - 检查字符串是否是列表的有序子列表
- ruby-on-rails - ActiveRecord.where 在 rake 任务中无效,在 Rails 控制台中工作
- android - ColdFusion 读取移动设备文件并写入移动设备文件 - 从本地设备
- amazon-web-services - 在某个日期查看所有 S3 对象上传/拉取的方法?
- c# - 我应该如何将这个 C 函数指针结构移植到 C# .NET 实现
- javascript - nodejs“this”在转换中未定义
- vue.js - 使用 vue-multiselect 将对象数组从 vue 传递到 laravel
- angular - 带有 OnPush 更改检测的 Angular 更新属性