Programming

"당신은 의미합니까?"를 어떻게 구현합니까?

procodes 2020. 7. 27. 08:07
반응형

"당신은 의미합니까?"를 어떻게 구현합니까? [복제]


중복 가능성 :
Google은 어떻게 의미합니까? 알고리즘 작동?

웹 사이트에 이미 검색 시스템이 있다고 가정하십시오. <spell_checked_word>Google이 일부 검색어 에서하는 것처럼 " 정말 입니까? "를 어떻게 구현할 있습니까?


실제로 Google이하는 일은 매우 사소하지 않으며 처음에는 반 직관적입니다. 사전에 대한 검사와 같은 작업은 수행하지 않지만 쿼리보다 더 많은 결과를 반환하는 "유사한"쿼리를 식별하기 위해 통계를 사용하므로 정확한 알고리즘은 알려져 있지 않습니다.

여기에서 해결해야 할 여러 가지 하위 문제가 있습니다. 관련된 모든 자연어 처리 통계의 기초 가되는 책 은 통계 자연 언어 처리의 기초입니다 .

단어 / 쿼리 유사성의 문제를 구체적으로 해결하기 위해 놀랍게도 잘 작동하는 문자열 유사성의 수학적 측정 값 인 Edit Distance 를 사용하면 좋은 결과를 얻었습니다 . 나는 Levenshtein을 사용했지만 다른 사람들은 살펴볼 가치가 있습니다.

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

실제로 효율적으로 저장하고 맞춤법이 틀린 단어의 큰 사전을 검색 및 하위 두 번째 검색을 갖는 다시 비 사소한, 당신의 최선의 방법은있는 전체 텍스트 인덱싱 및 검색 엔진 (즉,하지 데이터베이스의 하나), 기존의 사용하는 것입니다 루씬은 현재를 많은 플랫폼에서 우연히 포팅 된 최고 중 하나입니다.


구글의 Norvig 박사는 그것이 어떻게 작동하는지 간략히 설명했다. 그는 심지어 20 줄의 파이썬 구현을 제공합니다.

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

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

박사 노르 빅은 또한이에 "뜻 않았다"설명 이 훌륭한 이야기 . Norvig 박사는 Google 의 리서치 책임자입니다. "당신이 의미하는 바"가 어떻게 구현되었는지 물었을 때 그의 대답은 권위적 입니다.

다른 철자 검색이나 실제 인터넷 문구 등을 사용하여 동적 사전을 작성하는 철자 검사입니다. 그러나 여전히 맞춤법 검사 입니다.

SOUNDEX와 다른 추측은 사람들을 들여다 보지 않습니다!


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


누군가가 검색 엔진을위한 최첨단 철자 제안 시스템을 만드는 방법을 물어 본 것에 대해 놀랐습니다. 검색 엔진 회사에서 1 년 이상이 주제에 대해 작업 해 왔으며 해당 주제에 대한 공개 도메인 정보를 가리킬 수 있습니다.

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

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

이 간단한 알고리즘은 많은 유형의 쿼리에 효과적입니다. 다음 단계로 넘어가려면 해당 주제에 대한 Microsoft Research의 논문을 읽어보십시오. 여기에서 찾을 수 있습니다

이 백서에는 훌륭한 소개가 있지만 그 후에는 숨겨진 마르코프 모델과 같은 개념에 대해 잘 알고 있어야합니다.


데이터베이스에서 비슷한 단어를 찾으려면 SOUNDEX 를 살펴 보는 것이 좋습니다 .

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


Peter Norvig의 " 맞춤법 교정기 작성 방법 "기사를 참조하십시오.


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


http://en.wikipedia.org/wiki/N-gram#Google_use_of_N-gram


나는 이것이 당신의 웹 사이트의 크기에 달려 있다고 생각합니다. 약 500 명의 직원이 사용하는 로컬 인트라넷에서 결과가 전혀없는 검색 구문을보고 새로운 제안 검색 구문과 함께 해당 검색 구문을 SQL 테이블에 입력하면됩니다.

검색 결과가 반환되지 않으면 해당 테이블을 호출하지만 사이트가 상대적으로 작을 때만 작동하며 가장 일반적인 검색 구문에 대해서만 작동합니다.

비슷한 질문에 대한 내 대답을보고 싶을 수도 있습니다.


산업별 번역이있는 경우 동의어 사전이 필요할 수 있습니다. 예를 들어, 나는 보석 산업에서 일했고 kt-karat, rd-round, cwt-carat weight와 같은 설명에서 약어가있었습니다 ... Endeca (해당 작업의 검색 엔진)는 공통어에서 번역되는 동의어 사전을 가지고 있습니다 철자가 틀리지 만 수동 개입이 필요합니다.


나는 Lucene맞춤법 검사기로 그것을한다 .


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

또한 전체 텍스트 인덱싱을 확인하십시오. 구문은 Google 논리와 다르지만 매우 빠르며 유사한 언어 요소를 처리 할 수 ​​있습니다.


Soundex 및 "포터 형태소 분석"(사운드 EX는 사소한 것으로 포터 형태소 분석에 대해서는 확실하지 않습니다).


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

그것에 대한 루비 보석이 있지만 파이썬 http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html 에서 이야기하는 법을 모르겠습니다.

루비 구현의 인용문은 다음과 같습니다.

용법

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

이 결과는 다음과 같습니다.

Possible correction for haert: heart Possible correction for wil: Will


Implementing spelling correction for search engines in an effective way is not trivial (you can't just compute the edit/levenshtein distance to every possible word). A solution based on k-gram indexes is described in Introduction to Information Retrieval (full text available online).


U could use ngram for the comparisment: http://en.wikipedia.org/wiki/N-gram

Using python ngram module: 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]

U get:

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

Why not use google's did you mean in your code.For how see here http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html

참고URL : https://stackoverflow.com/questions/41424/how-do-you-implement-a-did-you-mean

반응형