2013-03-05 68 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'])