Python 在元组列表中查找某种类型的一个或多个字符串

Python 在元组列表中查找某种类型的一个或多个字符串,python,nltk,Python,Nltk,假设我有以下元组: tagged = [('They', 'PRP'), ('refuse', 'VBP'), ('to', 'TO'), ('permit', 'VB'), ('us', 'PRP'), ('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')] 我想取一个或多个名词的所有组合(按顺序排列)。因此,产出将是: ['refuse','permit','re

假设我有以下元组:

tagged = [('They', 'PRP'),
 ('refuse', 'VBP'),
 ('to', 'TO'),
 ('permit', 'VB'),
 ('us', 'PRP'),
 ('to', 'TO'),
 ('obtain', 'VB'),
 ('the', 'DT'),
 ('refuse', 'NN'),
 ('permit', 'NN')]
我想取一个或多个名词的所有组合(按顺序排列)。因此,产出将是:

['refuse','permit','refuse permit']
我可以这样得到前两个:

filtered = [x[0] for x in tagged if x[1]=='NN']
但我目前无法找到一种方法来获取列表中的
'NN'
序列

编辑:

此列表是一个更好的示例:

 [('If', 'IN'),
 ('the', 'DT'),
 ('company', 'NN'),
 ('name', 'NN'),
 ('or', 'CC'),
 ('job', 'NN'),
 ('title', 'NN'),
 ('includes', 'VBZ'),
 ('multiple', 'JJ'),
 ('words', 'NNS'),
 (',', ','),
 ('use', 'NN'),
 ('double', 'JJ'),
 ('quotation', 'NN'),
 ('marks', 'NNS'),
 ('.', '.')]
应返回:

['company', 'name', 'company name', 'job', 'title', 'job title', 'use', 'quotation']

这是一个非常简单的
groupby
操作,只需少量处理。如果我们按标签分组,只看一组名词,那么我们就快到了。然后要做的唯一一件事是加入包含多个项目的组,并将这些项目按正确的顺序放入输出中:

from itertools import groupby

def group_nouns(iterable):
    for key, group in groupby(iterable, key=lambda t: t[1]):
        if key == 'NN':  # only worry about groups of nouns.
            seq = [t[0] for t in group]  # drop tags.
            if len(seq) == 1:
                yield seq[0]
            else:
                for noun in seq:
                    yield noun
                yield ' '.join(seq)

您是否研究过
itertools.groupby
?这可以很容易地得到相同标记的组。添加以下行如何:filtered.append(“.join(filtered))@YOBA适用于此示例,但如果列表中的其他“NN”不在“NN”序列中,则不行。请停止批准无意义的小编辑,这只会鼓励更多的人进入审核队列。@jornsharpe itertools.groupby不能解决按顺序排列的“NN”
''的问题。join(seq)
即使在
len(seq)==1的情况下也能工作,FWIW@jonrsharpe是的,但是OP似乎不想在输出中放置两次1元素序列,所以我认为这种情况仍然需要特殊处理。(例如,
['company','name']->
['company','name','company\u name']但是
['use']
->
['use']
)哦,我明白了。他们的输出有点奇怪!