【问题标题】:Add feature extractor to Stanford NER将特征提取器添加到斯坦福 NER
【发布时间】:2015-10-21 19:51:58
【问题描述】:

http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/ie/NERFeatureFactory.html,添加一个新的提取器,最后一步是:

为此功能向 NERFeatureFactory 添加代码。首先决定哪个 该功能涉及类(隐藏状态)。如果只有 当前类,您将特征提取器添加到 featuresC 代码中,如果 当前类和上一类,然后是 featuresCpC 等。

我们只需要在特征集合中添加一个字符串,例如:featuresCpCnC.add(getWord(c) + "-PNSEQW");,然后StanfordNER就会将字符串解析为一个真实的特征吗?在这种情况下,如何在特征字符串中指定特定的类/字段,例如标题和作者?当我将特征转储到文本文件时(使用 exportFeatures 或 printFeatures),我只找到像 June-PSEQW|CpC 这样的通用类的特征,而我想要像 June-DateField-DateField-PSEQW|CpC 这样的东西,这意味着 (class[t-1]==DateField)*(class[t]==DateField)*(word[t-1]=="June")

【问题讨论】:

  • 看来我找到了答案。添加字符串是添加新特征提取器的正确方法。斯坦福 NER 之所以只有泛型类的特征,是因为随后会生成所有可能的特定类的特征,并使用前向后向算法学习它们的权重。

标签: stanford-nlp named-entity-recognition


【解决方案1】:

我认为这是预期行为 - 是否存在表明训练未按预期工作的性能问题?

详细地说,在最一般的情况下,特征化器 f(x,y) 接受输入 x 和输出 y,并为该特定对构造一个特征向量。然而,在许多 NLP 应用程序中,特征只真正依赖于输入 x,因此我们公开的特征化器接口只是 f(x),并且只是隐式地将特征与后端的输出类 (see, e.g., page 10 on "Block Feature Vectors") 连接起来。在这种情况下,我们只打印f(x),而不是完整的f(x,y),这似乎是合理的。

【讨论】:

  • 谢谢。更详细地说,我认为 CRF 应该计算所有可能的 f(x,y) 的权重。因此,在不指定权重的情况下,它们的打印行为是有意义的。但是,有时,我们只想输出具有显着权重的 f(x,y) 或具有最高权重的 f(x,y),这将有助于发现一些有用的模式。当前的 API 似乎不支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2020-04-28
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多