假设我有以下元组:
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']
答案 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)