过滤斯坦福依赖性分析器输出

时间:2017-01-22 21:34:39

标签: python nltk stanford-nlp

如何修改此代码以仅从代码中获取一个特定输出。例如,如何在输出中只获得'nmod''dobj'

from nltk.parse.stanford import StanfordDependencyParser
from nltk.tokenize import word_tokenize
from nltk.tree import Tree
stanford_models = 'E:\stanford-parser\stanford-parser-3.7.0-models.jar'
stanford_jar = 'E:\stanford-parser\stanford-parser.jar'
st = StanfordDependencyParser(stanford_models, stanford_jar, encoding='utf-8')
text = 'Randy,Can you send me a schedule of the salary.'
result= st.raw_parse(text)
dep = result.__next__()
list(dep.triples())

输出结果为:

[(('send', 'VB'), 'discourse', ('Randy', 'UH')),
 (('send', 'VB'), 'aux', ('Can', 'MD')),
 (('send', 'VB'), 'nsubj', ('you', 'PRP')),
 (('send', 'VB'), 'iobj', ('me', 'PRP')),
 (('send', 'VB'), 'dobj', ('schedule', 'NN')),
 (('schedule', 'NN'), 'det', ('a', 'DT')),
 (('schedule', 'NN'), 'nmod', ('salary', 'NN')),
 (('salary', 'NN'), 'case', ('of', 'IN')),
 (('salary', 'NN'), 'det', ('the', 'DT'))]

1 个答案:

答案 0 :(得分:3)

您唯一需要做的就是filter(..),也许可以转换回list(..)

the_triples = list(dep.triples()) #you already have this line
result = filter(lambda v : v[1] == 'nmod' or v[1] == 'dobj',the_triples)

当您运行时,result将成为一个列表,如果您使用,结果将是生成器(因此处理是延迟,直到你真的需要价值观)。您可以通过调用list(..)将生成器转换为列表。

filter(function,iterable)将函数和迭代作为输入。正如iterable我们向其提供三元组列表,因为function我们使用v : v[1] == 'nmod' or v[1] == 'dobj'这是一个取三元组并且成功的函数,因为三元组的第二个元素是{{1} }或'nmod'。因此,假设函数将三元组计算为'dobj',则将发出该元素,否则将忽略该元素。