如何修改此代码,使其只从代码中获得一个特定的输出。例如,如何在输出中只获得'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'))]发布于 2017-01-22 21:36:04
您唯一需要做的就是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)当您运行python-2.x时,result将是一个列表,如果您使用python-3.x,结果将是一个生成器(因此处理会延迟到您真正需要这些值)。通过在生成器上调用list(..),可以将生成器转换为列表。
filter(function,iterable)接受一个函数和一个可迭代的函数作为输入。当iterable将三元组列表提供给它时,作为function,我们使用v : v[1] == 'nmod' or v[1] == 'dobj',它是一个接受三元组并成功的函数,因为三元组的第二个元素是'nmod'或'dobj'。因此,如果函数将三元组计算为True,则元素将被发出,否则将被忽略。
https://stackoverflow.com/questions/41796403
复制相似问题