Google은 "무슨 의미인가요?" 알고리즘 작동?


436

포트폴리오 관리 도구를위한 내부 웹 사이트를 개발하고 있습니다. 많은 텍스트 데이터, 회사 이름 등이 있습니다. "Did you mean : xxxx"라는 쿼리에 매우 빠르게 응답 할 수있는 일부 검색 엔진 기능에 깊은 인상을 받았습니다.

지능적으로 사용자 검색어를 가져 와서 원시 검색 결과뿐만 아니라 "정말입니까?"로 응답 할 수 있어야합니다. 대체 답변 등이있을 경우의 응답

[ ASP.NET 에서 개발 중입니다 (VB-나에게 대항하지 마십시오!)]

업데이트 : OK, 수백만의 '무상 사용자'없이 어떻게 이것을 모방 할 수 있습니까?

  • 각 '알려진'또는 '올바른'용어에 대한 오타를 생성하고 조회를 수행 하시겠습니까?
  • 다른 더 우아한 방법?

1
다음 은 Norvig 맞춤법 교정기의 VB.NET 버전입니다. 너무 늦지 않으면이 기능이 유용 할 수 있습니다!
Ralph Wiggum


비쿼 커티 키보드 (Colemak)를 입력하면이 기능이 영리하지 않습니다. 기록 된 실수 수정 쌍으로부터 확실히 배워서 쿼티에 맞춰집니다. 일반적인 맞춤법 검사기는 키보드에서 제대로 작동합니다. 문자열 편집 거리는 레이아웃에 따라 다릅니다.
Colonic Panic

답변:


366

다음은 소스에서 직접 설명입니다 (거의)

검색 101!

최소 22:03

볼 가치가있는!

기본적으로 Douglas Merrill 전 Google CTO에 따르면 다음과 같습니다.

1) Google에 철자가 틀린 단어를 씁니다.

2) 원하는 것을 찾지 못했습니다 (결과를 클릭하지 마십시오)

3) 단어의 철자가 틀렸다는 것을 알고 검색 창에 단어를 다시 씁니다.

4) 원하는 것을 찾으십시오 (첫 번째 링크를 클릭하십시오)

이 패턴은 수백만 번 곱 해져서 가장 일반적인 철자가 무엇인지, 그리고 가장 "일반적인"수정이 무엇인지 보여줍니다.

이런 식으로 Google은 거의 모든 언어에서 철자 교정을 제공 할 수 있습니다.

또한 이것은 밤새 모든 사람들이 "nigth"구글이 그 단어를 대신 제안하는 것처럼 밤에 철자를 시작한다는 것을 의미합니다.

편집하다

@ThomasRutter : Douglas는이를 "통계 기계 학습"으로 설명합니다.

쿠키를 사용하여 어떤 사용자가 어떤 쿼리를 가져 왔는지 알기 때문에 누가 쿼리를 수정하는지 알고

사용자가 쿼리를 수행하고 사용자 중 10 %만이 결과를 클릭하고 90 %가 되돌아 가서 다른 단어 (정확한 단어 포함)를 입력하면 이번에는 90 %가 결과를 클릭하면 찾은 것을 알게됩니다. 정정.

또한 이들이 표시하는 모든 링크에 대한 정보를 가지고 있기 때문에 두 개의 서로 다른 "관련된"쿼리인지 알 수 있습니다.

또한, 이제 철자 검사에 컨텍스트를 포함 시키므로 컨텍스트에 따라 다른 단어를 제안 할 수도 있습니다.

철자가 자동으로 수정되도록 컨텍스트가 어떻게 고려되는지를 보여주는 이 Google 웨이브 데모 (44m 06s)를 참조하십시오 .

여기에 자연어 처리 방법이 설명되어 있습니다.

마지막으로 자동 기계 번역 (@ 1h 12m 47s)을 믹스에 추가하여 수행 할 수있는 작업에 대한 멋진 데모입니다 .

콘텐츠에 직접 건너 뛰기 위해 비디오에 분과 초의 앵커를 추가하여 작동하지 않으면 페이지를 다시로드하거나 손으로 마크를 스크롤하십시오.


그래도 알고리즘은 어떻게 작동합니까? Google은 "다양한 용어를 가진 수십억 건의 검색을 받았으며 이러한 용어는 이러한 용어 검색"에서 "이 용어는이 용어의 일반적인 철자가 잘못되어야합니다"라는 방식으로 어떻게 이동합니까? 그들은이 문제를 해결했지만 방법에 관심이 있습니다. 그들은 두 명의 검색이 같은 사용자로부터 온 것이며 어떤 단어가 다른 단어의 '수정'이며 어떻게 수십억 건의 검색을 집계합니까?
thomasrutter

51
모두가 "밤"철자를 틀리게 시작했다면 ... "Flickr"를 검색하는 사람들과 이미이 문제가 발생했다고 생각합니다.
Max Lybbert

42
모두가 잘못된 철자를 잘못 쓰는 문제는 이미 훨씬 더 심각한 의미로 발생했습니다. 'fuscia'를 Google에 입력 해보십시오. 구글은 "후 시아를 의미 했습니까?"라고 말합니다. 실제로 올바른 철자는 "자홍색"이지만 어떤 이유로 든 철자를 정확하게 입력 할 수는 없습니다. Dictionary.com의 문제는 더욱 악화되었습니다. 검색에 "fuschia"를 입력하면 "fuschia에 대한 결과가 없습니다."fuschia "를 의미 했습니까?" (즉, 방금 입력 한 것을 의미 했습니까?)
Daisy Sophia Hollman

8
나는 그들이 맞춤법이 틀린 데이터 만 사용한다고 생각하지 않습니다-Levenshtein 거리가 비슷하거나 비슷합니다- 'Plack'(및 하나 이상의 다른 단어)을 검색하면 항상 'black'으로 수정됩니다. / typo
plusplus

4
@Jakub 나는 4 년 전 그 논평을 한 이후로 문제를 해결했다고 생각합니다. 실제로 Google도 문제를 해결했습니다. fuschia를 검색하면 자홍색에 대한 결과가 자동으로 포함됩니다.
데이지 소피아 홀먼

104

나는 몇 시간 전에이 문서를 발견 : 맞춤법 교정 작성하는 방법 에 의해 작성, 피터 노빅 (구글 사의 연구 이사).

"맞춤법 교정"주제에 대한 흥미로운 내용입니다. 예제는 파이썬으로되어 있지만 이해하기 쉽고 명확하며 알고리즘을 다른 언어로 쉽게 번역 할 수 있다고 생각합니다.

아래는 알고리즘에 대한 간단한 설명입니다. 알고리즘은 준비 및 단어 확인의 두 단계로 구성됩니다.

1 단계 : 준비-단어 데이터베이스 설정

실제 검색어와 그 단어를 사용할 수 있다면 가장 좋습니다. 그렇지 않은 경우 큰 텍스트 집합을 대신 사용할 수 있습니다. 각 단어의 발생 (인기)을 세십시오.

2 단계. 단어 검사-검사 한 단어와 유사한 단어 찾기

마찬가지로 편집 거리가 낮다는 것을 의미합니다 (일반적으로 0-1 또는 0-2). 편집 거리는 한 단어를 다른 단어로 변환하는 데 필요한 최소 삽입 / 삭제 / 변경 / 스왑 수입니다.

이전 단계에서 가장 인기있는 단어를 선택하고 수정 단어로 제안하십시오 (단어 자체가 아닌 경우).


6
@Davide : "" "예제는 파이썬으로되어 있지만 이해하기 쉽고 명확합니다." "": "그러나"의 사용법을 이해하지 못합니다 ... Python + Norvig의 글쓰기 스타일은 "명확하고 이해하기 쉽다 "는 예상 결과입니다.
John Machin 2016 년

20
"그러나"는 Harry가 VB.NET 개발자라고 자신의 질문에 말했기 때문에 파이썬 언어에 자신이 없다고 가정했기 때문입니다.
Davide Gualano 2016 년

56

"당신은 의미 했습니까"알고리즘에 대한 이론은 정보 검색 소개 3 장을 참조하십시오. 그것은 사용할 수 있습니다 온라인 무료. 섹션 3.3 (52 페이지)은 귀하의 질문에 정확하게 답변합니다. 또한 업데이트에 구체적으로 대답하려면 단어 사전 만 있으면됩니다 (수백만 명의 사용자 포함).


10

흠 ... 구글은 방대한 양의 데이터 (인터넷)를 사용하여 심각한 NLP (Natural Language Processing)를 수행했다고 생각했다.

예를 들어, 전체 인터넷의 데이터가 너무 많아서 3 워드 시퀀스가 ​​발생하는 횟수를 계산할 수 있습니다 ( trigram 이라고 함 ). 따라서 "핑크 프 루거 콘서트"와 같은 문장을 보면 히트 횟수가 적다는 것을 알 수있을 것입니다.

그들은 분명히 Davide Gualano의 말을 변형시킨 것이므로 분명히 그 링크를 읽으십시오. 물론 구글은 알고있는 모든 웹 페이지를 코퍼스로 사용하므로 알고리즘이 특히 효과적입니다.


7

내 생각에 그들은 Levenshtein 거리 알고리즘과 그들이 실행하는 검색에 관해 그들이 수집하는 대량의 데이터 의 조합을 사용한다고 생각 합니다. 입력 한 검색 문자열에서 Levenshtein 거리가 가장 짧은 검색 세트를 가져온 다음 가장 많은 검색 결과를 선택할 수 있습니다.


6
총 수십억 개의 웹 페이지에 해당하는 단어가 저장되어 있다고 가정 해 봅시다. Levenshtein 거리를 쿼리하는 모든 단어에 대해 수십억 번 Levenshtein 거리를 계산하지 않고 가까운 경기의 빠른 검색을 위해 Levenshtein 거리를 색인화하는 쉬운 방법은 없습니다. 따라서 레 벤슈 테인 거리는이 상황에서 적어도 1 단계에서는 그다지 사용되지 않습니다. 구글은 수십억 개의 기존 단어에서 현재 단어의 철자가 틀릴 수있는 단어로 좁혀 져야합니다. Levenshtein이 이미 일치하는 항목을 가져 오면 이후 단계로 확실히 적용 할 수 있습니다.
thomasrutter

6

일반적으로 생산 맞춤법 교정기는 여러 가지 방법론을 사용하여 맞춤법 제안을 제공합니다. 일부는 :

  • 철자 수정이 필요한지 결정하는 방법을 결정하십시오. 여기에는 불충분 한 결과, 구체적이지 않거나 정확하지 않은 결과 (일부 조치에 따라) 등이 포함될 수 있습니다.

  • 전체 또는 대부분 철자가 정확한 것으로 알려진 큰 본문 또는 사전을 사용하십시오. LingPipe 와 같은 곳에서 온라인으로 쉽게 찾을 수 있습니다 . 그런 다음 최선의 제안을 결정하기 위해 여러 측정 값을 기준으로 가장 가까운 단어를 찾습니다. 가장 직관적 인 것은 비슷한 캐릭터입니다. 연구와 실험을 통해 밝혀진 것은 2 ~ 3 개의 문자 시퀀스 일치가 더 잘 작동한다는 것입니다. (비 그램 및 트라이 그램). 결과를 더 향상 시키려면 단어의 시작 또는 끝에서 일치하는 점수가 더 높습니다. 성능상의 이유로이 모든 단어를 trigram 또는 bigram으로 색인화하여 조회를 수행 할 때 n-gram으로 변환하고 hashtable 또는 trie를 통해 조회하십시오.

  • 문자 위치에 따라 키보드 오류와 관련된 휴리스틱을 사용하십시오. 'w'가 'e'에 가깝기 때문에 "hwllo"는 "hello"여야합니다.

  • 발음 키 (Soundex, Metaphone)를 사용하여 단어를 색인화하고 가능한 정정 사항을 찾아보십시오. 실제로 이것은 일반적으로 위에서 설명한 것처럼 n-gram 인덱싱을 사용하는 것보다 더 나쁜 결과를 반환합니다.

  • 각각의 경우 목록에서 최상의 수정을 선택해야합니다. 이것은 levenshtein, 키보드 메트릭 등과 같은 거리 메트릭 일 수 있습니다.

  • 여러 단어로 된 문구의 경우 한 단어 만 철자가 틀릴 수 있으며,이 경우 나머지 단어를 문맥 상 가장 일치하는 단어로 사용할 수 있습니다.


6

사용 Levenshtein 거리 , 다음 인덱스 단어에 메트릭 트리 (또는 슬림 트리)를 만들 수 있습니다. 그런 다음 1-가장 가까운 이웃 쿼리를 실행하면 결과가 나타납니다.


4

Google은 철자가 정확한 검색어가 아닌 최상의 결과를 제공하는 검색어를 제안합니다. 그러나이 경우 철자 교정기가 더 적합 할 수 있습니다. 물론 좋은 결과를 얼마나 잘 나타내는 지에 따라 모든 쿼리에 대해 약간의 값을 저장할 수 있습니다.

그래서,

  1. 사전이 필요합니다 (영어 또는 데이터 기반)

  2. 사전을 사용하여 단어 격자를 생성하고 전이의 확률을 계산하십시오.

  3. 격자를 사용하여 최소 오류 거리를 계산하려면 디코더를 추가하십시오. 물론 거리를 계산할 때 삽입 및 삭제를 관리해야합니다. 재미있는 것은 QWERTY 키보드가 서로 가까이 키를 눌렀을 때 거리를 최대화한다는 것입니다.

  4. 최소 거리를 가진 단어를 반환하십시오.

  5. 그런 다음 쿼리 데이터베이스와 비교하여 다른 유사 항목에 대한 더 나은 결과가 있는지 확인할 수 있습니다.



3

몇 년 전에 무언가를 보았으므로 그 이후로 변경되었을 수도 있지만 짧은 시간 내에 매우 유사한 쿼리를 제출하는 동일한 사용자에 대한 로그를 분석하여 시작한 것으로 보이며 사용자가 수정 한 방법에 따라 기계 학습을 사용했습니다 그들 자신.


3

짐작할 수 있겠지만 ...

  1. 단어 검색
  2. 찾을 수 없으면 일부 알고리즘을 사용하여 단어를 "추측"하려고합니다.

Hopfield 네트워크 또는 역 전파 네트워크와 같은 AI 또는 "지문 식별", 손상된 데이터 복원 또는 Davide가 이미 언급 한 철자 교정 등이 될 수 있습니다 ...


2

단순한. 그들은이 의 데이터를. 검색어는 얼마나 자주 쿼리되는지, 그리고 일반적으로 어떤 변형이 사용자가 클릭하는 결과를 낳는 지에 따라 가능한 모든 용어에 대한 통계를 가지고 있습니다. 따라서 검색어에 대한 맞춤법이 틀린 철자를 자주 입력하면 계속해서 제안합니다. 더 일반적인 답변입니다.

실제로, 맞춤법이 틀린 철자가 가장 자주 검색되는 용어 인 경우, 알고리즘은 올바른 철자를 사용합니다.


1
구글이이를 위해 필요한 모든 데이터를 가지고 있다는 것을 아무도 의심하지 않았지만,이 문제를 해결하기 위해 알고리즘과 많은 양의 데이터를 합리적인 시간 안에 어떻게 만들 었는지에 대한 질문이 제기되었다. 그들은 하루에 여러 가지 검색을 할 것입니다. 검색어가 다른 최근 검색어의 '맞춤법 수정'인지 쉽게 식별 할 수 있습니까? 한 용어가 다른 용어의 철자를 잘못 결정한 이유는 무엇입니까? 이것들은 관심있는 구현 세부 사항입니다.
thomasrutter

2

귀하의 질문에 대해 많은 양의 데이터없이 행동을 모방하는 방법-Google에서 수집 한 많은 양의 데이터를 사용하지 않는 이유는 무엇입니까? 철자가 틀린 단어에 대한 Google sarch 결과를 다운로드하고 HTML에서 "Did you mean :"을 검색하십시오.

요즘 매쉬업이라고합니다. :-)


Google이 봇 스크래핑을 중지 할 때까지 얼마나 걸립니까? -요즘 구글도 눈치 채지 못할까?
앤드류 해리

reqs / sec가 너무 높지 않으면 그들이 알 수 있다고 생각하지 않습니다.
Mauricio Scheffer

2

위의 답변 외에도 자신이 직접 무언가를 구현하려는 경우 제안 사항이 있습니다.

연산

이 알고리즘의 구현 및 자세한 문서는 GitHub 에서 찾을 수 있습니다 .

  • 비교기를 사용하여 우선 순위 큐를 작성하십시오.
  • Ternay Search Tree를 생성하고 모든 영어 단어 ( Norvig의 게시물에서 )를 빈도와 함께 삽입하십시오 .
  • TST 순회를 시작하고 TST에서 발견 된 모든 단어에 대해 input_word에서 Levenshtein Distance ( LD )를 계산하십시오.
  • LD ≤ 3이면 우선 순위 대기열에 넣습니다.
  • 마지막으로 우선 순위 큐에서 10 개의 단어를 추출하여 표시합니다.

1

맞춤법 검사기를 말 하시겠습니까? 전체 문구가 아닌 맞춤법 검사기이면 파이썬에서 알고리즘이 개발되는 맞춤법 검사에 대한 링크가 있습니다. 이 링크를 확인

한편, 텍스트를 사용하여 데이터베이스를 검색하는 프로젝트도 진행 중입니다. 나는 이것이 당신의 문제를 해결할 것이라고 생각합니다


1

이것은 오래된 질문이며 Apache Solr을 사용하여 OP를 제안한 사람이 없다는 것에 놀랐습니다.

Apache Solr은 다른 많은 기능 외에도 맞춤법 검사 또는 쿼리 제안을 제공하는 전체 텍스트 검색 엔진입니다. 로부터 문서 :

기본적으로 Lucene 맞춤법 검사기는 먼저 문자열 거리 계산의 점수를 기준으로 제안을 정렬하고 색인에서 제안의 빈도 (사용 가능한 경우)를 기준으로 제안을 정렬합니다.


0

부분 일치 및 인접 항목 일치를 자연스럽게 지원 하는 특정 데이터 구조 ( 3 진 검색 트리) 가 있습니다.


-1

이를 파악하는 가장 쉬운 방법은 Google 동적 프로그래밍입니다.

그것은 정보 검색에서 빌려온 알고리즘이며 현대의 생물 정보학에서 두 유전자 서열이 얼마나 유사한 지 알기 위해 많이 사용됩니다.

최적의 솔루션은 동적 프로그래밍 및 재귀를 사용합니다.

이것은 많은 솔루션에서 매우 해결 된 문제입니다. 오픈 소스 코드를 찾을 때까지 Google을 방문하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.