2016-01-30 2 views
0

J'ai importé mon jeu de données avec sframe:Graphlab: Comment éviter de dupliquer manuellement des fonctions qui n'ont qu'une variable de chaîne différente?

products = graphlab.SFrame('amazon_baby.gl') 
products['word_count'] = graphlab.text_analytics.count_words(products['review']) 

Je voudrais faire l'analyse des sentiments sur un ensemble de mots ci-dessous:

selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate'] 

Je voudrais créer une nouvelle colonne pour chacun des les mots sélectionnés dans la matrice de produits et l'entrée est le nombre de fois tel mot se produit, de sorte que je crée une fonction pour le mot « extraordinaire »:

def awesome_count(word_count): 
    if 'awesome' in product: 
     return product['awesome'] 
    else: 
     return 0; 

products['awesome'] = products['word_count'].apply(awesome_count) 

si f ar si bon, mais je dois créer manuellement d'autres fonctions pour chacun des mots sélectionnés de cette manière, par exemple, great_count, etc. Comment éviter cet effort manuel et écrire un code plus propre?

Répondre

0

Je trouve réellement un moyen plus facile ne le faire:

def wordCount_select(wc,selectedWord): 
    if selectedWord in wc: 
     return wc[selectedWord] 
    else: 
     return 0  


for word in selected_words: 
    products[word] = products['word_count'].apply(lambda wc: wordCount_select(wc, word)) 
0

Je pense que la commande SFrame.unpack devrait faire l'affaire. En fait, le paramètre limit acceptera votre liste de mots sélectionnés et ne conservera que ces résultats, de sorte que cette partie sera grandement simplifiée.

Je ne sais pas exactement ce qu'il ya dans vos données critiques, donc je fait un exemple de jouet:

# Create the data and convert to bag-of-words. 
import graphlab 
products = graphlab.SFrame({'review':['this book is awesome', 
             'I hate this book']}) 

products['word_count'] = \ 
    graphlab.text_analytics.count_words(products['review']) 

# Unpack the bag-of-words into separate columns. 
selected_words = ['awesome', 'hate'] 
products2 = products.unpack('word_count', limit=selected_words) 


# Fill in zeros for the missing values. 
for word in selected_words: 
    col_name = 'word_count.{}'.format(word) 
    products2[col_name] = products2[col_name].fillna(value=0) 

Je ne peux pas me empêcher de souligner que GraphLab Créer n'a its own sentiment analysis toolkit, ce qui pourrait être utile vérifier.

+0

Nous vous remercions de l'aide. Je passe un peu de temps et trouve un moyen plus facile d'appliquer et lamda. – drdot

+0

Désolé, je ne comprends pas très bien. Cherchez-vous une réponse qui utilise 'apply 'au lieu de' unpack'? – papayawarrior

+1

Je pense que l'utilisation d'appliquer semble plus propre que d'utiliser "unpack", "format" et "fillna" méthode. N'hésitez pas à jeter des opinions différentes. – drdot