Как сделать файл шаблона из CRF++?
Я новичок в CRF++. Я учу себя, глядя на его руководство: http://crfpp.googlecode.com/svn/trunk/doc/index.html?source=navbar
И я не понимаю, что это значит:
Это шаблон для описания функций Unigram. Когда вы даете
шаблон "U01:%x[0,1]", CRF++ автоматически генерирует набор функций
функции (func1 ... funcN), такие как:
func1 = if (output = B-NP и feature="U01:DT") вернуть 1, иначе вернуть 0
func2 = if (output = I-NP и feature="U01:DT") вернуть 1, иначе вернуть 0
func3 = if (output = O и feature="U01:DT") вернуть 1, иначе вернуть 0
.... funcXX = if (output = B-NP и feature="U01:NN") вернуть 1, иначе вернуть 0
funcXY = if (output = O и feature="U01:NN") вернуть 1, иначе вернуть 0. Количество функций, сгенерированных шаблоном
составляет (L * N), где L - номер выхода
Почему есть много строк для функций Unigram и что они значат?
2 ответа
Посмотрев документацию достаточно долго, думаю, я понял это.
Возьмите пример в документации, где входные данные:
He PRP B-NP
reckons VBZ B-VP
the DT B-NP
current JJ I-NP
account NN I-NP
и шаблон функции (в формате %x[row, col]
, где row
относительно вашей текущей позиции) %x[0,1]
когда %x[0,1]
расширяется, в зависимости от текущего токена, он может сканировать одну из строк внутри набора [PRP, VBZ, DT, JJ, NN]
(т.е. одна из уникальных строк из 1-го столбца, где самый левый столбец - это столбец 0). Для каждой из этих строк он создает набор функций функций формы (глядя на 3-й ряд входных данных):
func1 = if (output = B-NP and feature="U01:DT") return 1 else return 0
func2 = if (output = I-NP and feature="U01:DT") return 1 else return 0
func3 = if (output = O and feature="U01:DT") return 1 else return 0
...
где эта конкретная строка (DT
в приведенном выше коде) сравнивается с каждым выходным классом.
Так что, если выходные классы [B-NP, I-NP, O]
шаблон функции, расширенный до функций, будет выглядеть следующим образом:
# row 1 (He, PRP, B-NP)
func1 = if (output = B-NP and feature="U01:PRP") return 1 else return 0
func2 = if (output = I-NP and feature="U01:PRP") return 1 else return 0
func3 = if (output = O and feature="U01:PRP") return 1 else return 0
# row 2 (Reckons, VBZ, B-VP)
func4 = if (output = B-NP and feature="U01:VBZ") return 1 else return 0
func5 = if (output = I-NP and feature="U01:VBZ") return 1 else return 0
func6 = if (output = O and feature="U01:VBZ") return 1 else return 0
# Row 3 (the, DT, B-NP)
func7 = if (output = B-NP and feature="U01:DT") return 1 else return 0
func8 = if (output = I-NP and feature="U01:DT") return 1 else return 0
func9 = if (output = O and feature="U01:DT") return 1 else return 0
# Row 4 (current, JJ, I-NP)
func10 = if (output = B-NP and feature="U01:JJ") return 1 else return 0
func11 = if (output = I-NP and feature="U01:JJ") return 1 else return 0
func12 = if (output = O and feature="U01:JJ") return 1 else return 0
# Row 5 (account, NN, I-NP)
func13 = if (output = B-NP and feature="U01:NN") return 1 else return 0
func14 = if (output = I-NP and feature="U01:NN") return 1 else return 0
func15 = if (output = O and feature="U01:NN") return 1 else return 0
Относительно того, где упоминается документация:
Количество функций объектов, сгенерированных шаблоном, составляет (L * N), где L - количество классов вывода, а N - количество уникальных строк, развернутых из данного шаблона.
В этом случае L будет 3, а N будет 5.
Для определенного шаблона%x[i,j] i представляет смещения (строку) текущей позиции, j представляет элемент (столбец), который вы хотите использовать. Предоставленные данные:
He PRP B-NP
reckons VBZ B-VP
the DT B-NP
current JJ I-NP << CURRENT TOKEN
account NN I-NP
% x [0,1] относится к слову, смещение к текущему слову равно 0, его тег pos - JJ, а выходной тег - I-NP.
Переместить дальнее слово, %x[0, 1] -> тег pos = NN, тег вывода = I-NP
Каждая функция относится к паре возможных значений текущего слова и его тега pos.
Обновить:
Я думаю, что объяснение выше довольно простое при условии, что вы хорошо понимаете модель CRF.
CRF++ является копией Sha и Pereira (2003)