2011-07-05 5 views
6

영화명의 목록에 철자가 틀리고 이와 비슷한 작은 변형이 있다고 가정 해 봅시다. -비슷한 단어를 묶는 좋은 전략은 무엇입니까?

 "Pirates of the Caribbean: The Curse of the Black Pearl" 
"Pirates of the carribean" 
"Pirates of the Caribbean: Dead Man's Chest" 
"Pirates of the Caribbean trilogy" 
"Pirates of the Caribbean" 
"Pirates Of The Carribean" 

바람직하게는 파이썬 및/또는 redis를 사용하여 이러한 단어 집합을 그룹화하거나 찾을 수 있습니까?

+1

결과로 얻고 싶습니까? 당신은 전체 문자열에서 이러한 모든 유사 콘텐츠를 찾고 싶습니까? – JMax

+0

나는 이들을 결합 된 객체로 그룹화하고 데이터베이스에 추가 할 때 검사를 수행하려고합니다. –

답변

14

"퍼지 일치"를 살펴보십시오. 아래 스레드의 멋진 도구 중 일부는 문자열 간의 유사점을 계산합니다.

내가

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy']) 
['apple', 'ape'] 
>>> import keyword 
>>> get_close_matches('wheel', keyword.kwlist) 
['while'] 
>>> get_close_matches('apple', keyword.kwlist) 
[] 
>>> get_close_matches('accept', keyword.kwlist) 
['except'] 

https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison

+0

링크 된 질문이 삭제 된 것으로 보입니다. – hardmooth

+0

그래서 그것은 보인다. 특정 레벨에 이르면 삭제 된 질문을 볼 수 있으므로 –

+0

@FredrikPihl에 대한 링크를 여기에'get_close_matches'에 게시하십시오 (또는 답변을 편집하십시오). 가치가없는 낮은 명성의 농부? –

1

은 프레드릭의 대답에 또 다른 팁을 추가하려면 difflib 모듈의 특히 좋아 해요, 당신은 또한이 하나 검색 엔진 코드와 같은에서 영감을 얻을 수있다 :

def dosearch(terms, searchtype, case, adddir, files = []): 
    found = [] 
    if files != None: 
     titlesrch = re.compile('>title<.*>/title<') 
     for file in files: 
      title = "" 
      if not (file.lower().endswith("html") or file.lower().endswith("htm")): 
       continue 
      filecontents = open(BASE_DIR + adddir + file, 'r').read() 
      titletmp = titlesrch.search(filecontents) 
      if titletmp != None: 
       title = filecontents.strip()[titletmp.start() + 7:titletmp.end() - 8] 
      filecontents = remove_tags(filecontents) 
      filecontents = filecontents.lstrip() 
      filecontents = filecontents.rstrip() 
      if dofind(filecontents, case, searchtype, terms) > 0: 
       found.append(title) 
       found.append(file) 
    return found 

소스 더 많은 정보 : http://www.zackgrossbart.com/hackito/search-engine-python/

감사합니다,

최대

0

나는 사실 두 가지 문제가있다 생각합니다.

첫 번째는 맞춤법 교정입니다. 당신은 두 번째는 더 많은 기능 여기

http://norvig.com/spell-correct.html

파이썬 하나를 가질 수 있습니다. 다음은 철자법을 수정 한 후 수행 할 작업입니다. 나는 관계 함수를 만들 것입니다.

related (sentence1, sentence2) 문장 1과 문장 2가 희귀 한 공통 단어가있는 경우에만. 희소하게 말하면, (The, what, is 등 ...)과 다른 단어를 뜻합니다. TF/IDF 시스템을보고 두 단어가 그들의 단어를 사용하여 관련되어 있는지를 판단 할 수 있습니다. 그냥 인터넷 검색 좀 내가 찾은이 :

https://code.google.com/p/tfidf/

3

당신은 그와 유사한 문자열 예를 들어, 대형 일반 문자열을 알 수 있습니다 :

"쏴은 BLA를 BLA"과 "쏴 즐 브라"=> 공통 부분 문자열은 "Bla bla ba"입니다 (세 번째 단어에 주목하십시오).

일반적인 하위 문자열을 찾으려면 동적 프로그래밍 알고리즘을 사용할 수 있습니다. 알고리즘 변형 중 하나는 Levenshtein 거리입니다 (가장 유사한 문자열 사이의 거리는 매우 작고 다른 문자열 간의 거리는 더 큼) - http://en.wikipedia.org/wiki/Levenshtein_distance입니다.

빠른 성능을 얻으려면 Soundex 알고리즘 - http://en.wikipedia.org/wiki/Soundex을 사용해보십시오.

그래서 모든 문자열 사이의 거리를 계산 한 후 클러스터링해야합니다. 가장 간단한 방법은 k-을 의미합니다 (단, 클러스터 수를 정의해야합니다).클러스터 수를 실제로 모르는 경우 계층 적 클러스터링을 사용해야합니다. 상황에 따른 클러스터 수는 개의 영화 제목 수 + 1입니다 (완전히 잘못된 철자 문자열의 경우).

+0

하위 문자열 "Bla bla ba"가 있습니다. "ba"가 문자열에 있지 않기 때문에 기존 정의에서 부분 문자열이 아닙니다. 나는 그것을 "gapped substring"이라고 부를 것이다. 일반적인 gapped 하위 문자열에서 가장 긴 ungapped 하위 문자열을 얻을 수 있으므로 가장 긴 공통 하위 문자열을 얻을 수 있습니다. – hardmooth

0

한 가지 방법은 모든 문자열을 비교하기 전에 모든 문자열을 사전 처리하는 것입니다. 모두를 소문자로 변환하고 공백을 표준화합니다 (예 : 공백을 단일 공백으로 대체). 구두점이 최종 목표에 중요하지 않으면 모든 문장 부호도 제거 할 수 있습니다.

Levenshtein distance은 문자열의 유사성을 결정하는 데 일반적으로 사용되므로 작은 맞춤법 오류로 인해 다른 문자열을 그룹화하는 데 도움이됩니다.

관련 문제