1

文字列のサフィックスを検出し、これらのサフィックス付きの要素をリストから削除する方法は? これは NLP のステミング/レンマタイゼーション タスクのように見えますが、このタスクにはより単純な機能が必要であることは理解しています。

与えられた場合、リストに接尾辞のないアイテムが存在する場合、接尾辞sと接尾辞を持つ要素を削除する必要があります。es

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

出力する必要があります:

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

私は次のことを試しましたが、連想リストを整理するとうまくいかないため、うまくいきませ['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']
4

2 に答える 2

8
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']
于 2013-03-05T14:33:27.303 に答える
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'])
于 2013-03-05T14:52:14.083 に答える