사용자 쿼리의 일종의 정규화가 필요하며 올바른 "클래스"로의 매핑을 "배워야"합니다.
간단한 방법은 "클래스"중 하나와 일치하는 "토큰"의 중복을 계산하는 것입니다. 다음 샘플 코드가 도움이 될 수 있습니다 : 물론
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
예 출력, 이것은 단지 아주 기본적인 솔루션입니다. 당신은 도움이 :) 그럼 난뿐만 아니라 위키 피 디아에 대한 몇 가지 솔루션을 찾고있었습니다
쿼리 문자열에서 오타의 경우보다 강력한 것으로 확인 약간의 마법 ...
희망을 추가 할 수 있습니다. 그리고 최소 편집 거리를 가로 질러 할 수 있습니다. 최소한의 편집 거리는 개별 문자에 적용됩니다. 내가해야 할 일은 문자 대신 토큰을 사용하여 같은 개념을 적용하는 것이 었습니다. 방법에 의해 당신의 대답에 감사드립니다. –
예를 들어 문자열의 Levenshtein 거리를 사용하여 토큰 내부에 일정량의 "typo-ness"를 허용 할 수 있습니다. 도와 줄 수있어서 기뻐. 내 대답을 받아들이지 않는 이유는 무엇입니까? – cfedermann
글쎄 실제로 두 답변은 매우 도움이됩니다. 실제로 나는 Dikei가 대답 한 것을 보았을 때, 내 프로젝트와 더 관련이 있다는 것을 알았습니다. 그러나 여기서 내가 물은 것은 당신의 대답이 더 적합하다는 것입니다. 그래서 나는 당신의 대답을 받아 들여야한다고 생각합니다. 나는 SO가 복수 응답을 수락 할 조항을 가져야한다고 생각한다. 정말 고마워. 그게 당신 한테 아주 좋았어요. –