17

Sto provando a costruire un classificatore NaiveBayes con MLLib di Spark che prende come input un insieme di documenti.apache spark MLLib: come creare punti etichettati per le caratteristiche delle stringhe?

mi piacerebbe mettere alcune cose come caratteristiche (cioè autori, etichette esplicite, parole chiave impliciti, di categoria), ma guardando the documentation sembra che un LabeledPoint contiene solo raddoppia, cioè sembra LabeledPoint[Double, List[Pair[Double,Double]].

Invece quello che ho come output dal resto del mio codice sarebbe qualcosa di simile LabeledPoint[Double, List[Pair[String,Double]].

ho potuto fare la mia propria conversione, ma sembra strano. Come dovrei gestirlo usando MLLib?

Credo che la risposta sia nella classe HashingTF (ovvero le funzioni di hashing) ma non capisco come funzioni, sembra che occorra una sorta di valore di capacità, ma il mio elenco di parole chiave e argomenti è effettivamente illimitato (o meglio, sconosciuto all'inizio).

risposta

10

HashingTF utilizza il hashing trick per associare un numero potenzialmente illimitato di funzioni a un vettore di dimensioni limitate. Esiste la possibilità di collisioni tra funzionalità, ma ciò può essere ridotto scegliendo un numero maggiore di funzioni nel costruttore.

Al fine di creare funzioni in base non solo il contenuto di una caratteristica, ma anche alcuni metadati (ad esempio avere un tag di 'Cats' invece di avere la parola 'Cats' nel documento) si potrebbe sfamare la classe HashingTF qualcosa come "tag: cats" in modo tale che un tag con una parola sarebbe hash in una slot diversa dalla sola parola.

Se hai creato vettori di feature di conteggio utilizzando HashingTF si possono usare per creare sacco di parole caratteristiche impostando eventuali conteggi sopra lo zero a 1. È inoltre possibile creare vettori TF-IDF utilizzando la classe IDF in questo modo:

val tfIdf = new IDF().fit(featureCounts).transform(featureCounts) 

Nel tuo caso sembra che hai già calcolato il conteggio delle parole per documento. Questo non funzionerà con la classe HashingTF poiché è progettato per eseguire il conteggio per te.

This paper ha alcuni argomenti circa il motivo per cui sono dotate le collisioni non sono molto di un problema nelle applicazioni linguistiche. Le ragioni principali sono che la maggior parte delle parole non sono comuni (a causa delle proprietà dei linguaggi) e che le collisioni sono indipendenti dalle frequenze delle parole (a causa delle proprietà di hashing), quindi è improbabile che le parole che sono abbastanza comuni da aiutare con i propri modelli stesso slot.

+0

grazie, solo un chiarimento in più: se ho capito bene, 'numFeatures' in' HashingTF' è fondamentalmente utilizzato come valore di 'mod' utilizzato per legata al numero di caratteristiche per una data massima? Se è così, non dovrebbe essere semplicemente 'Double.MAX_VALUE'? O è l'idea di usarlo in modo che, ad esempio, possa limitare le diverse caratteristiche a determinati intervalli e limitare le collisioni incrociate? (cioè metti qualche tipo di funzionalità in 1..N e qualche altro in N..2N, avresti delle collisioni dello stesso tipo ma non di tipo incrociato) – riffraff

+0

Sì, il calcolo è simile a 'caratteristiche [hash (funzionalità) % numCaratteristiche] + = 1'. I vettori che vengono creati di solito vengono utilizzati come input per alcuni modelli, quindi usare 'Double.MAX_VALUE' implicherebbe un modello gigantesco. Una delle principali motivazioni del trucco di hashing è la riduzione della memoria. Certamente potresti creare caratteristiche nel modo in cui stai suggerendo, ma non sono sicuro di come valutare i vantaggi di un simile approccio. – mrmcgreg

+0

ah ovviamente, stavo pensando a vettori sparse quindi non ho considerato la dimensione dell'array. Grazie per l'aiuto! – riffraff

Problemi correlati