IDF incrementale (frequenza inversa dei documenti)


11

In un'applicazione di mining di testo, un approccio semplice consiste nell'utilizzare l' euristica per creare vettori come rappresentazioni sparse e compatte dei documenti. Questo va bene per l'impostazione batch, in cui l'intero corpus è noto a priori, poiché l' richiede l'intero corpusi d ftfidfidf

idf(t)=log|D||{d:td}|

dove è un termine, è un documento, è il corpus del documento e (non mostrato) è il dizionario.d D TtdDT

Tuttavia in genere nuovi documenti vengono ricevuti nel tempo. Un'opzione è continuare a utilizzare l' esistente fino a quando non viene ricevuto un certo numero di nuovi documenti e ricalcolarlo. Tuttavia, questo sembra piuttosto inefficiente. Qualcuno sa di uno schema di aggiornamento incrementale che (possibilmente approssimativamente) converge al valore se tutti i dati sono stati visti in anticipo? O in alternativa esiste un'altra misura che cattura la stessa nozione ma può essere calcolata in modo incrementale?idf

C'è anche una domanda correlata se l' rimane una buona misura nel tempo. Poiché l'idf acquisisce la nozione della frequenza delle parole corpus, è concepibile che i documenti più vecchi nel corpus (diciamo ad esempio che il mio corpus includa oltre 100 anni di articoli di giornale), poiché le frequenze di parole diverse cambiano nel tempo. In questo caso potrebbe essere sensato eliminare documenti più vecchi quando ne arrivano di nuovi, in effetti usando un finestra scorrevole . Concepibilmente, si potrebbero anche memorizzare tutti i precedenti vettori mentre vengono calcolati quelli nuovi, e quindi se volessimo recuperare i documenti dal 1920-1930, potremmo usare l' calcolato dai documenti in quell'intervallo di date. Questo approccio ha senso?i d f i d f i d fidfidfidfidf

Edit: V'è una questione separata ma collegata sul dizionario . Con il passare del tempo, ci saranno nuovi termini del dizionario che non sono apparsi prima, quindidovrà crescere, e quindi la lunghezza del vettore . Sembra che questo non sia un problema, poiché gli zeri potrebbero essere aggiunti ai vecchi vettori di .| T | i d f i d fT|T|idfidf


domanda stupida: è un problema memorizzare il denominatore per ogni t? Come funziona il rapporto di | t | a | d | sembra (in generale)?
Steffen,

Scusate forse l'equazione non è chiara - è la frequenza inversa del documento del termine t, piuttosto che al momento t . Quindi al momento t avresti un vettore di lunghezza, ovvero la dimensione del dizionario (che può anche cambiare). Apporterò modifiche in tal senso. idf(t)tt|T|
TCD,

1
Ho capito l'equazione. La mia domanda era: se la memorizzazione del dizionario non è un problema, allora: Invece di memorizzare | T | idfs one stores | T | denominatori (dell'equazione) + numero di documenti. L'aggiornamento incrementale non è quindi un problema e l'idf viene calcolato al volo. Ho la sensazione di aver trascurato qualcosa.
Steffen,

Quindi intendi qualcosa di simile, dato un nuovo documento , se abbiamo il valore d : t d , aggiungiamo semplicemente uno al denominatore per t : t d dd:tdt:td
tdc

precisamente. Se questo è fattibile?
Steffen,

Risposte:


6

Ok, grazie a Steffen per i commenti utili. Immagino che la risposta sia abbastanza semplice alla fine. Come dice, tutto ciò che dobbiamo fare è memorizzare l'attuale denominatore (chiamalo ):z

z(t)=|{d:td}|

Ora dato un nuovo documento , aggiorniamo il denominatore semplicemente:d

z(t)=z(t)+{1iftd0otherwise

tfidfidf

Allo stesso modo per rimuovere un vecchio documento, decrementiamo il numeratore in modo simile.

tftfidftfidf

idfzzidftf

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.