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']
)哦,我明白了。他们的输出有点奇怪!