NER 的 Spacy Doc Bin 创建
Spacy Doc Bin Creation for NER
我正在尝试为自定义 NER 创建 doc bin 对象。我有大约 100 个标记数据用于训练(作为开始)
我在创建时收到跳过实体消息。
54%|██████████████████████▊ | 43/79 [00:00<00:00, 216.47it/s]
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
100%|██████████████████████████████████████████| 79/79 [00:00<00:00, 251.36it/s]
我的疑问是:
- 这个跳过实体是什么意思(跨度怎么可能None).
- 这个问题严重吗。
- 这会如何影响性能以及我们如何克服这个问题?
- 如果100个数据完全可用,我们可以按什么比例进行训练和评估?
代码
import pandas as pd
import os
from tqdm import tqdm
import spacy
from spacy.tokens import DocBin
nlp = spacy.blank("en") # load a new spacy model
db = DocBin() # create a DocBin object
for text, annot in tqdm(train_data): # data in previous format
doc = nlp.make_doc(text) # create doc object from text
ents = []
for start, end, label in annot["entities"]: # add character indexes
span = doc.char_span(start, end, label=label, alignment_mode="contract")
if span is None:
print("Skipping entity")
else:
ents.append(span)
doc.ents = ents # label the text with the ents
db.add(doc)
db.to_disk("./train.spacy") # save the docbin object
如果 alignment_mode="contract"
没有标记标记,跨度可以是 None
。因此,如果您有一个标记 good
并尝试将 oo
标记为 contract
的范围,那么它将 return None
。使用 expand
,您应该始终至少得到一个令牌。
我正在尝试为自定义 NER 创建 doc bin 对象。我有大约 100 个标记数据用于训练(作为开始)
我在创建时收到跳过实体消息。
54%|██████████████████████▊ | 43/79 [00:00<00:00, 216.47it/s]
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
Skipping entity
100%|██████████████████████████████████████████| 79/79 [00:00<00:00, 251.36it/s]
我的疑问是:
- 这个跳过实体是什么意思(跨度怎么可能None).
- 这个问题严重吗。
- 这会如何影响性能以及我们如何克服这个问题?
- 如果100个数据完全可用,我们可以按什么比例进行训练和评估?
代码
import pandas as pd
import os
from tqdm import tqdm
import spacy
from spacy.tokens import DocBin
nlp = spacy.blank("en") # load a new spacy model
db = DocBin() # create a DocBin object
for text, annot in tqdm(train_data): # data in previous format
doc = nlp.make_doc(text) # create doc object from text
ents = []
for start, end, label in annot["entities"]: # add character indexes
span = doc.char_span(start, end, label=label, alignment_mode="contract")
if span is None:
print("Skipping entity")
else:
ents.append(span)
doc.ents = ents # label the text with the ents
db.add(doc)
db.to_disk("./train.spacy") # save the docbin object
如果 alignment_mode="contract"
没有标记标记,跨度可以是 None
。因此,如果您有一个标记 good
并尝试将 oo
标记为 contract
的范围,那么它将 return None
。使用 expand
,您应该始终至少得到一个令牌。