In che modo Google "Intendevi?" L'algoritmo funziona?


436

Ho sviluppato un sito Web interno per uno strumento di gestione del portafoglio. Ci sono molti dati di testo, nomi di società, ecc. Sono stato davvero colpito dalla capacità di alcuni motori di ricerca di rispondere molto rapidamente alle domande con "Intendevi: xxxx".

Devo essere in grado di rispondere in modo intelligente a una query dell'utente e rispondere non solo con risultati di ricerca non elaborati, ma anche con un "Intendevi?" risposta quando esiste una risposta alternativa molto probabile ecc

[Sto sviluppando in ASP.NET (VB - non tenerlo contro di me!)]

AGGIORNAMENTO: OK, come posso imitare questo senza i milioni di "utenti non pagati"?

  • Generare errori di battitura per ogni termine "noto" o "corretto" ed eseguire ricerche?
  • Qualche altro metodo più elegante?

1
Ecco la versione VB.NET del Norvig Spelling Corrector. Potresti trovarlo utile se non è troppo tardi!
Ralph Wiggum,


Scrivo su una tastiera non qwerty (Colemak) e la funzione non è altrettanto intelligente. Sicuramente impara dalle coppie registrate di correzione degli errori ed è quindi sintonizzato su qwerty. I correttori ortografici ordinari funzionano bene per la mia tastiera, come previsto: la distanza di modifica delle stringhe è invariante dal layout.
Colonnello Panic,

Risposte:


366

Ecco la spiegazione direttamente dalla fonte (quasi)

Cerca 101!

alle 22:03 min

Vale la pena guardare!

Fondamentalmente e secondo Douglas Merrill ex CTO di Google è così:

1) Scrivi una parola (errata) in google

2) Non trovi quello che volevi (non cliccare su nessun risultato)

3) Ti rendi conto di aver sbagliato a scrivere la parola in modo da riscriverla nella casella di ricerca.

4) Trova quello che vuoi (fai clic nei primi link)

Questo schema si è moltiplicato milioni di volte, mostra quali sono gli errori ortografici più comuni e quali sono le correzioni più "comuni".

In questo modo Google può quasi istantaneamente offrire la correzione ortografica in ogni lingua.

Anche questo significa che se durante la notte tutti iniziano a scrivere la notte come "nigth" google suggerirebbe invece quella parola.

MODIFICARE

@ThomasRutter: Douglas lo descrive come "apprendimento automatico statistico".

Sanno chi corregge la query, perché sanno quale query proviene da quale utente (utilizzando i cookie)

Se gli utenti eseguono una query e solo il 10% degli utenti fa clic su un risultato e il 90% torna indietro e digita un'altra query (con la parola corretta) e questa volta il 90% fa clic su un risultato, quindi sa di aver trovato una correzione.

Possono anche sapere se si tratta di query "correlate" di due diversi, poiché dispongono di informazioni su tutti i collegamenti che mostrano.

Inoltre, ora stanno includendo il contesto nel controllo ortografico, quindi possono anche suggerire parole diverse a seconda del contesto.

Guarda questa demo di google wave (@ 44m 06s) che mostra come il contesto viene preso in considerazione per correggere automaticamente l'ortografia.

Qui viene spiegato come funziona l'elaborazione del linguaggio naturale.

E finalmente ecco una fantastica demo di cosa si può fare aggiungendo al mix la traduzione automatica (@ 1h 12m 47s).

Ho aggiunto ancore di minuti e secondi ai video per saltare direttamente al contenuto, se non funzionano, prova a ricaricare la pagina o scorrere manualmente fino al segno.


Come funziona l'algoritmo? In che modo Google passa da "Riceviamo miliardi di ricerche con vari termini, e queste sono quelle ricerche" a "questo termine deve quindi essere un errore di ortografia comune di questo termine"? Hanno risolto questo problema, ma sono interessato a come. Come fanno a capire che due ricerche provengono dallo stesso utente, e quale parola è una "correzione" di un'altra, e come aggregare ciò su miliardi di ricerche?
thomasrutter,

51
Se tutti iniziassero a scrivere "notte" ... credo che si fossero già imbattuti in questo con persone che cercavano "Flickr".
Max Lybbert,

42
il problema con tutti gli errori di ortografia è già accaduto qualcosa in un senso molto più grave: prova a digitare "fuscia" in Google. Google dice "Intendevi fucsia?" L'ortografia corretta, infatti, è "fucsia", ma nessuno può scriverlo correttamente per qualche motivo. Il problema è ancora peggiore su Dictionary.com; se digiti "fucsia" nella loro ricerca, otterrai "Nessun risultato per fucsia. Volevi dire 'fucsia'?" (Cioè, intendevi quello che hai appena scritto?)
Daisy Sophia Hollman,

8
Non credo che utilizzino solo dati di errori di ortografia - c'è sicuramente una certa distanza di Levenshtein o simili in corso - cerca "Plack" (e una o più altre parole) e viene sempre corretto in "nero", che è un errore di ortografia molto improbabile / refuso
plusplus

4
@Jakub Penso che abbiano risolto il problema da quando ho fatto quel commento 4+ anni fa. In effetti, anche Google ha risolto il problema. Una ricerca per Fucchia include automaticamente i risultati per la fucsia.
Daisy Sophia Hollman,

104

Ho trovato questo articolo qualche tempo fa: How to Write a Spelling Corrector , scritto da Peter Norvig (Director of Research presso Google Inc.).

È una lettura interessante sull'argomento "correzione ortografica". Gli esempi sono in Python ma è chiaro e semplice da capire, e penso che l'algoritmo possa essere facilmente tradotto in altre lingue.

Di seguito segue una breve descrizione dell'algoritmo. L'algoritmo consiste in due passaggi, preparazione e controllo delle parole.

Passaggio 1: Preparazione: impostazione del database di parole

La cosa migliore è se puoi usare parole di ricerca reali e la loro occorrenza. Se non si dispone di un numero elevato di testo, è possibile utilizzare invece. Conta la ricorrenza (popolarità) di ogni parola.

Passaggio 2. Controllo delle parole: ricerca di parole simili a quelle selezionate

Simile significa che la distanza di modifica è bassa (in genere 0-1 o 0-2). La distanza di modifica è il numero minimo di inserimenti / eliminazioni / modifiche / scambi necessari per trasformare una parola in un'altra.

Scegli la parola più popolare dal passaggio precedente e suggeriscila come correzione (se diversa dalla parola stessa).


6
@Davide: "" "gli esempi sono in pitone ma è chiaro e semplice da capire" "": non capisco il tuo uso di "ma" ... direi dato lo stile di scrittura di Python + Norvig, "chiaro e semplice da capire "è il risultato atteso.
John Machin,

20
Il "ma" era lì perché Harry ha detto nella sua domanda che è uno sviluppatore VB.NET, quindi ho pensato che non fosse sicuro del linguaggio Python.
Davide Gualano,

56

Per la teoria dell'algoritmo "volevi dire" puoi fare riferimento al capitolo 3 di Introduzione al recupero delle informazioni. È disponibile online gratuitamente. La Sezione 3.3 (pagina 52) risponde esattamente alla tua domanda. E per rispondere in modo specifico al tuo aggiornamento hai solo bisogno di un dizionario di parole e nient'altro (inclusi milioni di utenti).


10

Hmm ... Pensavo che Google usasse il loro vasto corpus di dati (Internet) per fare un serio NLP (Natural Language Processing).

Ad esempio, hanno così tanti dati da tutta Internet che possono contare il numero di volte in cui si verifica una sequenza di tre parole (nota come trigramma ). Quindi, se vedono una frase del tipo: "concerto Pink Frugr", potrebbero vedere che ha pochi successi, quindi trovare il "concerto * rosa" più probabile nel loro corpus.

Apparentemente fanno solo una variazione di ciò che diceva Davide Gualano, quindi leggete sicuramente quel link. Ovviamente Google utilizza tutte le pagine Web che conosce come corpus, il che rende il suo algoritmo particolarmente efficace.


7

La mia ipotesi è che utilizzino una combinazione di un algoritmo di distanza Levenshtein e le masse di dati che raccolgono in merito alle ricerche eseguite. Potrebbero estrarre una serie di ricerche che hanno la distanza Levenshtein più breve dalla stringa di ricerca immessa, quindi scegliere quella con il maggior numero di risultati.


6
Supponiamo che tu abbia archiviato un totale di miliardi di parole di pagine Web. Non esiste un modo semplice per indicizzare la distanza di Levenshtein per il recupero rapido di partite vicine senza calcolare la distanza di Levenshtein alcuni miliardi di volte per ogni parola interrogata. La distanza di Levenshtein non è quindi molto utile in questa situazione, almeno non nella prima fase, in cui Google deve restringere da miliardi di parole esistenti solo a quelle parole che probabilmente saranno errori di ortografia della parola corrente. Può sicuramente applicare Levenshtein come passaggio successivo una volta che ha già recuperato le probabili corrispondenze.
thomasrutter,

6

Normalmente un correttore ortografico di produzione utilizza diverse metodologie per fornire un suggerimento ortografico. Alcuni sono:

  • Decidi come stabilire se è necessaria la correzione ortografica. Questi possono includere risultati insufficienti, risultati che non sono sufficientemente specifici o precisi (secondo alcune misure), ecc. Quindi:

  • Usa una grande quantità di testo o un dizionario, in cui tutti o quasi tutti sono noti per essere stati scritti correttamente. Questi sono facilmente reperibili online, in posti come LingPipe . Quindi, per determinare il miglior suggerimento, cerca una parola che corrisponde alla corrispondenza più vicina in base a diverse misure. Il più intuitivo sono personaggi simili. Ciò che è stato dimostrato attraverso la ricerca e la sperimentazione è che le combinazioni di sequenze di due o tre caratteri funzionano meglio. (bigrammi e trigrammi). Per migliorare ulteriormente i risultati, soppesare un punteggio più alto su una partita all'inizio o alla fine della parola. Per motivi di prestazioni, indicizza tutte queste parole come trigrammi o bigrammi, in modo che quando esegui una ricerca, converti in n-grammo e la ricerca tramite hashtable o trie.

  • Utilizza l'euristica relativa a potenziali errori della tastiera in base alla posizione del personaggio. Quindi "hwllo" dovrebbe essere "ciao" perché "w" è vicino a "e".

  • Utilizzare un tasto fonetico (Soundex, Metaphone) per indicizzare le parole e cercare possibili correzioni. In pratica, ciò normalmente restituisce risultati peggiori rispetto all'utilizzo dell'indicizzazione n-gram, come descritto sopra.

  • In ogni caso è necessario selezionare la migliore correzione da un elenco. Potrebbe trattarsi di una metrica di distanza come levenshtein, la metrica della tastiera, ecc.

  • Per una frase di più parole, solo una parola può essere errata, nel qual caso è possibile utilizzare le parole rimanenti come contesto per determinare la migliore corrispondenza.



4

Google sembra suggerire query con i migliori risultati, non con quelli scritti correttamente. Ma in questo caso, probabilmente un correttore ortografico sarebbe più fattibile, ovviamente potresti archiviare un valore per ogni query, in base a una metrica di risultati positivi che restituisce.

Così,

  1. Hai bisogno di un dizionario (inglese o basato sui tuoi dati)

  2. Genera un traliccio di parole e calcola le probabilità per le transizioni usando il tuo dizionario.

  3. Aggiungi un decodificatore per calcolare la distanza minima di errore utilizzando il traliccio. Ovviamente dovresti occuparti degli inserimenti e delle cancellazioni durante il calcolo delle distanze. La cosa divertente è che la tastiera QWERTY massimizza la distanza se si premono i tasti uno accanto all'altro.

  4. Restituisce la parola che ha la distanza minima.

  5. Quindi puoi confrontarlo con il tuo database di query e verificare se ci sono risultati migliori per altre corrispondenze ravvicinate.



3

Ho visto qualcosa su questo alcuni anni fa, quindi potrebbe essere cambiato da allora, ma a quanto pare lo hanno iniziato analizzando i loro registri per gli stessi utenti che inviano query molto simili in un breve lasso di tempo e hanno usato l'apprendimento automatico basato su come gli utenti avevano corretto loro stessi.


3

Come supposizione ... potrebbe

  1. cerca parole
  2. se non viene trovato, utilizzare un algoritmo per provare a "indovinare" la parola.

Potrebbe essere qualcosa proveniente dall'intelligenza artificiale come la rete Hopfield o la rete di propagazione posteriore, o qualcos'altro che "identifica le impronte digitali", ripristina i dati rotti o corregge l'ortografia, come già menzionato da Davide ...


2

Semplice. Hanno tonnellate di dati. Hanno statistiche per ogni possibile termine, basato sulla frequenza con cui viene interrogato e su quali variazioni di solito generano risultati su cui gli utenti fanno clic ... quindi, quando ti vedono digitare un frequente errore di ortografia per un termine di ricerca, vanno avanti e propongono la risposta più consueta.

In realtà, se l'ortografia è in effetti il ​​termine cercato più frequente, l'algoritmo lo prenderà per quello giusto.


1
Nessuno ha dubitato che Google abbia tutti i dati necessari per farlo, ma la domanda era quella di chiedere dettagli su come Google ha escogitato un algoritmo per farlo, con così tanti dati, in un ragionevole lasso di tempo. Avrebbero a disposizione milioni di ricerche al giorno: come si può facilmente identificare se un termine di ricerca è una "correzione ortografica" di un'altra recente? Quali fattori spingono Google a decidere che un termine è un errore di ortografia di un altro? Questi sono dettagli di implementazione che sarebbero di interesse.
thomasrutter,

2

riguardo alla tua domanda su come imitare il comportamento senza avere tonnellate di dati - perché non usare tonnellate di dati raccolti da google? Scarica i risultati di google sarch per la parola errata e cerca "Intendevi:" nell'HTML.

Immagino che al giorno d'oggi si chiami mashup :-)


quanto tempo ci vorrà prima che google fermi il tuo bot? - o Google non se ne accorgerebbe nemmeno in questi giorni?
Andrew Harry,

Non penso che noteranno se i reqs / sec non sono troppo alti.
Mauricio Scheffer,

2

Oltre alle risposte di cui sopra, nel caso in cui desideri implementare qualcosa da solo rapidamente, ecco un suggerimento:

Algoritmo

Puoi trovare l'implementazione e la documentazione dettagliata di questo algoritmo su GitHub .

  • Creare una coda di priorità con un comparatore.
  • Crea un albero di ricerca Ternay e inserisci tutte le parole inglesi (dal post di Norvig ) insieme alle loro frequenze.
  • Inizia a attraversare il TST e per ogni parola trovata nel TST, calcola la sua distanza di Levenshtein ( LD ) da input_word
  • Se LD ≤ 3, inseriscilo in una coda di priorità.
  • Alla fine estrarre 10 parole dalla coda di priorità e visualizzare.

1

Intendi dire controllo ortografico? Se si tratta di un controllo ortografico piuttosto che di un'intera frase, allora ho un link sul controllo ortografico in cui l'algoritmo è sviluppato in Python. Controlla questo link

Nel frattempo, sto anche lavorando a un progetto che include la ricerca di database usando il testo. Immagino che questo risolverebbe il tuo problema


1

Questa è una vecchia domanda e sono sorpreso che nessuno abbia suggerito l'OP usando Apache Solr.

Apache Solr è un motore di ricerca full-text che oltre a molte altre funzionalità fornisce anche il controllo ortografico o suggerimenti di query. Dalla documentazione :

Per impostazione predefinita, i correttori ortografici Lucene ordinano i suggerimenti prima in base al punteggio dal calcolo della distanza della stringa e in secondo luogo dalla frequenza (se disponibile) del suggerimento nell'indice.


0

Esiste una struttura di dati specifica - albero di ricerca ternaria - che supporta naturalmente corrispondenze parziali e corrispondenze vicine.


-1

Il modo più semplice per capirlo è la programmazione dinamica di Google.

È un algoritmo che è stato preso in prestito dall'Information Retrieval ed è ampiamente utilizzato nella bioinformatica moderna per vedere come sono simili due sequenze geniche.

La soluzione ottimale utilizza la programmazione dinamica e la ricorsione.

Questo è un problema molto risolto con molte soluzioni. Basta andare su Google fino a trovare un codice open source.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.