如何从使用 NLTK 生成的 StanfordDependencyParser 三元组中获取 JJ 和 NN(形容词和名词)?
How to get JJ and NN (adjective and Noun) from the triples generated StanfordDependencyParser with NLTK?
我使用以下代码得到了三元组,但我想从三元组中获取名词和形容词,我尝试了很多但都失败了,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')), (('university', 'NN'), 'cop', ('is', 'VBZ')), (('university', 'NN'), 'amod', ( 'good', 'JJ'))]
我想上大学,想考好 BIT 和大学我尝试了以下但无法工作。
for line in sentence:
if (list(line.triples)).__contains__() == 'JJ':
word.append(list(line.triples()))
print(word)
但我得到的是空数组...请帮忙。
语言学
当您寻找包含 JJ
和 NN
的三元组时,您要寻找的通常是上下文无关语法中的名词短语 NP
。
在依存语法中,您要查找的是在参数 中包含 JJ 和 NN POS 标记的三元组。最具体地说,当您要使用包含形容词修饰名词的成分/分支时。从 StanfordDepdencyParser
输出中,您需要查找 predicate amod
。 (如果您对上面解释的内容感到困惑,建议在继续之前阅读依赖语法,请参阅 https://en.wikipedia.org/wiki/Dependency_grammar。
请注意,解析器输出三元组,(arg1, pred, arg2)
,其中参数 2 (arg2
) 通过谓词 (pred
) 依赖于参数 1 (arg1
) ) 关系;即 arg1
管辖 arg2
(参见 https://en.wikipedia.org/wiki/Government_(linguistics))
Python 的
现在到答案的代码部分。您想要遍历元组列表(即三元组),因此最简单的解决方案是在迭代时专门为元组分配变量,然后检查您需要的条件,请参阅 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'))
我使用以下代码得到了三元组,但我想从三元组中获取名词和形容词,我尝试了很多但都失败了,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')), (('university', 'NN'), 'cop', ('is', 'VBZ')), (('university', 'NN'), 'amod', ( 'good', 'JJ'))]
我想上大学,想考好 BIT 和大学我尝试了以下但无法工作。
for line in sentence:
if (list(line.triples)).__contains__() == 'JJ':
word.append(list(line.triples()))
print(word)
但我得到的是空数组...请帮忙。
语言学
当您寻找包含 JJ
和 NN
的三元组时,您要寻找的通常是上下文无关语法中的名词短语 NP
。
在依存语法中,您要查找的是在参数 中包含 JJ 和 NN POS 标记的三元组。最具体地说,当您要使用包含形容词修饰名词的成分/分支时。从 StanfordDepdencyParser
输出中,您需要查找 predicate amod
。 (如果您对上面解释的内容感到困惑,建议在继续之前阅读依赖语法,请参阅 https://en.wikipedia.org/wiki/Dependency_grammar。
请注意,解析器输出三元组,(arg1, pred, arg2)
,其中参数 2 (arg2
) 通过谓词 (pred
) 依赖于参数 1 (arg1
) ) 关系;即 arg1
管辖 arg2
(参见 https://en.wikipedia.org/wiki/Government_(linguistics))
Python 的
现在到答案的代码部分。您想要遍历元组列表(即三元组),因此最简单的解决方案是在迭代时专门为元组分配变量,然后检查您需要的条件,请参阅 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'))