使用 NLTK 通过分块进行关系提取

Relation extraction via chunking using NLTK

我正在尝试弄清楚如何根据 Chapter 7 of the NLTK book 使用 NLTK 的级联分词器。不幸的是,在执行重要的分块措施时,我 运行 遇到了一些问题。

让我们从这个短语开始:

"adventure movies between 2000 and 2015 featuring performances by daniel craig"

当我使用以下语法时,我能够找到所有相关的 NP:

grammar = "NP: {<DT>?<JJ>*<NN.*>+}"

但是,我不确定如何使用 NLTK 构建嵌套结构。该书给出了以下格式,但显然缺少一些东西(例如,一个人实际上如何指定多个规则?):

grammar = r"""
  NP: {<DT|JJ|NN.*>+}          # Chunk sequences of DT, JJ, NN
  PP: {<IN><NP>}               # Chunk prepositions followed by NP
  VP: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
  CLAUSE: {<NP><VP>}           # Chunk NP, VP
  """

就我而言,我想执行以下操作:

grammar = r"""
          MEDIA: {<DT>?<JJ>*<NN.*>+}
          RELATION: {<V.*>}{<DT>?<JJ>*<NN.*>+}
          ENTITY: {<NN.*>}
          """

假设我想为我的任务使用级联分块器,我需要使用什么语法?此外,我是否可以在使用分词器时指定特定的词(例如 "directed" 或 "acted")?

我无法对关系提取部分发表评论,尤其是因为您没有详细说明您想要做什么以及您拥有什么样的数据。所以这是一个相当片面的答案。

a.) How does cascading chunking work in NLTK b.) Is it possible to treat the chunker like a context-free grammar, and if so, how?

据我了解 NLTK 书中的 "Building nested structure with cascaded chunkers" 部分,您可以将它与上下文无关语法一起使用,但您必须重复应用它才能获得递归结构。分块是扁平的,但您可以在分块之上添加分块。

c.) How can I use chunking to perform relation extraction?

我真的不能这么说,而且正如我所说,你没有给出任何细节;但如果您处理的是真实文本,我的理解是手写 any 任务的规则集是无用的,除非您拥有庞大的团队和大量时间。查看 NLTK 附带的概率工具。如果你有一个带注释的训练语料库,这会容易得多。

无论如何,关于 RegexpParser 的更多评论。

  1. 您会在 http://www.nltk.org/howto/chunk.html 上找到更多使用示例。 (不幸的是,这不是真正的操作方法,而是测试套件。)

  2. 根据this,你可以像这样指定多个扩展规则:

    patterns = """NP: {<DT|PP$>?<JJ>*<NN>}
        {<NNP>+}
        {<NN>+}
    """
    

    我应该补充一点,语法可以有多个具有相同左侧的规则。这应该增加一些与分组相关规则等的灵活性