Google "Bunu mu demek istediniz?" Algoritma çalışması?


436

Portföy yönetim aracı için dahili bir web sitesi geliştiriyorum. Metin verileri, şirket isimleri vb. Bir sürü var. Ben gerçekten bazı arama motorları çok hızlı bir şekilde sorguları yanıtlamak için etkilendim etkilendim "demek istediniz: xxxx".

Akıllıca bir kullanıcı sorgusu almak ve sadece ham arama sonuçları ile değil, aynı zamanda bir "Bunu mu demek istediniz?" büyük olasılıkla alternatif bir cevap vb. olduğunda yanıt

[ ASP.NET'te geliştiriyorum (VB - bana karşı tutmayın!)]

GÜNCELLEME: Tamam, milyonlarca 'ücretsiz kullanıcı' olmadan bunu nasıl taklit edebilirim?

  • Her 'bilinen' veya 'doğru' terim için yazım hataları oluşturup aramalar mı yapıyorsunuz?
  • Başka daha zarif bir yöntem?

1
İşte Norvig Yazım Düzelticisinin VB.NET sürümü. Çok geç değilse bunu yararlı bulabilirsiniz!
Ralph Wiggum


Qwerty olmayan bir klavyeye (Colemak) yazıyorum ve özellik akıllıca değil. Kesinlikle kaydedilen hata düzeltme çiftlerinden öğrenir ve böylece qwerty'ye ayarlanır. Sıradan yazım denetleyicileri klavyem için beklendiği gibi çalışıyor - dize düzenleme mesafesi mizanpajsız.
Albay Panik

Yanıtlar:


366

İşte doğrudan kaynaktan açıklama (neredeyse)

Ara 101!

en az 22:03

İzlemeye değer!

Temel olarak ve eski Google CTO'su Douglas Merrill'e göre şöyle:

1) Google'da (yanlış yazılmış) bir kelime yazıyorsunuz

2) İstediğinizi bulamazsınız (herhangi bir sonuca tıklamayın)

3) Kelimeyi yanlış yazdığınızı fark edersiniz, böylece kelimeyi arama kutusuna yeniden yazarsınız.

4) İstediğinizi bulursunuz (ilk bağlantıları tıklarsınız)

Bu model milyonlarca kez çoğaldı, en yaygın yanlış yazımların ne olduğunu ve en "yaygın" düzeltmelerin neler olduğunu gösterir.

Bu şekilde Google neredeyse anında her dilde yazım düzeltmesi sunabilir.

Ayrıca bu bir gecede herkes "nigth" google bu kelimeyi önermek gibi gece büyü başlarsa anlamına gelir.

DÜZENLE

@ThomasRutter: Douglas bunu "istatistiksel makine öğrenimi" olarak tanımlıyor.

Sorguyu kimin düzelttiğini biliyorlar, çünkü hangi sorgunun hangi kullanıcıdan geldiğini biliyorlar (çerezleri kullanarak)

Kullanıcılar bir sorgu gerçekleştirirse ve kullanıcıların yalnızca% 10'u bir sonucu tıklar ve% 90'ı geri dönüp başka bir sorgu (düzeltilmiş sözcükle) yazar ve bu sefer% 90'ı bir sonucu tıklarsa, bulduklarını bilirler. bir düzeltme.

Ayrıca, gösterdikleri tüm bağlantılar hakkında bilgi sahibi olduklarından, bunların iki farklı "ilgili" sorgu olup olmadığını da bilebilirler.

Dahası, şimdi bağlamı yazım denetimine dahil ediyorlar, böylece bağlama bağlı olarak farklı kelimeler bile önerebilirler.

Yazımı otomatik olarak düzeltmek için içeriğin nasıl dikkate alındığını gösteren google wave (@ 44m 06s) demosuna bakın .

Burada doğal dil işlemenin nasıl çalıştığı açıklanmaktadır.

Ve son olarak, otomatik makine çevirisi ekleyerek neler yapılabileceğinin harika bir demosu (@ 1h 12m 47s) .

Doğrudan içeriğe atlamak için videolara dakika ve saniye çapaları ekledim, eğer işe yaramazlarsa sayfayı yeniden yüklemeyi veya işarete elle kaydırmayı deneyin.


Algoritma yine de nasıl çalışır? Google, "Çeşitli terimlerle milyarlarca arama alıyoruz ve bunlar bu aramalar" ile "bu terimin bu terimin ortak bir yanlış yazımı olması gerekir" den nasıl gider? Bu sorunu çözdüler, ama ben nasıl ilgiliyim. İki aramanın aynı kullanıcıdan geldiğini ve hangi kelimenin bir diğerinin 'düzeltilmesi' olduğunu nasıl anlarlar ve milyarlarca aramada nasıl toplanırlar?
thomasrutter

51
Herkes "gece" kelimesini yanlış yazmaya başlarsa ... "Flickr" ı arayan insanlarla zaten bununla karşılaştıklarına inanıyorum.
Max Lybbert

42
herkesin bir şeyi yanlış yazmasıyla ilgili sorun zaten çok daha ciddi bir şekilde gerçekleşti: Google'a 'fuscia' yazmayı deneyin. Google, "Fuschia mı demek istediniz?" Doğru yazım aslında "fuşya" dır, ancak hiç kimse bir nedenle doğru yazamaz. Sorun, Pinterest'te daha da kötüdür; Eğer aramalarına "fuschia" yazarsanız, "fuschia için sonuç bulunamadı. Bunu mu demek istediniz: 'fuschia'? (yani, az önce yazdığınız şeyi mi kastettiniz?)
Daisy Sophia Hollman

8
Sadece yanlış yazım verileri kullandıklarına inanmıyorum - kesinlikle bazı Levenshtein mesafesi veya benzeri var - 'Plack' (ve bir veya daha fazla başka kelime) arayın ve her zaman 'siyah' olarak düzeltilir, bu çok olası bir yazım hatasıdır / typo
plusplus

4
@ Jakub Ben 4 + yıl önce bu yorum yaptığımdan beri onlar sorunu gidermek düşünüyorum. Gerçekten de Google sorunu çözdü. Fuşya araması, fuşya için sonuçları otomatik olarak içerir.
Daisy Sophia Hollman

104

Bu makaleyi bir süre önce buldum: Peter Norvig (Google Inc. Araştırma Direktörü) tarafından yazılan Yazım Düzeltici Nasıl Yazılır .

"Yazım düzeltmesi" konusu hakkında ilginç bir okuma. Örnekler Python'dadır, ancak anlaşılması açık ve basittir ve algoritmanın kolayca diğer dillere çevrilebileceğini düşünüyorum.

Aşağıda algoritmanın kısa bir açıklaması verilmiştir. Algoritma iki adımdan oluşur: hazırlık ve kelime kontrolü.

Adım 1: Hazırlık - Word veritabanını ayarlama

En iyisi, gerçek arama kelimelerini ve bunların oluşumunu kullanabilmenizdir. Eğer buna sahip değilseniz, bunun yerine geniş bir metin kümesi kullanılabilir. Her kelimenin oluşumunu (popülerliğini) sayın.

2. Adım. Kelime kontrolü - kontrol edilene benzer kelimeleri bulma

Benzer şekilde düzenleme mesafesi düşüktür (tipik olarak 0-1 veya 0-2). Düzenleme mesafesi, bir kelimeyi diğerine dönüştürmek için gereken minimum ekleme / silme / değişiklik / takas sayısıdır.

Önceki adımdan en popüler kelimeyi seçin ve bir düzeltme olarak önerin (kelimenin kendisi dışındaysa).


6
@Davide: "" "örnekler python'da ama anlaşılması kolay ve basit" "": "ama" kullanımınızı anlamıyorum. "Python + Norvig'in yazma stili" açık ve anlaşılması basittir "beklenen sonuçtur.
John Machin

20
"Ama" oradaydı çünkü Harry sorusunda bir VB.NET geliştiricisi olduğunu söyledi, bu yüzden python dilinden emin olmadığını varsaydım.
Davide Gualano

56

"Bunu mu demek istediniz?" Algoritması için Bilgi Erişimine Giriş Bölüm 3'e başvurabilirsiniz. Çevrimiçi olarak ücretsiz olarak kullanılabilir . Bölüm 3.3 (sayfa 52) sorunuza tam olarak cevap verir. Güncellemenizi özel olarak cevaplamak için sadece bir sözlük sözlüğüne ve başka hiçbir şeye ihtiyacınız yok (milyonlarca kullanıcı dahil).


10

Hmm ... Google'ın büyük veri topluluğunu (internet) ciddi NLP (Doğal Dil İşleme) yapmak için kullandığını düşündüm.

Örneğin, tüm internetten o kadar çok veriye sahipler ki, üç kelimelik bir dizinin kaç kez meydana geldiğini sayabilirler ( trigram olarak bilinir) ) . Yani "pembe frugr konseri" gibi bir cümle görürlerse, birkaç isabeti olduğunu görebiliyorlardı, daha sonra büyük olasılıkla "pembe * konseri" buluyorlar.

Görünüşe göre sadece Davide Gualano'nun söylediklerinin bir varyasyonunu yapıyorlar, bu yüzden kesinlikle bu bağlantıyı okuyun. Google elbette bir topluluk olarak bildiği tüm web sayfalarını kullanır, böylece algoritmasını özellikle etkili hale getirir.


7

Benim tahminim, bir Levenshtein mesafe algoritması ve yürütülen aramalar hakkında topladıkları veri yığınlarının bir kombinasyonunu kullanmalarıdır . Girilen arama dizesinden en kısa Levenshtein mesafesine sahip bir dizi arama yapabilir, ardından en fazla sonucu veren aramayı seçebilirler.


6
Diyelim ki toplamda milyarlarca web sayfası değerinde kelime saklısınız. Sorgulanan her kelime için Levenshtein mesafesini hesaplamaksızın Levenshtein mesafesini hesaplamaksızın Levenshtein mesafesini endekslemenin kolay bir yolu yoktur. Bu nedenle Levenshtein mesafesi, Google'ın milyarlarca mevcut kelimeden sadece mevcut kelimenin yanlış yazılması muhtemel kelimelere daralması gereken bu aşamada, en azından ilk aşamada fazla kullanılmamaktadır. Muhtemelen eşleşmeleri zaten getirdikten sonra Levenshtein'i daha sonraki bir adım olarak uygulayabilir.
thomasrutter

6

Normalde bir üretim yazım düzeltici, bir yazım önerisi sağlamak için çeşitli yöntemler kullanır. Bazıları:

  • Yazım düzeltmesinin gerekip gerekmediğini belirlemek için bir yol karar verin. Bunlar yetersiz sonuçlar, yeterince spesifik veya doğru olmayan sonuçlar (bazı önlemlere göre) vb. İçerebilir.

  • Tümünün veya çoğunun doğru yazılmış olduğu bilinen büyük bir metin gövdesi veya sözlük kullanın. Bunlar, LingPipe gibi yerlerde kolayca çevrimiçi bulunabilir . Ardından, en iyi öneriyi belirlemek için, çeşitli önlemlere dayanan en yakın eşleşme olan bir kelimeyi ararsınız. En sezgisel olanı benzer karakterlerdir. Araştırma ve deneylerle gösterilen şey, iki veya üç karakter dizisi eşleşmesinin daha iyi çalıştığıdır. (bigram ve trigram). Sonuçları daha da iyileştirmek için, kelimenin başında veya sonunda bir maçta daha yüksek bir puan alın. Performans nedenleriyle, tüm bu kelimeleri trigram veya bigram olarak endeksleyin, böylece bir arama gerçekleştirirken n-grama dönüştürür ve hashtable veya trie ile aramayı yaparsınız.

  • Karakter konumuna bağlı olarak olası klavye hatalarıyla ilgili buluşsal yöntemler kullanın. Böylece "hwllo" "merhaba" olmalıdır, çünkü 'w' 'e'ye yakındır.

  • Kelimeleri endekslemek ve olası düzeltmeleri aramak için fonetik bir anahtar (Soundex, Metaphone) kullanın. Pratikte bu normalde yukarıda açıklandığı gibi n-gram indeksleme kullanmaktan daha kötü sonuçlar verir.

  • Her durumda bir listeden en iyi düzeltmeyi seçmelisiniz. Bu levenshtein, klavye metriği vb. Gibi bir mesafe metriği olabilir.

  • Çok kelimeli bir ifade için yalnızca bir kelime yanlış yazılmış olabilir; bu durumda kalan kelimeleri en iyi eşleşmeyi belirlemede bağlam olarak kullanabilirsiniz.


6

Levenshtein mesafesini kullanın , ardından kelimeleri dizine eklemek için bir Metrik Ağaç (veya İnce ağaç) oluşturun. Sonra 1-En yakın komşu sorgusu çalıştırın ve sonuç elde.


4

Google görünüşe göre, doğru yazılanlarla değil, en iyi sonuçları veren sorgular önerir. Ancak bu durumda, muhtemelen bir büyü düzeltici daha uygun olacaktır, Elbette, her bir sorgu için, ne kadar iyi sonuçlar döndürdüğüne dair bir metriğe dayanarak bazı değerler depolayabilirsiniz.

Yani,

  1. Bir sözlüğe ihtiyacınız var (İngilizce veya verilerinize göre)

  2. Bir kelime kafes oluşturun ve sözlüğünüzü kullanarak geçişler için olasılıkları hesaplayın.

  3. Kafesinizi kullanarak minimum hata mesafesini hesaplamak için bir dekoder ekleyin. Tabii ki mesafeleri hesaplarken eklemelere ve silmelere dikkat etmelisiniz. Eğlenceli olan şey, QWERTY klavyenin birbirine yakın tuşlara basarsanız mesafeyi en üst düzeye çıkarmasıdır. (Cae arabayı çevirir, cay kediyi çevirir)

  4. Minimum mesafeye sahip kelimeyi döndürün.

  5. Ardından bunu sorgu veritabanınızla karşılaştırabilir ve diğer yakın eşleşmeler için daha iyi sonuçlar olup olmadığını kontrol edebilirsiniz.


4

İşte bulduğum en iyi cevap , Google'ın Araştırma Direktörü Peter Norvig tarafından uygulanan ve açıklanan Yazım düzeltici.

Bunun arkasındaki teori hakkında daha fazla okumak istiyorsanız, onun kitap bölümünü okuyabilirsiniz . .

Bu algoritma fikri istatistiksel makine öğrenmesine dayanmaktadır.


3

Bu konuda birkaç yıl önce bir şey gördüm, o zamandan beri değişmiş olabilir, ancak görünüşe göre, kısa bir süre içinde çok benzer sorgular gönderen aynı kullanıcılar için günlüklerini analiz ederek işe başladılar ve kullanıcıların nasıl düzeltildiğine göre makine öğrenimi kullandılar kendilerini.


3

Tahmin etmek gerekirse ...

  1. kelimeleri ara
  2. bulunmazsa kelimeyi "tahmin etmeye" çalışmak için bazı algoritmalar kullanın.

Hopfield ağı veya geri yayılma ağı gibi AI'dan bir şey veya Davide'nın daha önce bahsettiği gibi kırık verileri geri yükleme veya düzeltmeleri yazım gibi başka bir şey olabilir ...


2

Basit. Onlar sahip ton verilerinin. Ne sıklıkta sorgulandığına ve kullanıcıların hangi tıklamaların genellikle hangi tıklama sonucu verdiğine bağlı olarak, her olası terim için istatistikleri vardır ... bu nedenle, bir arama terimi için sık sık bir yazım hatası yazdığınızı gördüklerinde daha olağan cevap.

Aslında, yanlış yazım aslında en sık aranan terimse, algoritma doğru olanı alır.


1
Kimse Google'ın bunu yapmak için gerekli tüm verilere sahip olduğundan şüphe etmedi, ancak soru Google'ın bunu yapmak için makul bir süre içinde bu kadar çok veriyle nasıl bir algoritma geliştirdiği hakkında ayrıntılar soruyordu. Günde milyarlarca arama yaparlardı - bir arama teriminin başka bir sonuncunun 'yazım düzeltmesi' olup olmadığını nasıl kolayca belirleyebilirler? Google'ın bir terimin başka bir terimin yanlış yazılmasına karar vermesini sağlayan faktörler nelerdir? Bunlar ilgi çekici olacak uygulama detaylarıdır.
thomasrutter

2

tonlarca veri olmadan davranışı nasıl taklit edeceğinizle ilgili sorunuz - neden google tarafından toplanan tonlarca veriyi kullanmıyorsunuz? Yanlış yazılmış kelimeye ait google sarch sonuçlarını indirin ve HTML'de "Bunu mu demek istediniz:" ifadesini arayın.

Sanırım bu günlerde mashup deniyor :-)


Google botunuzun kazıma işlemini ne kadar süre durdurur? - veya google bu günlerde bile fark etmeyecek miydi?
Andrew Harry

Reqs / sn çok yüksek olmadığını fark edeceğini sanmıyorum.
Mauricio Scheffer

2

Yukarıdaki cevapların yanı sıra, bir şeyi hızlı bir şekilde kendiniz uygulamak istiyorsanız, işte bir öneri -

Algoritma

Bu algoritmanın uygulanmasını ve ayrıntılı belgelerini GitHub'da bulabilirsiniz .

  • Karşılaştırıcı ile bir Öncelik Kuyruğu oluşturun.
  • Bir Ternay Arama Ağacı oluşturun ve frekanslarıyla birlikte tüm İngilizce kelimeleri ( Norvig'in gönderisinden ) ekleyin .
  • TST'yi geçmeye başlayın ve TST'de karşılaşılan her kelime için Levenshtein Mesafesini ( LD ) input_word'den hesaplayın
  • LD ≤ 3 ise bir Öncelik Kuyruğuna koyun.
  • Sonunda Öncelik Kuyruğundan 10 kelime çıkar ve göster.

1

Yazım denetleyicisi mi demek istiyorsun? Eğer bütün bir ifade yerine bir yazım denetleyicisi ise, o zaman algoritmanın python'da geliştirildiği yazım denetimi hakkında bir linkim var. Bu bağlantıyı kontrol et

Bu arada, metin kullanarak veritabanlarında arama yapmayı içeren proje üzerinde de çalışıyorum. Sanırım bu sorununuzu çözecek


1

Bu eski bir soru ve hiç kimsenin OP'yi Apache Solr kullanarak önermediğine şaşırdım.

Apache Solr, diğer birçok işlevin yanı sıra yazım denetimi veya sorgu önerileri sunan tam metin arama motorudur. Gönderen dokümantasyon :

Varsayılan olarak, Lucene Yazım denetleyicileri önerileri önce dizgi mesafesi hesaplamasından alınan puana göre ve ikincisi dizindeki önerinin sıklığına (varsa) göre sıralar.


0

Kısmi eşleşmeleri ve yakın komşu eşleşmeleri doğal olarak destekleyen belirli bir veri yapısı - üçlü arama ağacı - vardır.


-1

Bunu anlamanın en kolay yolu Google dinamik programlamadır.

Information Retrieval'dan ödünç alınan bir algoritmadır ve iki gen dizisinin ne kadar benzer olduğunu görmek için günümüz biyoinformatiğinde yoğun olarak kullanılmaktadır.

Optimal çözüm dinamik programlama ve özyineleme kullanır.

Bu, birçok çözümle çok çözülmüş bir sorundur. Bazı açık kaynak kodunu bulana kadar google.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.