【问题标题】:Chunking with nltk用 nltk 分块
【发布时间】:2013-01-19 11:48:22
【问题描述】:

如何从给定模式的句子中获取所有块。 示例

NP:{<NN><NN>}

句子标记:

[("money", "NN"), ("market", "NN") ("fund", "NN")]

如果我解析我得到

(S (NP money/NN market/NN) fund/NN)

我也想有另一个选择,那就是

(S money/NN (NP market/NN fund/NN))

【问题讨论】:

  • 这不是分块,这叫解析
  • 即使我寻找所有可能的分块,解析是否仍然会消耗更多的计算量?
  • 分块也称为浅解析。浅解析是当您关心大型 NP 而忽略 NP 内部的顺序和 POS 时,正常的正则表达式分块器可能会起作用。但是您的问题需要 NP 的复杂顺序(即深度解析),因此需要解析器。

标签: python nlp nltk chunking


【解决方案1】:

@mbatchkarov 关于 nbest_parse 文档是正确的。为了代码示例,请参阅:

import nltk
# Define the cfg grammar.
grammar = nltk.parse_cfg("""
S -> NP
S -> NN NP
S -> NP NN
NP -> NN NN
NN -> 'market'
NN -> 'money'
NN -> 'fund'
""")

# Make your string into a list of tokens.
sentence = "money market fund".split(" ")

# Load the grammar into the ChartParser.
cp = nltk.ChartParser(grammar)

# Generate and print the nbest_parse from the grammar given the sentence tokens.
for tree in cp.nbest_parse(sentence):
    print tree

【讨论】:

  • 首先创建所需的 CFG 语法。终端节点(即您的词汇/单词)也需要在语法中。然后你调用 ChartParser 来加载你定义的语法。然后,根据您传递给 nbest_parse 的句子列表,您尝试获得最佳解析。
  • 我只是想使用没有语法的正则表达式....在正则表达式的情况下,如果你有一个像 nnn 这样的字符串并且你正在寻找表达式 nn,rexep 允许你拥有列表在这种情况下匹配模式的索引 (0, 2) 和 (1, 3)。
【解决方案2】:

我认为您的问题是关于获得n 最有可能解析一个句子。我对吗?如果是,请查看 2.0 documentation 中的nbest_parse(sent, n=None) 函数。

【讨论】:

  • 即使我使用 iter_parse 解析,它的接缝也会为 RegexpParser 提供相同的答案。
猜你喜欢
  • 2015-12-27
  • 1970-01-01
  • 2012-04-21
  • 2017-02-24
  • 2015-07-28
  • 1970-01-01
  • 2016-06-01
  • 2017-04-11
  • 2014-07-07
相关资源
最近更新 更多