2009-02-27 19 views
18

Devo associare automaticamente i nomi dei prodotti (fotocamere, computer portatili, televisori ecc.) Che provengono da fonti diverse a un nome canonico nel database.Corrispondenza sfocata dei nomi dei prodotti

Per esempio "Canon PowerShot a20IS", "NEW powershot A20 IS di Canon" e "fotocamera digitale Canon PS A20IS" dovrebbero tutti i match "Canon PowerShot A20". Ho lavorato con la distanza di levenshtein con alcune euristiche aggiunte (rimuovendo ovvie parole comuni, assegnando un costo maggiore alle variazioni di numero ecc.), Che funziona in una certa misura, ma purtroppo non abbastanza bene.

Il problema principale è che anche le modifiche a una sola lettera nelle parole chiave pertinenti possono fare un'enorme differenza, ma non è facile individuare quali siano le parole chiave pertinenti. Consideriamo per esempio tre nomi di prodotto:
Lenovo T400
Lenovo R400
Nuovo Lenovo T400, Core 2 Duo
Le prime due sono le stringhe ridicolmente simili per qualsiasi standard (ok, soundex potrebbe aiutare in questo caso, per disattivare T e R, ma i nomi potrebbero essere anche 400T e 400R), il primo e il terzo sono piuttosto distanti l'uno dall'altro come stringhe, ma sono lo stesso prodotto.

Ovviamente, l'algoritmo di corrispondenza non può essere preciso al 100%, il mio obiettivo è quello di abbinare automaticamente circa l'80% dei nomi con una grande sicurezza.

Tutte le idee o riferimenti è molto apprezzato

risposta

0

Si potrebbe desiderare di creare una logica che ignora la lettera/numero combinazione di numeri di modello (dato che sono quasi sempre estremamente simile).

0

Spell checking vengono in mente gli algoritmi.

Anche se non sono riuscito a trovare una buona implementazione del campione, credo che sia possibile modificare un algoritmo di controllo ortografico di base per ottenere risultati soddisfacenti. cioè, lavorare con le parole come unità anziché come carattere.

I bit e pezzi lasciati nella mia memoria:

  1. Striscia tutte parole comuni (un, uno, il, nuovo). Ciò che è "comune" dipende dal contesto.
  2. Prendere la prima lettera di ogni parola e la sua lunghezza e farne una chiave di parola.
  3. Quando viene visualizzata una parola sospetta, cerca le parole con la stessa parola chiave o parole simili.

Potrebbe non risolvere i vostri problemi direttamente ... ma dire che siete stati alla ricerca di idee, giusto?

:-)

4

Credo che questo ridursi a distinguere le parole chiave come Lenovo dal loglio, come Nuovo.

Vorrei eseguire un'analisi sul database dei nomi per identificare le parole chiave. Potresti usare un codice simile a quello usato per generare un word cloud.

Quindi vorrei modificare manualmente l'elenco per rimuovere qualsiasi cosa ovviamente chaff, come forse New è in realtà comune ma non chiave.

Quindi si avrà un elenco di parole chiave che possono essere utilizzate per aiutare a identificare le somiglianze. Dovresti associare il nome "raw" con le sue parole chiave e utilizzare quelle parole chiave quando confronti due o più nomi grezzi per somiglianze (letteralmente, percentuale di parole chiave condivise).

Non è una soluzione perfetta da nessuna parte, ma non credo che te ne aspetti uno?

0

Non avendo alcuna esperienza con questo tipo di problema, ma penso che un'implementazione molto ingenua sarebbe quella di ridurre a icona il termine di ricerca e cercare le corrispondenze che contengono uno dei token.

"Canon PowerShot A20 IS", per esempio, tokenizza in:

  • Canon
  • Powershot
  • A20
  • IS

che corrispondere ciascuno degli altri elementi vuoi apparire nei risultati. Naturalmente, questa strategia produrrà probabilmente anche molte partite false.

Un'altra strategia potrebbe essere quella di memorizzare "parole chiave" con ogni elemento, ad esempio "fotocamera", "canon", "fotocamera digitale" e ricerca in base agli elementi con parole chiave corrispondenti. Inoltre, se hai memorizzato altri attributi come Maker, Brand, ecc., Puoi cercare su ognuno di questi.

3

La risposta di edg è nella giusta direzione, penso - è necessario distinguere le parole chiave da fluff.

Il contesto è importante. Per fare il tuo esempio, Core 2 Duo è fluff quando si guardano due istanze di un T400, ma non quando si guarda ad un pacchetto OEM della CPU.

Se è possibile contrassegnare nel proprio database quali parti della forma canonica di un nome di prodotto sono più importanti e devono apparire in un modo o nell'altro per identificare un prodotto, è necessario farlo. Forse attraverso l'uso di una sorta di markup semantico? Puoi permetterti di avere un markup umano nel database?

Puoi provare a definire le classi di equivalenza per cose come "T-400", "T400", "T 400" ecc. Forse un insieme di regole che dicono "i numeri si legano più fortemente delle lettere allegate a quei numeri".

L'interruzione in casi basati su produttore, numero di modello, ecc. Potrebbe essere un buon approccio. Ti consiglio di provare le tecniche di spotting a termine per provare: http://www.worldcat.org/isbn/9780262100854

Progettare tutto in un framework flessibile che è principalmente guidato da regole, in cui le regole possono essere modificate in base alle tue esigenze e ai cattivi pattern emergenti (leggi: cose che infrangono il tuo algoritmo) sarebbe una buona idea. In questo modo sarai in grado di migliorare le prestazioni del sistema in base ai dati del mondo reale.

0

Questo è esattamente il problema su cui sto lavorando nel mio tempo libero.Quello che mi è venuto in mente è: base a parole chiave restringere l'ambito di ricerca:

in questo caso si potrebbe avere una certa gerarchia:

tipo -> azienda -> modello

in modo che avresti dovuto corrispondere a "Fotocamera digitale" "Canon" per la società e lì ti resterebbe un ambito molto più ristretto per la ricerca.

Si potrebbe lavorare ulteriormente introducendo linee di prodotti, ecc. Ma il punto principale è, probabilmente, questo deve essere fatto in modo iterativo.

+0

Questo approccio ha funzionato per voi o siete andati in un'altra direzione? –

2

Per questo potrebbe essere possibile utilizzare uno trigram search. Devo ammettere che non ho mai visto l'algoritmo per implementare un indice, ma l'ho visto funzionare in applicazioni farmaceutiche, dove si comporta molto bene con nomi di farmaci gravemente falliti. Potresti essere in grado di applicare lo stesso tipo di logica a questo problema.

4

La comprensione chiave qui è che si dispone di una metrica di distanza corretta. In effetti, non è affatto il tuo problema. Il tuo problema è nella classificazione.

Lasciatemi fare un esempio. Supponi di avere 20 voci per Foo X1 e 20 per Foo Y1. Puoi tranquillamente supporre che siano due gruppi. D'altra parte, se hai 39 voci per la Barra X1 e 1 per la Barra Y1, dovresti trattarle come un singolo gruppo.

Ora, la distanza X1 < -> Y1 è la stessa in entrambi gli esempi, quindi perché c'è una differenza nella classificazione? Questo perché Bar Y1 è un outlier, mentre Foo Y1 no.

La parte divertente è che in realtà non è necessario eseguire molto lavoro per determinare questi gruppi in anticipo. Devi semplicemente fare una classificazione ricorsiva. Si inizia con il nodo per gruppo, quindi si aggiunge un supernodo per i due nodi più vicini. Nel supernodo, memorizza la migliore ipotesi, la dimensione della sua sottostruttura e la variazione in essa. Dal momento che molte delle tue stringhe saranno identiche, avrai presto grosse sottostrutture con voci identiche. La ricorsione termina con il supernodo che contiene alla radice dell'albero.

Ora mappare i nomi canonici contro questo albero. Vedrai rapidamente che ognuna corrisponderà a un'intera sottostruttura. Ora, usa le distanze tra questi alberi per selezionare il taglio di distanza per quella voce. Se nel database sono presenti entrambi i prodotti Foo X1 e Foo Y1, la distanza di cut-off dovrà essere inferiore per riflettere ciò.

-1

Possiamo usare lo Datadecision service per i prodotti corrispondenti.

Vi consentirà di abbinare automaticamente i dati del vostro prodotto usando algoritmi statistici. Questa operazione viene eseguita dopo aver definito un punteggio soglia di confidenza.

Tutti i dati che non possono essere abbinati automaticamente dovranno essere rivisti manualmente tramite un'interfaccia utente dedicata.

Il servizio online utilizza tabelle di ricerca per memorizzare sinonimi e la cronologia di corrispondenza manuale. Ciò ti consente di migliorare l'automazione della corrispondenza dei dati la prossima volta che importi nuovi dati.

0

Questo è un problema di record linkage. Il dedupe python library fornisce un'implementazione completa, ma anche se non si utilizza python, la documentazione ha un good overview of how to approach this problem.

In breve, all'interno del paradigma standard di questo compito è suddiviso in tre fasi

  1. confrontare i campi, in questo caso, solo il nome. È possibile utilizzare uno o più comparatore per questo, ad esempio una distanza di modifica come la distanza di Levenshtein o qualcosa come la distanza del coseno che confronta il numero di parole comuni.
  2. Trasforma un array per i punteggi di distanza in una probabilità che una coppia di record riguardi davvero la stessa cosa
  3. Raggruppa i punteggi di probabilità a coppie in gruppi di record che probabilmente si riferiscono tutti alla stessa cosa.