在 crf 模型中添加数字特征是否可能/很好?例如序列中的位置。
我正在使用CRFsuite。似乎所有特征都将转换为字符串,例如'pos = 0','pos = 1',然后失去它作为欧几里得距离的含义。
或者我应该使用它们来训练另一个模型,例如 svm,然后与 crf 模型集成?
在 crf 模型中添加数字特征是否可能/很好?例如序列中的位置。
我正在使用CRFsuite。似乎所有特征都将转换为字符串,例如'pos = 0','pos = 1',然后失去它作为欧几里得距离的含义。
或者我应该使用它们来训练另一个模型,例如 svm,然后与 crf 模型集成?
我发现 CRFsuite 确实可以处理数字特征,至少根据本文档:
- {“string_key”: float_weight, ...} dict 其中键是观察到的特征,值是它们的权重;
- {“string_key”: bool, ...} 字典;True 转换为 1.0 权重,False - 转换为 0.0;
- {“string_key”: “string_value”, ...} 字典;这与 {“string_key=string_value”: 1.0, ...} 相同
- [“string_key1”, “string_key2”, ...] 列表;这与 {“string_key1”: 1.0, “string_key2”: 1.0, ...} 相同
- {“string_prefix”: {...}} dicts:处理嵌套的 dict 并将“string_prefix”添加到每个键。
- {“string_prefix”: [...]} dicts:处理嵌套列表,并将“string_prefix”添加到每个键。
- {“string_prefix”: set([...])} dicts: 嵌套列表被处理,并且“string_prefix” 被添加到每个键。
只要:
CRF 本身可以使用数字特征,您应该使用它们,但如果您的实现将它们转换为字符串(通过“一个热点编码”以二进制形式编码),那么它的重要性可能会降低。我建议寻找更多允许连续变量的“纯”CRF。
一个有趣的事实是,CRF 的核心只是结构化 MaxEnt (LogisticRegression),它在连续域中工作,这种字符串编码实际上是一种从分类值到连续域的方法,所以你的问题实际上是 CRFSuite “过度设计”的结果它忘记了CRF模型的实际能力。
只是为了澄清 Lishu 的答案(这是正确的,但在我尝试之前可能会像它对我所做的那样让其他读者感到困惑)。这个:
{“string_key”: float_weight, ...} dict 其中键是观察到的特征,值是它们的权重
可以写成
{“feature_template_name”: feature_value, ...} dict 其中键是特征名称,值是它们的值
也就是说,您没有设置与此 feature_template 对应的 CRF 的权重,而是设置此功能的值。我更喜欢将它们称为具有特征值的特征模板,以便一切都比“特征”更清楚。然后,CRF 将学习与此 feature_template 的每个可能的 feature_values 相关联的权重