使用 NLTK 的语义角色标签

Posted

技术标签:

【中文标题】使用 NLTK 的语义角色标签【英文标题】:Semantic Role Labeling using NLTK 【发布时间】:2014-01-02 10:34:48 【问题描述】:

我有一个句子列表,我想分析每个句子并确定该句子中的语义角色。我该怎么做?

我在 NLTK 模块中发现了 PropBankCorpusReader,它向 Penn Treebank 添加了语义标签信息。此外,我在互联网上的研究表明,该模块用于执行语义角色标签。

然而,我找不到一个小的 HOWTO 来帮助我理解我们如何利用 PropBankCorpusReader 对任意文本执行 SRL。

因此有人可以指出使用PropbankCorpusReader 对任意句子执行 SRL 的示例吗?

【问题讨论】:

【参考方案1】:

SRL 根本不是一个小问题,也不是使用nltk 可以立即完成的事情。

您可以将 SRL 的任务分解为 3 个独立的步骤:

    识别谓词。 对谓词执行词义消歧以确定它接受哪些语义参数。 识别句子中的语义参数。

目前解决此问题的大多数方法都使用监督机器学习,其中分类器将在 Propbank 或 FrameNet 句子的子集上进行训练,然后在剩余的子集上进行测试以测量其准确性。研究人员倾向于专注于调整功能和算法,以及修补上述步骤是按顺序完成还是同时完成,以及以什么顺序完成。

您可能想要查看的一些论文是:

Simmons (1973) - 经典的 SRL 论文。 Gildea and Jurafsky (2002) - 提供一组用于分类的简单功能。 Xue and Palmer (2004) - 更深入地了解有用的功能 Meza-Ruiz and Riedel (2009) - 一种使用 Markov Logic 的有趣方法。

马尔可夫逻辑方法很有前途,但根据我自己的经验,它遇到了严重的可扩展性问题(我只使用过Alchemy,尽管Alchemy Lite 看起来很有趣)。使用 nltk Propbank 数据实现某种分类器的工作量并不大,而且 Python 中已经存在一些 off the shelf classifiers。

编辑: 来自爱丁堡大学的This assignment 给出了一些如何解析 Propbank 数据的示例,part of a school project 我确实实现了一个完整的 Propbank 特征解析器,尽管这些特征是专门针对以 Meza-Ruiz 和 Riedel (2009) 的风格在马尔可夫逻辑网络中使用。

【讨论】:

【参考方案2】:

查看这个全新的 Python 库(取决于 NLTK)https://pypi.python.org/pypi/nlpnet/ ... 它可以处理 POS 和 SRL。

【讨论】:

截至今天,SRL 模型在 nlpnet 中仅提供葡萄牙语版本【参考方案3】:

我建议PractNLPTools,它有许多不错的工具,包括语义角色标签

我现在正在为一个工作项目询问它,看起来它可以完成工作。

Practnlp工具: https://pypi.python.org/pypi/practnlptools/1.0

GitHub 支持站点: https://github.com/biplab-iitb/practNLPTools

【讨论】:

PractNLPTools only ever had one release, in 6/2014,似乎不活跃【参考方案4】:

到目前为止,最简单的选择可能是https://demo.allennlp.org/semantic-role-labeling。由于底层的 Transformer 架构,它需要超过 1 GB 的内存。

【讨论】:

我想他们会想出一个压缩的实现,就像 DistilBERT...? 不确定你是否仍然对这个@smci 感兴趣,但你可以使用 DistilBERT 重新训练 SRL 模型。你只需要修改配置文件bert_base_srl.jsonnet

以上是关于使用 NLTK 的语义角色标签的主要内容,如果未能解决你的问题,请参考以下文章

语义标签

HTML中的语义标签和元信息标签(整理)

如何在 AllenNLP 中训练语义角色标注模型?

使用不可靠伪标签的半监督语义分割

语义化标签是啥?有啥作用

[学习记录]NLTK常见操作一(去网页标记,统计词频,去停用词)