4

在 crf 模型中添加数字特征是否可能/很好?例如序列中的位置。

我正在使用CRFsuite。似乎所有特征都将转换为字符串,例如'pos = 0','pos = 1',然后失去它作为欧几里得距离的含义。

或者我应该使用它们来训练另一个模型,例如 svm,然后与 crf 模型集成?

4

3 回答 3

9

我发现 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” 被添加到每个键。

只要:

  1. 我保持输入格式正确;
  2. 我使用浮点数与浮点数字符串;
  3. 我把它标准化。
于 2014-10-13T21:40:49.620 回答
4

CRF 本身可以使用数字特征,您应该使用它们,但如果您的实现将它们转换为字符串(通过“一个热点编码”以二进制形式编码),那么它的重要性可能会降低。我建议寻找更多允许连续变量的“纯”CRF。

一个有趣的事实是,CRF 的核心只是结构化 MaxEnt (LogisticRegression),它在连续域中工作,这种字符串编码实际上是一种从分类值到连续域的方法,所以你的问题实际上是 CRFSuite “过度设计”的结果它忘记了CRF模型的实际能力。

于 2014-10-02T15:06:49.843 回答
0

只是为了澄清 Lishu 的答案(这是正确的,但在我尝试之前可能会像它对我所做的那样让其他读者感到困惑)。这个:

{“string_key”: float_weight, ...} dict 其中键是观察到的特征,值是它们的权重

可以写成

{“feature_template_name”: feature_value, ...} dict 其中键是特征名称,值是它们的值

也就是说,您没有设置与此 feature_template 对应的 CRF 的权重,而是设置此功能的值。我更喜欢将它们称为具有特征值的特征模板,以便一切都比“特征”更清楚。然后,CRF 将学习与此 feature_template 的每个可能的 feature_values 相关联的权重

于 2019-09-03T22:11:05.207 回答