2009-03-29 23 views
6

Ho una lista che rappresenta prodotti che sono più o meno uguali. Ad esempio, nell'elenco di seguito, sono tutti dischi rigidi di Seagate.Algoritmo per classificare un elenco di prodotti?

  1. Seagate Hard Drive 500Go
  2. Seagate Hard Drive 120Go laptop
  3. Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s disco rigido
  4. nuovo e shinny disco rigido Seagate da 500Go
  5. Seagate Barracuda 7200.12
  6. Seagate FreeAgent Desk Disco rigido esterno da 500 GB Argento 7200 RPM USB2.0 Vendita al dettaglio

Per un essere umano, i dischi rigidi 3 e 5 sono uguali. Potremmo andare un po 'oltre e supporre che i prodotti 1, 3, 4 e 5 siano uguali e inserire in altre categorie i prodotti 2 e 6.

Abbiamo una lista enorme di prodotti che vorrei classificare . Qualcuno ha un'idea di quale sarebbe il miglior algoritmo per fare una cosa del genere. Qualche suggerimento?

Mi sembra di un classificatore bayesiano ma non sono sicuro che sia la scelta migliore. Qualsiasi aiuto sarebbe apprezzato!

Grazie.

risposta

5

Hai bisogno di almeno due componenti:

primo luogo, avete bisogno di qualcosa che fa estrazione di "feature", vale a dire che prende i tuoi articoli ed estrae le informazioni pertinenti. Ad esempio, "new and shinny" non è rilevante quanto "500Go hard drive" e "seagate". Un approccio (molto) semplice consisterebbe in un semplice produttore euristico di estrazione, nomi di tecnologia come "USB 2.0" e modelli come "GB", "RPM" di ciascun articolo.

Si finisce quindi con un set di funzionalità per ciascun articolo. Alcune persone che imparano a usare la macchina amano mettere questo in un "vettore di funzionalità", cioè ha una voce per ogni funzione, essendo impostata su 0 o 1, a seconda che la funzione esista o meno. Questa è la tua rappresentazione dei dati. Su questi vettori puoi fare un confronto a distanza.

Si noti che si potrebbe finire con un vettore di migliaia di voci. Anche allora, devi quindi raggruppare i risultati.

Possibilmente utili articoli di Wikipedia:

+0

Grazie! Approccio molto interessante! – Martin

1

Uno dei problemi che si incontrano è quello di decidere Casa più vicina negli attributi non lineari o non ordinati. Sto costruendo su Manuel's entry qui.

Un problema che si hanno è quello di decidere sulla prossimità di (1) Seagate 500Go, (2) disco rigido Seagate 120Go laptop, e (3) di Seagate FreeAgent Desk 500GB disco rigido esterno Argento 7200 USB2.0 al dettaglio:

1 è più vicino a 2 o a 3? Le differenze giustificano diverse categorie?

Una persona umana direbbe che 3 è tra 1 e 2, poiché un HD esterno può essere utilizzato su entrambi i tipi di macchine. Il che significa che se qualcuno cerca un HD per il suo desktop e allarga la portata della selezione per includere alternative, verranno mostrati anche HD esterni, ma non HD portatili. Probabilmente, gli SSD, le chiavette USB, le unità CD/DVD saranno visibili anche prima delle unità portatili, aumentando così la portata.

Possibile soluzione:

utenti attuali con coppie di attributi e lasciarli appesantire prossimità. Date loro una scala per dirvi quanto sono vicini alcuni attributi. L'ampliamento dell'ambito di una selezione utilizzerà quindi questa scala come funzione di distanza su questo attributo.

1

Per classificare effettivamente un prodotto, è possibile utilizzare una "rete neurale avanzata" con una lavagna. (Questa è solo una metafora per farti pensare nella giusta direzione, non un uso rigoroso dei termini.)

Immagina un insieme di oggetti che sono collegati tramite ascoltatori o eventi (proprio come i neuroni e la sinapsi). Ogni oggetto ha una serie di modelli e verifica l'input rispetto a questi modelli.

Un esempio:

  • Un test oggetto per ("Seagate" | "Connor" | "Maxtor" | "quantum" | ...)
  • test per un altro oggetto [: digit:] "? * (") (" gb "|" MB ")
  • test un altro oggetto per [: digit:] *? (" ")" rpm"

Tutti questi oggetti si collegano a un altro oggetto che , se determinate combinazioni di questi attivano, categorizza l'input come disco rigido. I singoli oggetti stessi inseriscono alcune caratterizzazioni nella lavagna (area di scrittura comune per dire cose sull'input) come produttore, capacità o velocità.

Quindi i neuroni non sparano basandosi su una soglia, ma su un riconoscimento di un modello. Molti di questi neuroni possono funzionare in modo molto parallelo sulla lavagna e persino correggere le categorizzazioni di altri neuroni (forse introducendo certezze?)

Ho usato qualcosa del genere in un prototipo per un prodotto utilizzato per classificare i prodotti in base allo UNSPSC ed è stato in grado di ottenere una classificazione corretta del 97% sulle parti di automobili.

+0

Grazie, Malach! Super interessante! – Martin

1

Non esiste una soluzione semplice per questo tipo di problema. Soprattutto se la tua lista è davvero grande (milioni di oggetti). Forse quelle due carte può puntare nella giusta direzione:

http://www.cs.utexas.edu/users/ml/papers/normalization-icdm-05.pdf http://www.ismll.uni-hildesheim.de/pub/pdfs/Rendle_SchmidtThieme2006-Object_Identification_with_Constraints.pdf

+0

Gli articoli suggeriti sono molto utili, peccato che non venga descritto abbastanza bene nella risposta – eliasah

0

MALLET ha implementazioni di CRF e MaxEnt che, probabilmente, in grado di fare bene il lavoro. Come qualcuno ha detto prima, dovrai prima estrarre le funzionalità e poi inserirle nel classificatore.

0

Per essere onesti, questo sembra più un problema Record Linkage di un problema di classificazione. Non sai in anticipo quali sono tutte le classi, giusto? Ma vuoi capire quali nomi di prodotti si riferiscono agli stessi prodotti e che si riferiscono a quelli diversi?

0

Per prima cosa utilizzerei un CountVectorizer per esaminare il vocabolario generato. Ci sarebbero parole come "da", "portatile", "veloce", "argento" ecc.Puoi usare le parole di stop per scartare queste parole che non ci forniscono alcuna informazione. Andrei anche avanti e scartare 'hard', 'drive', 'hard disk' ecc. Perché so che questo è un elenco di hard disk in modo da non fornire informazioni. Poi avremmo lista di parole come

  1. Seagate 500Go
  2. Seagate 120Go
  3. Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s
  4. 500Go Seagate ecc

È possibile utilizzare l'elenco di funzionalità come le cose che terminano con RPM sono suscettibili di fornire informazioni RPM, lo stesso vale per le cose che terminano con mb/s o Gb/s. Quindi scarterei caratteri alfanumerici come "1234FBA5235", che è probabilmente il numero di modello ecc. Che non ci darà molte informazioni. Ora, se sei già a conoscenza di marchi di dischi rigidi che appaiono nella tua lista come 'Seagate' 'Kingston' puoi usare la similarità delle stringhe o semplicemente controllare se sono presenti nella frase data. Fatto ciò, è possibile utilizzare il clustering per raggruppare oggetti simili. Ora gli oggetti con rpm simile, gb's, gb/s, nome del marchio saranno raggruppati insieme. Di nuovo, se usi qualcosa come KMean dovresti calcolare il miglior valore di K. Dovrai fare del lavoro manuale. Quello che potresti fare usa una trama a dispersione e un bulbo oculare per quale valore di K i dati classificano i migliori.

Ma il problema nell'approccio precedente è che se non si conosce in anticipo l'elenco dei marchi, si sarà nei guai. Quindi userei il classificatore bayesiano per cercare ogni frase e ottenere la probabilità che si tratti di un marchio di hard disk. Cercherei due cose

  1. Guarda i dati, il più delle volte la frase menzionerebbe esplicitamente la parola 'disco rigido', quindi saprei che sta sicuramente parlando di un disco rigido. Le possibilità per qualcosa come "disco rigido Mercedes Benz" sono ridotte.
  2. Questo è un po 'laborioso, ma vorrei scrivere un web scrapper Python su Amazon (o se non è possibile scriverne uno solo per le marche di dischi rigidi più usati e creare un elenco) Mi dà una lista come "Seagate Barracuda 7200.12 ST3500418AS 500 GB 7200 RPM SATA 3.0Gb/s 'ora per ogni frase userebbe qualcosa come Naive Bayes per darmi la probabilità che sia una marca. sklearn venire abbastanza utile per fare questa roba.
Problemi correlati