7

我是 Python 和 NLP 世界的新手。Google 最近发布的 Syntaxnet 引起了我的兴趣。但是,我在理解有关语法网和相关工具(nltk 等)的文档时遇到了很多麻烦。

我的目标:给定诸如“Wilbur kicked the ball”之类的输入,我想提取词根动词(kicked)和它与“the ball”相关的对象。

我偶然发现了“spacy.io”,这个可视化似乎封装了我想要完成的事情:POS 标记一个字符串,并将其加载到某种树结构中,以便我可以从根动词开始并遍历句子。

我玩弄了syntaxnet/demo.sh,并按照这个线程中的建议注释掉了最后几行以获得conll输出。

然后我在 python 脚本中加载了这个输入(我自己拼凑在一起,可能不正确):

import nltk
from nltk.corpus import ConllCorpusReader
columntypes = ['ignore', 'words', 'ignore', 'ignore', 'pos']
corp = ConllCorpusReader('/Users/dgourlay/development/nlp','input.conll', columntypes)

我看到我可以访问 corp.tagged_words(),但单词之间没有关系。现在我被困住了!如何将此语料库加载到树型结构中?

任何帮助深表感谢!

4

3 回答 3

3

作为评论,这可能会更好,但我还没有所需的声誉。

我以前没有使用过 ConllCorpusreader(你会考虑将你正在加载的文件上传到一个 gist 并提供一个链接吗?它会更容易测试),但我写了一篇可能有助于树解析方面的博客文章:在这里

特别是,您可能希望对每个句子进行分块。NLTK 书的第 7 章对此有更多信息,但这是我博客中的示例:

# This grammar is described in the paper by S. N. Kim,
# T. Baldwin, and M.-Y. Kan.
# Evaluating n-gram based evaluation metrics for automatic
# keyphrase extraction.
# Technical report, University of Melbourne, Melbourne 2010.
grammar = r"""
NBAR:
  # Nouns and Adjectives, terminated with Nouns
  {<NN.*|JJ>*<NN.*>}

NP:
  {<NBAR>}
    # Above, connected with in/of/etc...
  {<NBAR><IN><NBAR>}
"""

chunker = nltk.RegexpParser(grammar)
tree = chunker.parse(postoks)

注意:你也可以使用上下文无关语法(在第 8 章中介绍)。

每个分块(或解析)的句子(或在此示例中为名词短语,根据上面的语法)将是一个子树。要访问这些子树,我们可以使用这个函数:

def leaves(tree):
  """Finds NP (nounphrase) leaf nodes of a chunk tree."""
  for subtree in tree.subtrees(filter = lambda t: t.node=='NP'):
    yield subtree.leaves()

每个产生的对象都是单词标签对的列表。从那里你可以找到动词。

接下来,您可以使用上面的语法或解析器。动词拆分名词短语(参见第 7 章中的图表),因此您可能只访问NPa 之后的第一个短语VBD

很抱歉解决方案不是针对您的问题,但希望这是一个有用的起点。如果您上传文件,我会再拍一张:)

于 2016-05-26T07:07:55.737 回答
2

您要做的是找到一个依赖项,即dobj。我对 SyntaxNet/Parsey 还不够熟悉,无法告诉您如何准确地从其输出中提取该依赖项,但我相信这个答案可能会对您有所帮助。简而言之,您可以将 Parsey 配置为使用 ConLL 语法进行输出,将其解析为您认为易于遍历的任何内容,然后查找 ROOT 依赖项以查找动词和 *obj 依赖项以查找其对象。

于 2016-05-22T13:10:43.903 回答
0

如果您使用任何解析器解析了 conll 格式的原始文本,则可以按照以下步骤遍历您感兴趣的节点的依赖项:

  1. 从输出 conll 句子构建邻接矩阵
  2. 查找您感兴趣的节点(在您的情况下为动词)并从邻接矩阵(索引)中提取其依赖项
  3. 对于每个依赖项,在 conll 格式的第 8 列中查找其依赖项标签。

PS:我可以提供代码,但如果你能自己编码就更好了。

于 2016-05-26T14:46:00.260 回答