Quelle est la différence entre HashingTF et CountVectorizer dans Spark?

J'essaie de faire la classification doc dans Spark. Je ne suis pas sûr de ce que fait le hachage dans HashingTF; est-ce qu'il sacrifie une quelconque précision? J'en doute, mais je ne sais pas. L'étincelle doc dit qu'il utilise le "hachage truc"... juste un autre exemple de nom vraiment mauvais/confus utilisé par les ingénieurs (je suis coupable aussi). CountVectorizer exige également de définir la taille du vocabulaire, mais il a un autre paramètre, un paramètre de seuil qui peut être utilisé pour exclure des mots ou des jetons qui apparaissent en dessous d'un certain seuil dans le corpus de textes. Je ne comprends pas la différence entre ces deux Transformateurs. Ce qui rend cette importante est les prochaines étapes de l'algorithme. Par exemple, si je voulais effectuer SVD sur la matrice tfidf résultante, alors la taille du vocabulaire déterminera la taille de la matrice pour SVD, ce qui a une incidence sur la durée de fonctionnement du code, et la performance du modèle, etc. J'ai du mal en général à trouver une source sur Spark Mllib au-delà de la documentation API et des exemples vraiment triviaux sans profondeur.

16
demandé sur Kai 2016-02-04 19:06:53

3 réponses

quelques différences importantes:

  • partiellement réversible (CountVectorizer) vs irréversible (HashingTF) - puisque le hachage n'est pas réversible, vous ne pouvez pas restaurer l'entrée originale à partir d'un vecteur de hachage. D'autre part, le vecteur de comptage avec le modèle (index) peut être utilisé pour restaurer les entrées non ordonnées. Par conséquent, les modèles créés à l'aide d'entrées hachées peuvent être beaucoup plus difficiles à interpréter et à surveiller.
  • mémoire et calcul les frais généraux -HashingTF ne nécessite qu'un seul balayage de données et aucune mémoire supplémentaire au-delà de l'entrée originale et du vecteur. CountVectorizer nécessite un balayage supplémentaire des données pour construire un modèle et une mémoire supplémentaire pour stocker le vocabulaire (index). Dans le cas du modèle de langage unigram, ce n'est généralement pas un problème, mais dans le cas de n-grammes plus élevés, cela peut être prohibitif ou impossible.
  • hachage dépend de une taille du vecteur, fonction de hachage et un document. Comptage dépend de la taille du vecteur, du corpus d'entraînement et d'un document.
  • une source de la perte de l'information - en cas deHashingTF il s'agit d'une réduction dimensionnelle avec collisions possibles. CountVectorizer jette peu de jetons. Comment il affecte en aval des modèles dépend d'un cas d'utilisation particulier et de données.
17
répondu zero323 2016-02-08 16:06:42

selon la documentation Spark 2.1.0,

Hashingtf et CountVectorizer peuvent être utilisés pour générer le terme Vecteurs de fréquence.

HashingTF

HashingTF est un transformateur qui prend des séries de termes et convertit ces ensembles en Vecteurs de caractéristiques de longueur fixe. En traitement de texte, un "des termes" peut-être un sac de mots. HashingTF utilise le hashing trick. Brut la fonctionnalité est mappée dans un index (terme) par l'application d'un hachage fonction. La fonction de hachage utilisée ici est MurmurHash 3. Puis terme les fréquences sont calculées à partir des indices cartographiés. Cette approche évite la nécessité de calculer une carte globale terme-index, qui peut être cher pour un gros corps, mais il souffre de hachage potentiel collisions, où différentes caractéristiques brutes peuvent devenir le même terme après le malaxage.

pour réduire les risques de collision, nous pouvons augmentation de la dimension de la caractéristique cible, c'est-à-dire le nombre de seaux du hachage table. Depuis un simple modulo est utilisé pour transformer la fonction de hachage un index de colonne, il est conseillé d'utiliser une puissance de deux, comme la fonction dimension, sinon les caractéristiques ne seront pas mappées uniformément à la colonne. La dimension de la fonctionnalité par défaut est 2^18=262,144. Un le paramètre optionnel de bascule binaire contrôle les comptes de fréquence des termes. Lorsque mis à true tous les comptes de fréquence non nul sont mis à 1. C'est particulièrement utile pour les modèles probabilistes discrets qui modélisent des, plutôt que de entier, compte.

CountVectorizer

CountVectorizer et CountVectorizerModel visent à aider à convertir un collection de documents textuels aux vecteurs du nombre de jetons. Lorsqu'un le dictionnaire a priori n'est pas disponible, CountVectorizer peut être utilisé comme un Estimateur pour extraire le vocabulaire, et génère un CountVectorizerModel. Le modèle produit des représentations éparses pour les documents vocabulaire, qui peuvent ensuite être transmises à d'autres des algorithmes comme LDA.

pendant le processus d'ajustement, CountVectorizer sélectionnera le haut vocabSize mots ordonnés par fréquence de terme à travers le corpus. Un le paramètre optionnel minDF affecte également le processus de montage par préciser le nombre minimum (ou la fraction si < 1,0) de documents a terme doit figurer dans être inclus dans le vocabulaire. Une autre option binaire bascule paramètre contrôle le vecteur de sortie. Si défini à true, tous les les comptes non nuls sont fixés à 1. Ceci est particulièrement utile pour les discrets les modèles probabilistes qui modélisent binaire, plutôt que entier, compte.

exemple de code

from pyspark.ml.feature import HashingTF, IDF, Tokenizer
from pyspark.ml.feature import CountVectorizer

sentenceData = spark.createDataFrame([
    (0.0, "Hi I heard about Spark"),
    (0.0, "I wish Java could use case classes"),
    (1.0, "Logistic regression models are neat")],
 ["label", "sentence"])

tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
wordsData = tokenizer.transform(sentenceData)

hashingTF = HashingTF(inputCol="words", outputCol="Features", numFeatures=100)
hashingTF_model = hashingTF.transform(wordsData)
print "Out of hashingTF function"
hashingTF_model.select('words',col('Features').alias('Features(vocab_size,[index],[tf])')).show(truncate=False)


# fit a CountVectorizerModel from the corpus.
cv = CountVectorizer(inputCol="words", outputCol="Features", vocabSize=20)

cv_model = cv.fit(wordsData)

cv_result = model.transform(wordsData)
print "Out of CountVectorizer function"
cv_result.select('words',col('Features').alias('Features(vocab_size,[index],[tf])')).show(truncate=False)
print "Vocabulary from CountVectorizerModel is \n" + str(cv_model.vocabulary)

la Sortie est comme ci-dessous

enter image description here

Hachage TF manque le vocabulaire qui est indispensable pour les techniques comme LDA. Pour celui-ci doit utiliser la fonction CountVectorizer. Indépendamment de la taille du vocab, la fonction CountVectorizer estime la fréquence du terme sans aucune approximation impliquée contrairement au HashingTF.

Référence:

https://spark.apache.org/docs/latest/ml-features.html#tf-idf

https://spark.apache.org/docs/latest/ml-features.html#countvectorizer

8
répondu prashanth 2017-02-13 09:03:37

Le hashing trick est en fait l'autre nom de la fonction hashing.

je cite la définition de Wikipédia:

dans l'apprentissage automatique, le hachage de fonction, aussi connu sous le nom de "hashing trick", par analogie avec le "kernel trick", est un moyen rapide et efficace de vectoriser des fonctions, c'est-à-dire de transformer des fonctions arbitraires en indices dans un vecteur ou une matrice. Il fonctionne en appliquant une fonction de hachage aux traits et en utilisant leurs valeurs de hachage comme des indices directement, plutôt que recherche des indices dans un tableau associatif.

Vous pouvez en lire plus à ce sujet dans ce document.

donc en fait pour l'espace efficace fonctions vectorisation.

alors que CountVectorizer effectue juste une extraction de vocabulaire et il se transforme en Vecteurs.

3
répondu eliasah 2016-03-16 07:17:57