Я пытаюсь настроить NER Спейси для идентификации индийских имен. Следуя этому руководству https://spacy.io/usage/training, я использую этот набор данных
Поезд Spacy NER по индийским именам
Ответы (4)
Вам не хватает точки обучения библиотеке НЛП для пользовательских имен. Обучающие данные должны быть списком обучающих записей, каждая из которых имеет текст предложения с указанием местоположения указанного имени (имен). Просмотрите пример данных обучения еще раз, чтобы увидеть, как вам нужно указать полное предложение, а не только имя.
Spacy не предназначен для использования в качестве инструмента для сопоставления газет. Вам, вероятно, лучше составить 100 предложений, в которых используются некоторые из этих имен, а затем обучить Спейси этим предложениям с аннотациями. При необходимости вы можете добавить больше примеров полных предложений для повышения точности. Собственный NER Spacy для имен надежен и не требует 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, который предоставляет простой пользовательский интерфейс для аннотирования интересующих вас объектов (например, 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)
csv.reader
для чтения каждой строки, создайте кортеж с(name, {'entities': [(x, y, 'PERSON')]})
или другими значениями, добавьте его вTRAIN_DATA
. Здесь нет ничего особенно сложного, но если вы попробуете и где-то застрянете, вы можете показать нам свой код и то, где он делает что-то не так. - person abarnert   schedule 26.03.2018