"이것을 의미합니까?"를 어떻게 구현합니까?[복제하다]

StackOverflow https://stackoverflow.com/questions/41424

  •  09-06-2019
  •  | 
  •  

문제

가능한 중복:
Google은 어떻게“의미 했습니까?” 알고리즘이 작동합니까?

귀하의 웹사이트에 이미 검색 시스템이 있다고 가정해 보겠습니다.'다음을 찾으셨나요?'를 어떻게 구현할 수 있나요?<spell_checked_word>"Google이 일부에서 하는 것처럼 검색어?

도움이 되었습니까?

해결책

실제로 Google이 하는 일은 매우 사소하지 않으며 처음에는 반직관적이기도 합니다.그들은 사전을 확인하는 것과 같은 작업을 수행하지 않지만 오히려 통계를 사용하여 쿼리보다 더 많은 결과를 반환한 "유사한" 쿼리를 식별합니다. 물론 정확한 알고리즘은 알려져 있지 않습니다.

여기에서 해결해야 할 다양한 하위 문제가 있습니다. 관련된 모든 자연어 처리 통계에 대한 기본 기반으로 반드시 필요한 책이 있습니다. 통계적 자연어 처리의 기초.

구체적으로 단어/쿼리 유사성 문제를 해결하기 위해 다음을 사용하여 좋은 결과를 얻었습니다. 거리 편집, 놀라울 정도로 잘 작동하는 문자열 유사성의 수학적 척도입니다.나는 Levenshtein을 사용했지만 다른 것들도 살펴볼 가치가 있습니다.

내 경험상 Soundex는 쓰레기입니다.

실제로 철자가 틀린 단어로 구성된 대규모 사전을 효율적으로 저장 및 검색하고 1초 미만의 검색도 가능합니다. 가장 좋은 방법은 기존 전체 텍스트 인덱싱 및 검색 엔진(예:귀하의 데이터베이스가 아님), 그 중 루씬 현재 최고 중 하나이며 동시에 많은 플랫폼으로 포팅되었습니다.

다른 팁

Google의 Dr Norvig는 이것이 어떻게 작동하는지 설명했습니다.그는 심지어 20줄의 Python 구현을 제공합니다.

http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

http://www.norvig.com/spell-corright.html

Norvig 박사는 또한 이 훌륭한 얘기.노르빅 박사는 연구 책임자 Google에서 - '무슨 뜻인가요?'가 어떻게 구현되었는지 묻는 질문에 그의 대답은 다음과 같습니다. 권위 있는.

따라서 철자 검사는 아마도 다른 검색이나 심지어 실제 인터넷 문구 등을 통해 구축된 동적 사전을 사용하는 것 같습니다.하지만 그건 아직 맞춤법 검사.

SOUNDEX 및 기타 추측은 살펴보지 않습니다.

확인하다 이것 Levenshtein 거리에 관한 Wikipedia 기사.가능한 개선 사항을 잘 살펴보십시오.

나는 누군가가 검색 엔진을 위한 최첨단 철자 제안 시스템을 만드는 방법을 문의했다는 사실에 놀랐습니다.나는 검색 엔진 회사에서 이 주제를 1년 넘게 연구해 왔으며 해당 주제에 대한 공개 도메인 정보를 가리킬 수 있습니다.

이전 게시물에서 언급했듯이 Google(및 Microsoft 및 Yahoo!)은 미리 정의된 사전을 사용하지 않으며 쿼리의 철자 오류 가능성을 고려하는 수많은 언어학자를 고용하지도 않습니다.이는 문제의 규모로 인해 불가능할 뿐만 아니라 쿼리의 철자가 틀린 경우와 시기를 사람들이 실제로 정확하게 식별할 수 있는지가 확실하지 않기 때문에 불가능합니다.

대신 모든 유럽 언어에도 적용되는 간단하고 효과적인 원칙이 있습니다.검색 로그에서 모든 고유 쿼리를 가져오고, 참조 쿼리가 가장 높은 개수를 갖는 쿼리라고 가정하고 모든 쿼리 쌍 사이의 편집 거리를 계산합니다.

이 간단한 알고리즘은 다양한 유형의 쿼리에 적합합니다.다음 단계로 나아가고 싶다면 해당 주제에 대한 Microsoft Research의 논문을 읽어 보시기 바랍니다.당신은 그것을 찾을 수 있습니다 여기

이 논문에는 훌륭한 소개가 있지만 그 이후에는 Hidden Markov 모델과 같은 개념에 대한 지식이 필요합니다.

나는 보는 것을 제안 할 것이다 사운드덱스 데이터베이스에서 비슷한 단어를 찾으려면

다음을 사용하여 Google 자체 사전에 액세스할 수도 있습니다. Google API 맞춤법 제안 요청.

Peter Norvig의 "맞춤법 교정기를 작성하는 방법" 기사.

나는 Google이 모든 검색어를 기록하고 누군가 철자를 수정하는 경우를 식별한다고 믿습니다.이 수정은 다른 사람들이 동일한 첫 번째 쿼리를 제공할 때 제안될 수 있습니다.이는 모든 언어, 실제로 모든 문자열에서 작동합니다.

나는 이것이 귀하의 웹 사이트 규모에 달려 있다고 생각합니다.약 500명의 직원이 사용하는 로컬 인트라넷에서 저는 결과가 0인 검색 문구를 보고 새 추천 검색 문구와 함께 해당 검색 문구를 SQL 테이블에 입력합니다.

검색 결과가 반환되지 않은 경우 해당 테이블을 호출합니다. 그러나 이는 사이트가 상대적으로 작은 경우에만 작동하며 가장 일반적인 검색 문구에 대해서만 수행합니다.

비슷한 질문에 대한 내 대답을 살펴볼 수도 있습니다.

산업별 번역이 있는 경우 동의어 사전이 필요할 수 있습니다.예를 들어, 저는 보석 산업에 종사했는데, 설명에 kt - 캐럿, rd - 라운드, cwt - 캐럿 중량과 같은 약어가 있었습니다...Endeca(해당 작업의 검색 엔진)에는 일반적인 철자 오류를 번역하는 동의어 사전이 있지만 수동 개입이 필요합니다.

나는 그것을한다 루씬'에스 맞춤법 검사기.

Soundex는 음성 일치에 적합하지만 사람 이름에 가장 잘 작동합니다(원래 인구 조사 데이터용으로 개발됨).

또한 Full-Text-Indexing도 확인해 보세요. 구문은 Google 로직과 다르지만 매우 빠르고 유사한 언어 요소를 처리할 수 있습니다.

Soundex 및 "포터 형태소 분석"(soundex는 사소하며 포터 형태소 분석에 대해서는 잘 모르겠습니다).

도움이 될 수 있는 aspell이라는 것이 있습니다.http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

Ruby gem이 있지만 Python에서 어떻게 대화해야 할지 모르겠습니다.http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html

다음은 Ruby 구현의 인용문입니다.

용법

Aspell을 사용하면 단어를 확인하고 수정 사항을 제안할 수 있습니다.예를 들어:

  string = "my haert wil go on"

  string.gsub(/[\w\']+/) do |word|
    if !speller.check(word)
      # word is wrong
      puts "Possible correction for #{word}:"
      puts speller.suggest(word).first
    end
  end

이는 다음을 출력합니다:

haert에 대한 가능한 수정 사항:wil에 대한 심장 가능한 교정 :할 것이다

효과적인 방법으로 검색 엔진에 대한 철자 교정을 구현하는 것은 쉬운 일이 아닙니다. 가능한 모든 단어에 대한 편집/레벤슈타인 거리를 계산할 수는 없습니다.k-gram 인덱스를 기반으로 한 솔루션은 다음 항목에 설명되어 있습니다. 정보 검색 소개 (전체 텍스트는 온라인에서 확인 가능).

비교를 위해 ngram을 사용할 수 있습니다. http://en.wikipedia.org/wiki/N-gram

Python ngram 모듈 사용: http://packages.python.org/ngram/index.html

import ngram

G2 = ngram.NGram([  "iis7 configure ftp 7.5",
                    "ubunto configre 8.5",
                    "mac configure ftp"])

print "String", "\t", "Similarity"
for i in G2.search("iis7 configurftp 7.5", threshold=0.1):
    print i[1], "\t", i[0]

당신은 다음을 얻습니다:

>>> 
String  Similarity
0.76    "iis7 configure ftp 7.5"    
0.24    "mac configure ftp"
0.19    "ubunto configre 8.5"   

코드에서 Google을 사용하지 않으시겠습니까? 여기를 참조하십시오.http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top