Пример тренировочных и тестовых данных вы можете найти в репозитории 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Формат .Чтобы иметь дело с потенциально мульти-токенными сущностями, вы помечаете их как Внутри / Снаружи / Начало.Может быть полезно привести пример.Представьте, что мы обучаем классификатор обнаружению имен - для компактности я напишу это в одной строке:
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)