如何从三元组中获得JJ和NN(形容词和名词)使用NLTK生成StanfordDependencyParser?

时间:2015-12-10 09:37:09

标签: parsing python-3.x nltk stanford-nlp triples

我使用以下代码获得三元组,但我想从tripples获取名词和形容词,我尝试了很多但是失败了,对NLTK和python有新的帮助吗?

from nltk.parse.stanford import StanfordDependencyParser
dp_prsr= StanfordDependencyParser('C:\Python34\stanford-parser-full-2015-04-20\stanford-parser.jar','C:\Python34\stanford-parser-full-2015-04-20\stanford-parser-3.5.2-models.jar', model_path='edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz')
word=[]
s='bit is good university'
sentence = dp_prsr.raw_parse(s)
for line in sentence:
    print(list(line.triples()))

[((' university',' NN'),' nsubj',(' bit',' NN&# 39;)),(('大学',' NN'),'警察'('是',' VBZ& #39;)),(('大学',' NN'),' amod'(' good',' JJ'))]

我想获得大学和优秀,BIT和universityi尝试以下但无法工作。

   for line in sentence:
    if (list(line.triples)).__contains__()  == 'JJ':
       word.append(list(line.triples()))
   print(word)

但我得到空阵......请任何帮助。

1 个答案:

答案 0 :(得分:2)

在语言

当您查找包含JJNN的三元组时,您正在寻找的内容通常是无上下文语法中的名词短语NP

在依赖语法中,您正在寻找的是包含参数中的JJ和NN POS标记的三元组。更具体地说,当你是一个包含一个形容词修饰名词的成分/分支时。在StanfordDepdencyParser输出中,您需要查找谓词 amod。 (如果您对上面解释的内容感到困惑,建议您在继续之前阅读依赖语法,请参阅https://en.wikipedia.org/wiki/Dependency_grammar

请注意,解析器输出三元组(arg1, pred, arg2),其中参数2(arg2)依赖于参数1(arg1)通过谓词(pred)关系;即arg1管辖arg2(参见,https://en.wikipedia.org/wiki/Government_(linguistics)

Pythonically

现在到答案的代码部分。你想迭代一个元组列表(即三元组),所以最简单的解决方案是在你迭代时专门为元组分配变量,然后检查你需要的条件Find an element in a list of tuples

>>> x = [(('university', 'NN'), 'nsubj', ('bit', 'NN')), (('university', 'NN'), 'cop', ('is', 'VBZ')), (('university', 'NN'), 'amod', ('good', 'JJ'))]
>>> for arg1, pred, arg2 in x:
...     word1, pos1 = arg1
...     word2, pos2 = arg2
...     if pos1.startswith('NN') and pos2.startswith('JJ') and pred == 'amod':
...             print ((arg1, pred, arg2))
... 
(('university', 'NN'), 'amod', ('good', 'JJ'))