2014-12-29 5 views
15

Ho cinque file di testo che inserisco in un CountVectorizer. Quando si specifica min_df e max_df sull'istanza CountVectorizer, cosa significa esattamente la frequenza minima/massima del documento? È la frequenza di una parola nel suo particolare file di testo o è la frequenza della parola nell'intero corpus generale (5 file txt)?Informazioni su min_df e max_df in scikit CountVectorizer

In che modo è diverso quando min_df e max_df vengono forniti come numeri interi o come float?

La documentazione non sembra fornire una spiegazione approfondita né fornisce un esempio per dimostrare l'uso di min_df e/o max_df. Qualcuno potrebbe fornire una spiegazione o un esempio che dimostri min_df o max_df.

risposta

63

max_df viene utilizzato per la rimozione di termini che appaiono troppo spesso, noto anche come "parole di arresto specifiche per il corpus". Per esempio:

  • max_df = 0.50 significa "ignora termini che compaiono nei oltre il 50% dei documenti".
  • max_df = 25 significa "ignorare i termini visualizzati in più di 25 documenti".

Il valore di default è max_df1.0, che significa "ignora termini che compaiono nei oltre il 100% dei documenti". Pertanto, l'impostazione predefinita non ignora alcun termine.


min_df viene utilizzato per la rimozione di termini che compaiono troppo raramente. Per esempio:

  • min_df = 0.01 significa "ignora termini che compaiono nei meno dell'1% dei documenti".
  • min_df = 5 significa "ignorare i termini visualizzati in meno di 5 documenti".

Il predefinito min_df è 1, che significa "ignora termini che compaiono nei meno di 1 documento". Pertanto, l'impostazione predefinita non ignora alcun termine.

11

Come da documentazione CountVectorizerhere.

Quando si utilizza un galleggiante nell'intervallo [0.0, 1.0] si riferiscono alla frequenza documento. Questa è la percentuale di documenti che contengono il termine.

Quando si utilizza un numero intero, si riferisce al numero assoluto di documenti che contengono questo termine.

Considerare l'esempio in cui si dispone di 5 file di testo (o documenti). Se si imposta max_df = 0.6, ciò si tradurrebbe in documenti 0.6*5=3. Se imposti max_df = 2, ciò si tradurrebbe semplicemente in 2 documenti.

L'esempio di codice sorgente riportato di seguito viene copiato da Github here e mostra come max_doc_count è stato creato da max_df. Il codice per min_df è simile e può essere trovato sulla pagina GH.

max_doc_count = (max_df 
       if isinstance(max_df, numbers.Integral) 
       else max_df * n_doc) 

I default per min_df e max_df sono 1 e 1,0, rispettivamente. Questo in pratica dice "Se il mio termine si trova in un solo documento, viene ignorato, analogamente se viene trovato in tutti i documenti (100% o 1.0), viene ignorato."

max_df e min_df sono entrambi utilizzati internamente per calcolare max_doc_count e min_doc_count, il numero massimo e minimo di documenti che un termine deve essere trovata. Questo viene quindi passato self._limit_features come argomenti a parola chiave high e low rispettivamente, il docstring per self._limit_features è

"""Remove too rare or too common features. 

Prune features that are non zero in more samples than high or less 
documents than low, modifying the vocabulary, and restricting it to 
at most the limit most frequent. 

This does not prune samples with zero features. 
""" 
+2

Questo è confuso. La documentazione di 'min_df' dice 'ignora i termini che hanno una frequenza del documento ** strettamente inferiore ** rispetto alla soglia indicata.' Quindi la frequenza strettamente inferiore al valore predefinito di 1 significherebbe ignorare termini che non appaiono mai (!) Ma mantenere termini che appaiono una volta. –

+0

@MonicaHeddneck è corretto. Questa risposta interpreta erroneamente i significati precisi di 'min_df' e' max_df'. Ho aggiunto una risposta che spiega esattamente come questi parametri sono interpretati da CountVectorizer. –

2

I default per min_df e max_df sono 1 e 1,0, rispettivamente. Queste impostazioni predefinite in realtà non fanno nulla.

Detto questo, credo che la risposta attualmente accettata dalla risposta di @Ffisegydd non sia del tutto corretta.

Ad esempio, eseguire questa operazione utilizzando le impostazioni predefinite, vedere che quando min_df=1 e max_df=1.0, quindi

1) tutti i gettoni che appaiono in almeno un documento vengono utilizzati (ad esempio, tutti i gettoni!)

2) vengono utilizzati tutti i token visualizzati in tutti i documenti (testeremo con un candidato: ovunque).

cv = CountVectorizer(min_df=1, max_df=1.0, lowercase=True) 
# here is just a simple list of 3 documents. 
corpus = ['one two three everywhere', 'four five six everywhere', 'seven eight nine everywhere'] 
# below we call fit_transform on the corpus and get the feature names. 
X = cv.fit_transform(corpus) 
vocab = cv.get_feature_names() 
print vocab 
print X.toarray() 
print cv.stop_words_ 

otteniamo:

[u'eight', u'everywhere', u'five', u'four', u'nine', u'one', u'seven', u'six', u'three', u'two'] 
[[0 1 0 0 0 1 0 0 1 1] 
[0 1 1 1 0 0 0 1 0 0] 
[1 1 0 0 1 0 1 0 0 0]] 
set([]) 

Tutti i gettoni sono conservati. Non ci sono stopwords.

Ulteriori trucchetti con gli argomenti chiariranno altre configurazioni.

Per divertimento e intuizione, consiglierei anche di giocare con stop_words = 'english' e visto che, in particolare, tutte le parole tranne "sette" vengono rimosse! Compreso "ovunque".

0

Vorrei aggiungere questo punto anche per comprendere min_df e max_df in tf-idf meglio.

Se si utilizzano i valori predefiniti, ovvero considerando tutti i termini, sono stati generati sicuramente più token. Quindi il tuo processo di clustering (o qualsiasi altra cosa che vuoi fare con questi termini più tardi) richiederà più tempo.

MA la qualità del clustering NON deve essere ridotta.

Si potrebbe pensare che consentire la presenza di tutti i termini (ad esempio termini troppo frequenti o parole di arresto) possa ridurre la qualità ma in tf-idf non lo è. Poiché la misurazione di tf-idf fornirà un punteggio basso a quei termini, rendendoli effettivamente non influenti (come appaiono in molti documenti).

Quindi, per riassumere, l'eliminazione dei termini tramite min_df e max_df consiste nel migliorare le prestazioni, non la qualità dei cluster (ad esempio).

E il punto cruciale è che se si impostano min e max in modo errato, si perderebbero alcuni termini importanti e quindi si abbasserebbe la qualità. Pertanto, se non si è sicuri della soglia corretta (dipende dal set di documenti) o se si è certi delle capacità di elaborazione della macchina, lasciare invariati i parametri min, max.

Problemi correlati