2017-10-13 16 views
0

J'ai créé une matrice en utilisant CountVectorizer qui ressemble àConversion sklearn matrice CountVectorizer à la liste des dictionnaires

[[1, 2, 1....], 
[0, 4, 0,...], 
[0, 0, 7....]] 

où chaque colonne correspond à un nom de fonction

['sweet', 'pretty', 'bad'....] 

Ce que je veux faire

Pour convertir les lignes de la matrice en une liste de dictionnaires de la forme

[{'sweet': 1, 'pretty': 2, 'bad': 1 ..} , {'sweet': 0, 'pretty': 4, 'bad': 0 ..} , {'sweet': 0, 'pretty': 0, 'bad': 7 ..}] 

qui est en train de faire essentiellement ce que la fonction inverse_transform de DictVectorizer ferait, mais depuis que je ne l'ai pas créé la matrice du dictionnaire, je ne pense pas que je peux l'utiliser parce que je reçois cette erreur

« DictVectorizer 'l'objet n'a pas d'attribut' feature_names_ '

Comment réaliser ceci? Est-ce que NumPy fournit une fonction intégrée pour convertir le tableau en une liste de dictionnaires où je pourrais mapper chaque colonne à une clé donnée?

+0

aiderait à fournir quelques exemples 'data' – sgDysregulation

Répondre

1

La fonction que vous recherchez est get_feature_names
ne sais pas s'il y a un moyen builtin pour obtenir ce que vous voulez, mais il est esily réalisable avec une carte simple

from sklearn.feature_extraction.text import CountVectorizer 
cv = CountVectorizer() 

#`data` is an array of strings 

tdata = cv.fit_transform(data) 

ft = cv.get_feature_names() 

#create a dictionary with feature names as keys and row elements as values 

result = list(map(lambda row:dict(zip(ft,row)),tdata.toarray())) 

Edit: solution économique mémoire

import pandas as pd 

df = pd.SparseDataFrame(tdata, columns=ft) 
+0

La dernière ligne était ce que je cherchais merci. Cependant, je travaille sur un fichier texte avec plus de millions de lignes, donc cela me donne une erreur de mémoire avec ça. Je pense qu'il pourrait être efficace si je pouvais convertir le tableau en pandas DataFrame, il a une méthode intégrée pour le faire mais je reçois "constructeur DataFrame pas correctement appelé!" quand je fais DataFrame (data = X, colonnes = ft) –

+0

vous pouvez utiliser quelque chose comme 'df = pd.DataFrame (tdata.toarray(), colonnes = ft)' – sgDysregulation

+0

ou mieux encore, une trame de données fragmentée 'df = pd. SparseDataFrame (tdata, columns = ft) ' – sgDysregulation