使用 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 的更多评论。
您会在 http://www.nltk.org/howto/chunk.html 上找到更多使用示例。 (不幸的是,这不是真正的操作方法,而是测试套件。)
根据this,你可以像这样指定多个扩展规则:
patterns = """NP: {<DT|PP$>?<JJ>*<NN>}
{<NNP>+}
{<NN>+}
"""
我应该补充一点,语法可以有多个具有相同左侧的规则。这应该增加一些与分组相关规则等的灵活性
我正在尝试弄清楚如何根据 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 的更多评论。
您会在 http://www.nltk.org/howto/chunk.html 上找到更多使用示例。 (不幸的是,这不是真正的操作方法,而是测试套件。)
根据this,你可以像这样指定多个扩展规则:
patterns = """NP: {<DT|PP$>?<JJ>*<NN>} {<NNP>+} {<NN>+} """
我应该补充一点,语法可以有多个具有相同左侧的规则。这应该增加一些与分组相关规则等的灵活性