繁体   English   中英

用印度名字训练 Spacy NER

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM