Как настроить файлы шаблонов обучения и функций для NER? - CRF++

Для задачи распознавания именованных объектов

После токенизации предложений, как вы настраиваете столбцы? похоже, что один столбец в документации - это тег POS, но откуда они берутся? Должен ли я сам пометить POS или есть инструмент для их создания?

Что представляет следующий столбец? Такой класс, как PERSON, LOCATION и т. д.? и должен ли он быть в каком-то конкретном формате?

Есть ли пример заполненного учебного файла и шаблона для NER?


person erotavlas    schedule 12.06.2018    source источник
comment
Если вы нашли мой ответ полезным, я был бы признателен, если бы вы приняли его, нажав на галочку.   -  person polm23    schedule 13.12.2018


Ответы (1)


Вы можете найти примеры обучающих и тестовых данных в репозитории crf++ здесь. Обучающие данные для фрагментации именной фразы выглядят следующим образом:

Confidence NN B
in IN O
the DT B
pound NN I
is VBZ O
widely RB O
expected VBN O
... etc ...

Столбцы произвольны в том смысле, что они могут быть любыми. CRF++ требует, чтобы каждая строка имела одинаковое количество столбцов (или была пустой для разделения предложений), но не все пакеты CRF требуют этого. Вам нужно будет предоставить значения данных самостоятельно, это данные, на которых учится классификатор.

Хотя в разных столбцах может быть что угодно, вы должны знать одно соглашение: Формат IOB. Чтобы иметь дело с объектами, потенциально состоящими из нескольких токенов, вы помечаете их как Inside/Outside/Beginning. Может быть полезно привести пример. Представим, что мы обучаем классификатор обнаруживать имена — для компактности я напишу это в одну строку:

John/B Smith/I ate/O an/O apple/O ./O

В столбцовом формате это будет выглядеть так:

John B
Smith I
ate O
an O
apple O
. O

С этими тегами B (начало) означает, что слово является первым в объекте, I означает, что слово находится внутри объекта (оно идет после тега B), а O означает, что слово не является объектом. Если у вас несколько типов объектов, обычно используются такие метки, как B-PERSON или I-PLACE.

Причина использования тегов IOB заключается в том, что классификатор может изучить различные вероятности перехода для начальных, продолжающихся и конечных объектов. Итак, если вы изучаете названия компаний, вы узнаете, что Inc./I-COMPANY обычно переходит в метку O, потому что Inc. обычно является последней частью названия компании.

Еще одной проблемой являются шаблоны, и CRF++ использует свой собственный специальный формат, но опять же, в исходном дистрибутиве есть примеры, которые вы можете посмотреть. Также см. этот вопрос.


Чтобы ответить на комментарий к моему ответу, вы можете сгенерировать теги POS, используя любой тег POS. Вам даже не нужно предоставлять POS-теги, хотя они обычно полезны. Другие метки могут быть добавлены вручную или автоматически; например, вы можете использовать список известных существительных в качестве отправной точки. Вот пример использования spaCy для простого детектора имен:

import spacy
nlp = spacy.load('en')
names = ['John', 'Jane', etc...]
text = nlp("John ate an apple.")
for word in text:
    person = 'O' # default not a person
    if str(word) in names:
        person = 'B-PERSON'
    print(str(word), word.pos_, person)
person polm23    schedule 13.06.2018
comment
Итак, столбец POS должен быть предоставлен мной. Любые рекомендации о том, как получить это? Как оно было получено для различных примеров? Был ли он сгенерирован тегером POS или введен вручную путем проверки каждого токена? У меня много данных в моих обучающих наборах. - person erotavlas; 13.06.2018
comment
Я решил, что пример кода был лучшим, поэтому, пожалуйста, посмотрите мой обновленный ответ. - person polm23; 14.06.2018
comment
А как насчет титулов — доктор Джон Смит или Джим Доу, доктор медицины? А как насчет заголовка, такого как Имя: Джо Смит, включены ли они в начальную/конечную часть имени? - person erotavlas; 18.06.2018
comment
Я считал, что они не являются частью имени, но вы можете сделать их частью имени или дать им другой тег, решать вам. - person polm23; 19.06.2018
comment
Что произойдет, если между предложениями нет разрывов строк? Просто предоставьте одну непрерывную серию токенов. - person erotavlas; 20.06.2018
comment
Это помешает вам использовать функции начала или конца предложения, что, вероятно, повредит вашей модели, и у вас может не хватить памяти. Но вы можете попробовать. - person polm23; 20.06.2018
comment
Извините, еще один вопрос. Документация не очень хорошо объясняет, что означают функции, разделенные символом /, например, это %x[0,0]/%x[0,1] расширяется до /DT в их примере. Что это делает? - person erotavlas; 20.06.2018
comment
/ не является особенным, это просто для удобства чтения. Такая функция, как %x[0,0]/%x[0,1], — это просто функция, основанная на токене и его метке, а не только на одном из них. У вас также может быть функция только для POS или только для буквального токена и т. Д. Я бы рекомендовал читать документацию для других наборов инструментов CRF, пока вы все не поймете. - person polm23; 21.06.2018