Поезд Spacy NER по индийским именам

Я пытаюсь настроить NER Спейси для идентификации индийских имен. Следуя этому руководству https://spacy.io/usage/training, я использую этот набор данных


person shri_wahal    schedule 26.03.2018    source источник
comment
Откройте файл csv, используйте csv.reader для чтения каждой строки, создайте кортеж с (name, {'entities': [(x, y, 'PERSON')]}) или другими значениями, добавьте его в TRAIN_DATA. Здесь нет ничего особенно сложного, но если вы попробуете и где-то застрянете, вы можете показать нам свой код и то, где он делает что-то не так.   -  person abarnert    schedule 26.03.2018


Ответы (4)


Вам не хватает точки обучения библиотеке НЛП для пользовательских имен. Обучающие данные должны быть списком обучающих записей, каждая из которых имеет текст предложения с указанием местоположения указанного имени (имен). Просмотрите пример данных обучения еще раз, чтобы увидеть, как вам нужно указать полное предложение, а не только имя.

Spacy не предназначен для использования в качестве инструмента для сопоставления газет. Вам, вероятно, лучше составить 100 предложений, в которых используются некоторые из этих имен, а затем обучить Спейси этим предложениям с аннотациями. При необходимости вы можете добавить больше примеров полных предложений для повышения точности. Собственный NER Spacy для имен надежен и не требует 12000 примеров.

В ответе @ ak_35 ниже приведены примеры того, как предоставлять обучающие предложения с указанием местоположения помеченных имен.

person Adnan S    schedule 27.03.2018

Ваш текущий формат для предоставления 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, сопоставление с шаблоном также может хорошо работать для вас, если вам просто нужно найти имена в документе, оно будет быстрее и точнее, если все будет сделано правильно.

person ak_35    schedule 01.05.2018

Как отмечает @ ak_35, данные обучения должны быть в формате spaCy.
Один из способов сделать это - использовать spacy-annotator, который предоставляет простой пользовательский интерфейс для аннотирования интересующих вас объектов (например, 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]
person iEriii    schedule 25.09.2020

Если вы пытаетесь выяснить индекс имен, то это довольно просто

(0, len(name.split(sep=',')[0])-1)
person Sujay DSa    schedule 26.03.2018
comment
Вопрос был не в этом. - person shri_wahal; 26.03.2018