如何修改此代码以仅从代码中获取一个特定输出。例如,如何在输出中只获得'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'))]
答案 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)
当您运行python-2.x时,result
将成为一个列表,如果您使用python-3.x,结果将是生成器(因此处理是延迟,直到你真的需要价值观)。您可以通过调用list(..)
将生成器转换为列表。
filter(function,iterable)
将函数和迭代作为输入。正如iterable
我们向其提供三元组列表,因为function
我们使用v : v[1] == 'nmod' or v[1] == 'dobj'
这是一个取三元组并且成功的函数,因为三元组的第二个元素是{{1} }或'nmod'
。因此,假设函数将三元组计算为'dobj'
,则将发出该元素,否则将忽略该元素。