Domanda

La società 1 ha questo vettore:

['books','video','photography','food','toothpaste','burgers'] ... ...

La società 2 ha questo vettore:

['video','processor','photography','LCD','power supply', 'books'] ... ...

Supponiamo che questa sia una distribuzione di frequenza (potrei renderla una tupla ma troppo da scrivere).
Come puoi vedere ... questi vettori hanno cose che si sovrappongono. & Quot; Video " e "fotografia" sembra essere "simile" tra due vettori a causa del fatto che si trovano in posizioni simili. E ... " libri " è ovviamente un punto di forza per l'azienda 1. L'ordinamento e il posizionamento sono importanti, poiché si tratta di una distribuzione di frequenza.

Quali algoritmi potresti usare per giocare con questo? Quali algoritmi potresti usare che potrebbero fornire dati preziosi per queste aziende, usando questi vettori?

Sono nuovo nel text mining e nel recupero delle informazioni. Qualcuno potrebbe guidarmi su quegli argomenti in relazione a questa domanda?

È stato utile?

Soluzione

La posizione è molto importante, come sottolinei, quindi la metrica cruciale si baserà sulla differenza di posizioni tra gli stessi elementi nei diversi vettori (puoi, ad esempio, sommare i valori assoluti delle differenze, o il loro piazze). Il grosso problema che deve essere risolto è: quanto pesa un oggetto presente (diciamo che è l'N-esimo) in un vettore e completamente assente nell'altro. È un problema relativamente minore - come se l'articolo mancante fosse effettivamente presente subito dopo quelli reali, per esempio - o un affare davvero, davvero grande? È impossibile dirlo senza una maggiore comprensione dell'area di applicazione effettiva. Puoi provare vari modi per affrontare questo problema e vedere quali risultati danno sui casi di esempio che ti interessano!

Ad esempio, supponi che "un elemento mancante sia approssimativamente lo stesso di se fosse presente, subito dopo quelli reali". Quindi, puoi preelaborare ogni vettore di input in un elemento di mappatura dict da posizionare (ottimizzazione cruciale se devi confrontare molte coppie di vettori di input!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

e quindi, per confrontare due di questi dicts:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(o, abs (d) invece della quadratura nell'ultima istruzione). Per far pesare di più gli oggetti mancanti (crea dicts, cioè vettori, da considerare più lontano), potresti usare il doppio delle lunghezze anziché solo le lunghezze, o qualche grande costante come 100, in un programma altrimenti strutturato in modo simile.

Altri suggerimenti

Ti suggerirei un libro chiamato Programmazione dell'intelligenza collettiva .
È davvero un bel libro su come recuperare informazioni da dati semplici come questo. Sono inclusi esempi di codice (in Python :)

Modifica Sto solo rispondendo a gbjbaanb: questo è Python!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

Dai un'occhiata a Hamming Distance

Come menzionato mbg, la distanza di battuta è un buon inizio. Fondamentalmente sta assegnando una maschera di bit per ogni possibile elemento se è contenuto nel valore dell'azienda.

Eg. il dentifricio è 1 per la società A, ma 0 per la società B. Quindi si contano i bit che differiscono tra le società. Il coefficiente di Jaccard è correlato a questo.

La distanza di Hamming in realtà non sarà in grado di catturare la somiglianza tra cose come "video" e "fotografia". Ovviamente, un'azienda che vende l'una vende anche l'altra con maggiore probabilità rispetto a un'azienda che vende dentifricio.

Per questo, è possibile utilizzare elementi come LSI (utilizzato anche per la riduzione della dimensionalità) o codici fattoriali (ad esempio elementi di reti neurali come Macchine Boltzman limitate, Autoencoder o Minimizzazione della predicibilità) per ottenere rappresentazioni più compatte che è quindi possibile confrontare utilizzando il distanza euclidea.

scegli il grado di ogni voce (il grado più alto è migliore) e fai la somma dei mezzi geometrici tra le partite

per due vettori

sum(sqrt(vector_multiply(x,y)))  //multiply matches

La somma dei ranghi per ciascun valore sul vettore dovrebbe essere uguale per ogni vettore (preferibilmente 1) In questo modo è possibile effettuare confronti tra più di 2 vettori.

Se applichi il metodo di ikkebr puoi scoprire come a è simile a b

in quel caso basta usare

sum( b( b.intersection(a) ))

È possibile utilizzare l'algoritmo set_intersection . I 2 vettori devono essere ordinati per primi (usa la chiamata di ordinamento), quindi passa in 4 iteratori e otterrai una raccolta con gli elementi comuni inseriti al suo interno. Ce ne sono alcuni che funzionano in modo simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top