我正在尝试定制Spacy的NER来识别印度名字。 遵循本指南https://spacy.io/usage/training,这是我使用的数据集https://gist.githubusercontent.com/mbejda/9b93c7545c9dd93060bd/raw/b582593330765df3ccaae6f641f8cddc16f1e879/Indian-Female-Names.csv
根据代码,我应该提供以下格式的培训数据:
TRAIN_DATA = [
('Shivani', {
'entities': [(0, 6, 'PERSON')]
}),
('Isha ', {
'entities': [(0,3 , 'PERSON')]
})
]
如何为Spacy提供约12000个名称的培训数据,因为手动指定每个实体将是一件苦差事?是否有其他工具可用于标记所有名称?
答案 0 :(得分:5)
您无法为自定义名称培训NLP库。训练数据必须是训练条目的列表,每个训练条目具有句子文本以及所识别的姓名的位置。请再次查看训练数据示例,了解如何提供完整的句子,而不仅仅是名称。
Spacy并不是一个公报匹配工具。你可能最好生成100个使用其中一些名字的句子,然后在那些带注释的句子上训练Spacy。您可以根据需要添加更多完整的句子示例,以提高准确性。 Spacy的本地NER名称很强大,不需要12000个例子。
答案 1 :(得分:4)
您提供TRAIN_DATA的当前格式不会给您带来好结果。 Spacy需要采用以下格式的数据
TRAIN_DATA = [
('Shivani lives in chennai', {
'entities': [(0, 6, 'PERSON')]
}),
('Did you talk to Shivani yesterday', {
'entities': [(16, 22, 'PERSON')]
}),
('Isha bought a new phone', {
'entities': [(0,3 , 'PERSON')]
})
]
请参阅文档here。关于自动执行注释12000条目任务的问题,有一些工具可以帮助您快速注释数据。您可以使用prodigy(与spacy相同的开发人员),但它是付费服务。您可以在行动here中看到它。 如果您放弃NER,如果您只需要在文档中查找名称,模式匹配也可能对您有效,如果正确完成,它也会更快更准确。
答案 2 :(得分:0)
@ ak_35指出,培训数据必须采用spaCy格式。
一种方法是使用spacy-annotator,它提供了一个简单的UI来注释您感兴趣的实体(即PERSON):
import pandas as pd
import re
from annotator.active_annotations import annotate
# Data
df = pd.DataFrame.from_dict({'full_text' : ['Shivani lives in chennai']})
# Annotations
dd = annotate(df,
col_text = 'full_text',
labels = ['PERSON'],
sample_size=1,
model = 'en',
regex_flags=re.IGNORECASE
)
在注释了相关名称后,您可以通过执行以下操作来查看输出:
# Output
dd['annotations'][0]
答案 3 :(得分:-1)
如果你想弄清楚名字的索引,那么它很简单
(0, len(name.split(sep=',')[0])-1)