Делаю эксперимент с частеречной разметкой по бессловарной русской морфологии... По сути получилась стандартная задача sequence labelling, которую в данном случае естественно решать с помощью
conditional random fields, благо цепочка событий-слов одномерна и фичи пока бинарные.
И-за странного поведения уважаемого мной
CRFSuite начал смотреть на другие тулкиты. И вот такая грустная вещь обнаружилась. По непонятным мне причинам многие тулкиты, выглядящие очень аппетитно по набору возможностей типа многопоточность и работа с огромными датасетами, очень сильно ограничивают формат входного датасета.
Когда-то, увидев работу
CRF++ в составе
японского парсера Cabocha, я начал с ним экспериментировать и очень быстро уперся в следующее ограничение. Обучающие паттерны допускают только одну фичу на слово. Потом с помощью специальных правил-шаблонов одиночные фичи у слов можно объединить в униграммные...триграммные фичи. Но суть остается та же - ровно одна фича на слово:
Here's an example of such a file: (data for CoNLL shared task)
He PRP B-NP
reckons VBZ B-VP
the DT B-NP
current JJ I-NP
account NN I-NP
deficit NN I-NP
will MD B-VP
narrow VB I-VP
to TO B-PP
only RB B-NP
# # I-NP
1.8 CD I-NP
billion CD I-NP
in IN B-PP
September NNP B-NP
. . O
He PRP B-NP
reckons VBZ B-VP
..
Это убивает преимущество CRF перед HMM. В итоге, я стал работать с CRFSuite, в котором для каждого слова можно задавать множество фич, причем наборы фич могут почти не пересекаться, то есть быть sparse. Такой подход сильно упрощает обучение. Кроме того, либа написана на C++ и достаточно просто прикрутилась к
моему POS Tagger'у.
И вот теперь решил поискать что-то на замену CRFSuite.
Сначала
SharpCRF. Одна фича на токен!
There is an example (a bigger training example file is at download section, you can see and download it there):
!
PUN
S
Tokyo
NNP
S_LOCATION
and
CC
S
New
NNP
B_LOCATION
York
NNP
E_LOCATION
are
VBP
S
major
JJ
S
financial
JJ
S
centers
NNS
S
.
PUN
S
!
PUN
S
p
FW
S
'
PUN
S
y
NN
S
h
FW
S
44
CD
S
University
NNP
B_ORGANIZATION
of
IN
M_ORGANIZATION
Texas
NNP
M_ORGANIZATION
Austin
NNP
E_ORGANIZATION
Беда. Попытка спилить в исходниках генерацию фич из шаблонов успехом не увенчалось. Там довольно простой C# код, но на одном из этапов я не смог разобраться с причинами ошибки и оставил попытки.
Затем
Wapiti. Смотрю примеры датасетов в архиве - опять эти проклятые шаблоны для генерации фич из одиночных фич для слов.
Пока остановился на
CRF ADF, в котором наборы признаков для CRF можно задавать напрямую без ограничений. Работает медленно, вроде бы не параллелиться, но для проверки самой идей бессловарной морфологии годится. Исходники на C#, но я в них по не лазал, так как бинарник успешно заработал "из коробки".
PS:
FlexCRFs вроде бы тоже свободен от этого неудобного ограничения на задание признаков. Хотя документация у них не ахти, особенно описание формата файлов с датасетами.