2012-03-21 6 views
3

주어진 단어와 가능한 접미사 (약 1000 자)를 모두 구분해야합니다. 나는 딕트 사용에 대해 생각하고있다.사전을 사용하여 접미사 구분하기

그래서 나는 접미어를 키로 사용할 것입니다 (추가 프로세스에서 필요한 접미사에 대한 몇 가지 추가 정보). 가능한 가장 긴 접미사가 4 글자 인 경우 모든 조합에 대해 딕트를 검색합니다. 예 : 주어진 단어 : 'abcdefg' 'g', 'fg', 'efg'및 'defg'에 대한 명령문을 검색합니다.

저는 약간의 연구를했으며 거의 ​​비슷한 용도를 찾지 못했습니다. 이것이 가능한 해결책 일 수 있습니까? 아니면 여기에 뭔가 빠졌습니까? 많이 appriciated 도움이됩니다.

+0

내가 요구 사항을 이해하지 않는다 : 그 일의

간단한 방법은 (파이썬 3 테스트)? RE를 사용할 때 코드는 어떻게 보이나요? –

+0

[networkx] (http://networkx.lanl.gov/)를 검색하는 것이 더 나을 수도 있습니다. 나는 정규 표현식 부분을 이해하지 못한다. 접미사를 나누기 위해서 사용하고 있는가? –

+0

접미사의 대부분이 작은 덩어리로 분해 될 수 있기 때문에 전처리를 위해 정규식을 사용하는 것을 생각했습니다 ...그러나 나는 그 생각을 실제로 서면으로 표현하지 못했다. 나는 그것을 편집 할 것이다. – root

답변

3

이 솔루션은 좋은 소리 - 그것은 단어 당 몇 사전 룩 - 업, 그리고 사전 룩 - 업이 빠르다. 더 복잡한 솔루션 (trie 사용과 같은)이 여기에 가치가 있다고 생각하지 않습니다. 접미어 만 제거하기 위해 사전 대신 집합을 사용할 수도 있지만 각 접미어에 대한 추가 정보가 필요하기 때문에 사전이 자연스러운 선택 인 것으로 보입니다.

1

가장 간단한 (아마도 가장 빠르지는 않은) 방법은 목록에서 모든 일치 항목을 찾는 것입니다. 1000 개의 항목을 사용하면 성능에 큰 어려움이 없어야합니다. 접미사가 너무 오래하지 않은 경우

>>> sufx = ['foo', 'bar'] 
>>> [s for s in sufx if 'bazbar'.endswith(s)] 
['bar'] 
>>>[s for s in sufx if 'bazbaz'.endswith(s)] 
[] 
>>> [s for s in sufx if 'bazfoo'.endswith(s)] 
['foo'] 
+0

이 알고리즘은 O (n * k)의 최악의 경우를 가질 것이며, n은 접미사의 수 ('len (sufx)')이며, k는 테스트 할 문자열의 길이입니다. – Darthfett

0

정확하게 유스 케이스를 이해하고 있는지 잘 모르겠습니다. 나는 그것이 당신이 접미사를 다루고 있다는 사실에 관한 것이고 그것을 탐지하기가 어렵다고 생각합니다.

일반적으로 (일반적으로 인덱싱 상황에서) 문자열을 접어 접미사로 사용하는 것이 일반적입니다. 그런 다음 역순 접미어 (따라서 접두어)의 정렬 된 목록에서 간단한 이진 검색을 수행 할 수 있습니다.

1

Time Complexity of a dict을 참조하십시오. dict에 대한 조회 시간은 매우 빠릅니다 (평균 O (1)!). 이 구현의 경우, 가장 긴 접미어를 찾는 데 평균 시간 복잡도는 O (k^2)이며 k는 단어의 길이입니다. ''.join 연산 (문자열이 O (1) appendleft 연산을 지원하지 않으므로 역전 또는 문자열 분할과 유사한 O (n) 연산이 필요하기 때문에) k^2입니다. 당신이 문자열에서 접미사를 생성하고 :

>>> from collections import deque 
>>> word = "antidisestablishmentarianism" 
>>> suffixes = {'ism': 3, 'anism': 6, 'ment': 4, 'arianism': 12} 
>>> suffix = deque() 
>>> longest = None 
>>> for char in reversed(word): 
...  suffix.appendleft(char) 
...  suf = ''.join(suffix) 
...  if suf in suffixes: 
...   longest = suf 
... 
>>> longest 
'arianism'