在印第安人的名字上训练Spacy NER

时间:2018-03-26 04:25:49

标签: python python-3.x nlp spacy ner

我正在尝试定制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个名称的培训数据,因为手动指定每个实体将是一件苦差事?是否有其他工具可用于标记所有名称?

4 个答案:

答案 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)