使用nltk进行分块

4

如何根据模式从句子中获取所有的块。

例如:

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))

这不是分块,而是解析。 - Vsevolod Dyomkin
即使我寻找所有可能的分块,解析仍然比分块更消耗计算资源吗? - vigte
分块也被称为浅层解析。当你关注大型名词短语并忽略其中名词短语内部的顺序和词性时,正则表达式分块器可能会起作用。但是你的问题需要详细了解名词短语的顺序(即深度解析),因此需要使用解析器。 - alvas
2个回答

6
@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的句子列表中获取最佳解析。 - alvas
我在想只使用正则表达式而不用语法...在正则表达式的情况下,如果你有一个字符串像nnn,并且你正在寻找表达式nn,那么正则表达式允许你得到与模式匹配的索引列表,在这种情况下是(0, 2)和(1, 3)。 - vigte

1
我认为你的问题是关于获取一个句子中最有可能的前n个解析结果。我说得对吗?如果是的话,请参考2.0文档中的nbest_parse(sent, n=None)函数。

即使我使用iter_parse解析,它似乎仍然会给出与RegexpParser相同的答案。 - vigte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接