2012-04-13 3 views
2

나는 파이썬 웹 애플리케이션을 작성 중이며 이름이 지정된 엔티티가있는 검색 쿼리를 처리해야한다. 예를 들어, 검색 질의가 경우명명 된 엔티티에 대한 파이썬 자연어 처리

  • 구글 안드로이드 : "맥 OS 사자" 내가 내 데이터베이스에서 사용할 수있는 후보와이 쿼리를 처리 할 수 ​​있다고 가정 할 수 있습니다.
  • Microsoft Windows.
  • 애플 맥 OS X 라이온은
  • ...

는 우리 모두가 3 결과가 올바른 결과라고 알고있다. 하지만 사용자의 검색어 즉 "mac os lion"을 "Apple Mac OS X Lion"(내 데이터베이스에서 사용 가능한 항목)에 매핑 할 수있는 방법이 있습니까 누군가가 무엇을 검색할지 또는 무엇을해야하는지 알려주실 수 있습니까?

답변

2

사용자 쿼리의 일종의 정규화가 필요하며 올바른 "클래스"로의 매핑을 "배워야"합니다.

간단한 방법은 "클래스"중 하나와 일치하는 "토큰"의 중복을 계산하는 것입니다. 다음 샘플 코드가 도움이 될 수 있습니다 : 물론

classify_query('mac OS x') -> ['Apple Mac OS X Lion'] 
classify_query('Google') -> ['Google Android'] 

CLASSES = ['Google Android', 'Microsoft Windows', 'Apple Mac OS X Lion'] 

def classify_query(query_string): 
    """ 
    Computes the most "likely" class for the given query string. 

    First normalises the query to lower case, then computes the number of 
    overlapping tokens for each of the possible classes. 

    The class(es) with the highest overlap are returned as a list. 

    """ 
    query_tokens = query_string.lower().split() 
    class_tokens = [[x.lower() for x in c.split()] for c in CLASSES] 

    overlap = [0] * len(CLASSES) 
    for token in query_tokens: 
     for index in range(len(CLASSES)): 
      if token in class_tokens[index]: 
       overlap[index] += 1 

    sorted_overlap = [(count, index) for index, count in enumerate(overlap)] 
    sorted_overlap.sort() 
    sorted_overlap.reverse() 

    best_count = sorted_overlap[0][0] 

    best_classes = [] 
    for count, index in sorted_overlap: 
     if count == best_count: 
      best_classes.append(CLASSES[index]) 
     else: 
      break 

    return best_classes 

예 출력, 이것은 단지 아주 기본적인 솔루션입니다. 당신은 도움이 :) 그럼 난뿐만 아니라 위키 피 디아에 대한 몇 가지 솔루션을 찾고있었습니다

+0

쿼리 문자열에서 오타의 경우보다 강력한 것으로 확인 약간의 마법 ...

희망을 추가 할 수 있습니다. 그리고 최소 편집 거리를 가로 질러 할 수 있습니다. 최소한의 편집 거리는 개별 문자에 적용됩니다. 내가해야 할 일은 문자 대신 토큰을 사용하여 같은 개념을 적용하는 것이 었습니다. 방법에 의해 당신의 대답에 감사드립니다. –

+0

예를 들어 문자열의 Levenshtein 거리를 사용하여 토큰 내부에 일정량의 "typo-ness"를 허용 할 수 있습니다. 도와 줄 수있어서 기뻐. 내 대답을 받아들이지 않는 이유는 무엇입니까? – cfedermann

+1

글쎄 실제로 두 답변은 매우 도움이됩니다. 실제로 나는 Dikei가 대답 한 것을 보았을 때, 내 프로젝트와 더 관련이 있다는 것을 알았습니다. 그러나 여기서 내가 물은 것은 당신의 대답이 더 적합하다는 것입니다. 그래서 나는 당신의 대답을 받아 들여야한다고 생각합니다. 나는 SO가 복수 응답을 수락 할 조항을 가져야한다고 생각한다. 정말 고마워. 그게 당신 한테 아주 좋았어요. –

1

검색어와 비슷한 텍스트 만 찾으려면 Lucene + PyLucene과 같은 파이썬 바인딩이있는 텍스트 검색 엔진을 사용할 수 있습니다.

관련 문제