Работа с целочисленными функциями для CRF в молотке
Я только начинаю использовать класс SimpleTagger в молотке. У меня сложилось впечатление, что он ожидает двоичные функции. Модель, которую я хочу реализовать, имеет положительные целочисленные функции, и мне интересно, как реализовать это в молотке. Кроме того, я слышал, что недвоичные функции должны быть нормализованы, если модель должна иметь смысл. Буду признателен за любые предложения о том, как это сделать.
пс. да, я знаю, что есть специальный список рассылки, но я уже почти сутки ожидаю подтверждения моей подписки, чтобы можно было публиковать там. Я просто спешу.
1 ответ
Что ж, сейчас прошло 6 лет. Если вы больше не спешите, вы можете проверить Java API для создания ваших экземпляров. Минимальный пример:
private Instance createInstance(LabelAlphabet labelAlphabet){
// observations and labels should be equal size for linear chain CRFs
TokenSequence observations = new TokenSequence();
LabelSequence labels = new LabelSequence(labelAlphabet, n);
observations.add(createToken());
labels.add("idk, some target or something");
return new Instance(
observations,
label,
"myInstance",
null
);
}
private Token createToken() {
Token token = new Token("exampleToken");
// Note: properties are not used for computing (I think)
token.setProperty("SOME_PROPERTY", "hello");
// Any old double value
token.setFeatureValue(featureVal, 666.0);
// etc for more features ...
return token;
}
public static void main(String[] args){
// Note the first arg is false to denote we *do not* deal with binary features
InstanceList instanceList = new InstanceList(new TokenSequence2FeatureVectorSequence(false, false));
LabelAlphabet labelAlphabet = new LabelAlphabet();
// Converts our tokens to feature vectors
instances.addThruPipe(createInstance(labelAlphabet));
}
Или, если вы хотите продолжать использовать SimpleTagger
просто определите бинарные функции как HAS_1_LETTER
, HAS_2_LETTER
и т. д., хотя это кажется утомительным.