在元组列表中查找特定类型的一个或多个字符串

时间:2016-06-27 15:18:29

标签: 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','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']

1 个答案:

答案 0 :(得分:2)

这是一个非常简单的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)