J'ai cinq fichiers texte que je saisis dans un CountVectorizer. Lorsque vous spécifiez min_df et max_df dans l'instance CountVectorizer, que signifie exactement la fréquence de document min/max? Est-ce la fréquence d'un mot dans son fichier texte ou est-ce la fréquence du mot dans l'ensemble du corpus (5 fichiers txt)?
En quoi est-ce différent quand min_df et max_df sont fournis sous forme d'entiers ou de flottants?
La documentation ne semble pas fournir une explication détaillée, pas plus qu’un exemple permettant de démontrer l’utilisation de min_df et/ou max_df. Quelqu'un pourrait-il fournir une explication ou un exemple illustrant min_df ou max_df.
max_df
est utilisé pour supprimer les termes qui apparaissent trop fréquemment, également appelés "mots vides spécifiques à un corpus". Par exemple:
max_df = 0.50
_ signifie "ignorer les termes qui apparaissent dans plus de 50% des documents".max_df = 25
_ signifie "ignorer les termes qui apparaissent dans plus de 25 documents".Le défaut max_df
est 1.0
, qui signifie "ignorer les termes qui apparaissent dans plus de 100% des documents". Ainsi, le paramètre par défaut n’ignore aucun terme.
min_df
est utilisé pour supprimer les termes qui apparaissent trop rarement. Par exemple:
min_df = 0.01
_ signifie "ignorer les termes qui apparaissent dans moins de 1% des documents".min_df = 5
_ signifie "ignorer les termes qui apparaissent dans moins de 5 documents".Le défaut min_df
est 1
, ce qui signifie "ignorer les termes qui apparaissent dans moins de 1 document". Ainsi, le paramètre par défaut n’ignore aucun terme.
Selon la CountVectorizer
documentation ici .
Lors de l'utilisation d'un float dans la plage [0.0, 1.0]
, Ils font référence à la fréquence du document . C'est le pourcentage de documents qui contiennent le terme.
Lorsque vous utilisez un int, il fait référence au nombre absolu de documents contenant ce terme.
Prenons l'exemple où vous avez 5 fichiers texte (ou documents). Si vous définissez max_df = 0.6
, Cela se traduira par des documents 0.6*5=3
. Si vous définissez max_df = 2
, Cela se traduirait simplement en 2 documents.
L'exemple de code source ci-dessous est copié de Github here et montre comment le max_doc_count
Est construit à partir du max_df
. Le code pour min_df
Est similaire et se trouve sur la page GH.
max_doc_count = (max_df
if isinstance(max_df, numbers.Integral)
else max_df * n_doc)
Les valeurs par défaut pour min_df
Et max_df
Sont 1 et 1,0, respectivement. Cela signifie fondamentalement "Si mon terme se trouve dans un seul document, il est ignoré. De même, s'il est trouvé dans tous les documents (100% ou 1.0), il est ignoré."
max_df
Et min_df
Sont tous deux utilisés en interne pour calculer max_doc_count
Et min_doc_count
, Le nombre maximal et minimal de documents dans lesquels un terme doit être trouvé. puis passé à self._limit_features
en tant que mot clé arguments high
et low
respectivement, la docstring pour self._limit_features
est
"""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.
"""
Les valeurs par défaut pour min_df et max_df sont 1 et 1.0, respectivement. Ces valeurs par défaut ne font vraiment rien du tout.
Cela étant dit, je pense que la réponse actuellement acceptée par @Ffisegydd n'est pas tout à fait correcte.
Par exemple, exécutez ceci en utilisant les valeurs par défaut, pour voir cela quand min_df=1
et max_df=1.0
, puis
1) tous les jetons apparaissant dans au moins un document sont utilisés (par exemple, tous les jetons!)
2) tous les jetons apparaissant dans tous les documents sont utilisés (nous allons tester avec un seul candidat: partout).
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_
On a:
[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([])
Tous les jetons sont conservés. Il n'y a pas de mots vides.
La discussion avec les arguments clarifiera les autres configurations.
Pour le plaisir et la perspicacité, je vous recommande également de jouer avec stop_words = 'english'
et voyant que, singulièrement, tous les mots sauf "sept" sont supprimés! Y compris "partout".
J'ajouterais ce point également pour comprendre min_df
et max_df
dans tf-idf mieux.
Si vous choisissez les valeurs par défaut, c'est-à-dire que vous tenez compte de tous les termes, vous avez généré nettement plus de jetons. Ainsi, votre processus de regroupement (ou toute autre chose que vous voulez faire avec ces termes plus tard) prendra plus de temps.
MAIS la qualité de votre clustering ne devrait pas être réduite.
On pourrait penser que le fait d’autoriser la présence de tous les termes (par exemple, des termes trop fréquents ou des mots vides) peut réduire la qualité, mais pas dans tf-idf. Parce que la mesure de tf-idf donnera instinctivement un score faible à ces termes, ce qui les rendra effectivement sans influence (comme ils apparaissent dans de nombreux documents).
Donc, pour résumer, élaguer les termes via min_df
et max_df
consiste à améliorer les performances, pas la qualité des grappes (à titre d'exemple).
Et le point crucial est que si vous définissez mal min
et max
, vous perdriez des termes importants et réduiriez donc la qualité. Par conséquent, si vous n'êtes pas sûr du bon seuil (cela dépend de votre jeu de documents), ou si vous êtes certain des capacités de traitement de votre machine, laissez les paramètres min
, max
.