[英]Train Spacy NER on Indian Names
我正在尝试自定义 Spacy 的 NER 来识别印度人的名字。 按照本指南https://spacy.io/usage/training ,这是我正在使用的数据集https://gist.githubusercontent.com/mbejda/9b93c7545c9dd93060bd/raw/b582593330765df3ccaae6f641f8cddc16f1e879/
根据代码,我应该提供以下格式的训练数据:
TRAIN_DATA = [
('Shivani', {
'entities': [(0, 6, 'PERSON')]
}),
('Isha ', {
'entities': [(0,3 , 'PERSON')]
})
]
我如何向 Spacy 提供大约 12000 个名称的训练数据,因为手动指定每个实体将是一件苦差事? 是否有其他工具可用于标记所有名称?
您错过了为自定义名称训练 NLP 库的重点。 训练数据必须是一个训练条目列表,每个条目都有一个句子文本,其中标识了名称的位置。 请再次查看训练数据示例,以了解您需要如何提供完整的句子而不仅仅是名称。
Spacy 并不意味着成为公报匹配工具。 您最好生成 100 个使用其中一些名称的句子,然后在这些带注释的句子上训练 Spacy。 您可以根据需要添加更多完整的句子示例以提高准确性。 Spacy 用于名称的原生 NER 非常强大,不需要 12000 个示例。
下面@ak_35 的回答提供了如何提供带有标记名称位置的训练句子的示例。
您当前提供 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')]
})
]
请参阅此处的文档。 关于自动化注释 12000 个条目的任务的问题,有一些工具可以帮助您快速注释数据。 您可以使用prodigy (与 spacy 相同的开发人员),但它是一项付费服务。 你可以在这里看到它的实际效果。 如果您放弃 NER,如果您只需要在文档中查找名称,模式匹配也可能对您有用,如果做得正确,它也会更快、更准确。
正如@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]
如果你想找出名字的索引,那么这很简单
(0, len(name.split(sep=',')[0])-1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.