2013-03-05 143 views
1

如何检测字符串后缀并从列表中删除这些后缀元素? 我明白,这看起来像一个自然语言处理,词干/词法化的任务,但任务需要一个更简单的功能。如何检测字符串后缀并从列表中删除这些后缀元素? - Python

给出的,我需要的,如果在列表中存在非后缀项删除具有ses后缀内容:

alist = ['bar','barbar','foo','foos','barbares','foofoos','bares'] 

我需要输出:

alist = ['bar','barbar','foo','foofoos'] 

我已经尝试了以下,但它不起作用,因为当我理清alist,它得到['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']不是['bar', 'bares', 'barbar', 'barbares', 'foo', 'foos', 'foofoos']

alist = ['bar','barbar','foo','foos','barbares','foofoos','bares'] 

prev = "" 
no_s_list = [] 
for i in sorted(alist): 
    if i[-2:] == "es" and i[:-2] == prev: 
    continue 
    elif i[-1:] == "s" and i[:-1] == prev: 
    contine 
    else: 
    prev = i 
    no_s_list.append(i) 

以上输出:

>>> sorted(alist) 
['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos'] 
+1

http://stackoverflow.com/questions/771918/how-do-i-do-word-stemming-or-lemmatization – Hoopdady 2013-03-05 14:30:11

+0

它不是一个词干/词形还原任务! – alvas 2013-03-05 14:31:04

回答

7
def rm_suffix(s,suffixes): 
    for suf in suffixes: 
     if s.endswith(suf): 
      return s[:-len(suf)] 
    return s 

alist = ['bar','barbar','foo','foos','barbares','foofoos','bares'] 
salist = set(alist) 
suffixes = ('es','s') 
blist = [x for x in alist 
     if (not x.endswith(suffixes)) or (rm_suffix(x,suffixes) not in salist)] 
print blist # ['bar', 'barbar', 'foo', 'foofoos'] 
+0

非常感谢。应该想到'str.endswith' =) – alvas 2013-03-05 14:35:40

+1

我打算建议使用不同的排序功能,但这种解决方案绝对更清洁。 – Gorbag 2013-03-05 14:46:22

1

您还可以使用regex这里:

re.split()将返回类似:

barbar - >['barbar']

foos - - >['foo', 's', '']

barbares - >['barbar', 'es', '']

foofoos - >['foofoo', 's', '']

所以,如果返回的列表的长度大于1个,此类第一个元素返回的列表中alist被发现,那么你可以删除它。

code

In [106]: alist = ['bar','barbar','foo','foos','barbares','foofoos','bares'] 

In [107]: s=set(alist) 

In [108]: for x in s.copy(): 
    sol=re.split(r'(es|s)$',x) 
    if len(sol)>1 and sol[0] in s: 
     s.remove(x) 
    .....:   

In [109]: s 
Out[109]: set(['bar', 'foofoos', 'barbar', 'foo'])