2015-12-10 1 views
2

J'essaie d'utiliser une simple application sur une trame pleine de données. Ceci est pour une simple transformation de données sur l'une des colonnes appliquant une fonction qui prend une entrée de texte et la divise en une liste. Voici la fonction et son appel/sortie:Utilisation de sframe.apply() provoquant une erreur d'exécution

In [1]: def count_words(txt): 
      count = Counter() 
      for word in txt.split(): 
       count[word]+=1 
      return count 

    In [2]: products.apply(lambda x: count_words(x['review'])) 

    --------------------------------------------------------------------------- 
RuntimeError        Traceback (most recent call last) 
<ipython-input-8-85338326302c> in <module>() 
----> 1 products.apply(lambda x: count_words(x['review'])) 

C:\Anaconda3\envs\dato-env\lib\site-packages\graphlab\data_structures\sframe.pyc in apply(self, fn, dtype, seed) 
    2607 
    2608   with cython_context(): 
-> 2609    return SArray(_proxy=self.__proxy__.transform(fn, dtype, seed)) 
    2610 
    2611  def flat_map(self, column_names, fn, column_types='auto', seed=None): 

C:\Anaconda3\envs\dato-env\lib\site-packages\graphlab\cython\context.pyc in __exit__(self, exc_type, exc_value, traceback) 
    47    if not self.show_cython_trace: 
    48     # To hide cython trace, we re-raise from here 
---> 49     raise exc_type(exc_value) 
    50    else: 
    51     # To show the full trace, we do nothing and let exception propagate 

RuntimeError: Runtime Exception. Unable to evaluate lambdas. Lambda workers did not start. 

Lorsque j'exécute mon code, j'obtiens cette erreur. Le cadre s (df) est seulement de 10 par 2 donc il ne devrait y avoir aucune surcharge venant de là. Je ne sais pas comment résoudre ce problème.

+0

Ne voulez-vous pas 'produits ['review']. Apply (count_words)'? – EdChum

+0

J'ai eu la même erreur d'exécution avec Graphlab 2.1. J'ai ensuite réexécuté mon bloc de code et il a exécuté sans erreur. Je ne sais pas pourquoi, mais cela pourrait valoir la peine d'essayer pour quelqu'un d'autre ayant la même erreur. – garbo999

Répondre

2

Pour tous ceux qui ont rencontré ce problème lors de l'utilisation graphlab ici est le fil de discussion sur la question du soutien de Dato:

http://forum.dato.com/discussion/1499/graphlab-create-using-anaconda-ipython-notebook-lambda-workers-did-not-start

est le code ici qui peut être exécuté pour fournir au cas par cas pour cette question.

Après avoir démarré ipython ou ipython portable dans l'environnement Dato/Graphlab, mais avant d'importer graphlab, copiez et exécutez le code suivant

import ctypes, inspect, os, graphlab 
from ctypes import wintypes 
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) 
kernel32.SetDllDirectoryW.argtypes = (wintypes.LPCWSTR,) 
src_dir = os.path.split(inspect.getfile(graphlab))[0] 
kernel32.SetDllDirectoryW(src_dir) 

# Should work 
graphlab.SArray(range(1000)).apply(lambda x: x) 

Si cela fonctionne, la fonction appliquer devrait fonctionner correctement avec sframe.

1

Si vous utilisez GraphLab Create, il existe en fait un outil intégré pour cela, dans la boîte à outils "analyse de texte". Disons que j'ai données comme:

import graphlab 
products = graphlab.SFrame({'review': ['a portrait of the artist as a young man', 
             'the sound and the fury']}) 

La meilleure façon de compter les mots dans chaque entrée est

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

Si vous utilisez le paquet sframe par lui-même, ou si vous voulez faire une fonction personnalisée comme celle que vous avez décrite, je pense que la pièce clé manquante dans votre code est que le compteur doit être converti en un dictionnaire afin que SFrame gère la sortie.

from collections import Counter 

def count_words(txt): 
    count = Counter() 
    for word in txt.split(): 
     count[word] += 1 
    return dict(count) 

products['counts'] = products.apply(lambda x: count_words(x['review'])) 
+0

Je reçois toujours une erreur d'exécution quand je retourne 'dict (count)' et je vous remercie j'étais au courant de 'thegraphlab.text_analytics' mais je voulais utiliser ma propre solution qui ne fonctionne pas trop bien. – rgalbo