运行python类的NameError问题

时间:2018-03-22 08:13:08

标签: python

这是一个具有两个函数的类,试图使用类中返回NameError消息的函数。我在后处理函数上调用了tokenize函数,在我的代码行上看起来像“self.data ['review_text']。progress_map(tokenize)”但它返回了一个名称错误消息。

class preprocess(): 
    df = data
    def tokenize(tweet):
        try:

            token = unicodedata.normalize("NFKD", 
            tweet).encode("ascii", 
            "ignore").decode("utf8")  # converts 'ueber' to 'uber'
            token = re.sub('\ |\?|\.|\!|\/|\;|\:|\<|\>|\+|\$|\*|\)|\
            (|\&|\=|\%|\-|\'|\"|\%{', ' ', token)# Lets pass only 
            meaningful characters 
            if '\n\n' in token:# remove header
            token = token[token.index('\n\n'):]

            token = re.sub(r'([^a-zA-Z0-9 \-\_%])', '', tweet)# Lets 
            pass 
            only meaningful characters
            token = re.sub(r'((\.\s*){2,})', '', token)# removes 
            multiple 
            dots with optional whitespaces in between
            token = re.sub(r'(\s{2,})', ' ', token) # Removes multiple 
            whitespaces
            token = token.lower()# lower cases everything
            #token = re.sub(r'(?<=\s)[\w?!%,.;:\/]{1,3}(?=\s|\Z)', '', 
            token)# removes tokens shorter than minLen
            token = re.sub(r'\b(?!(\D\S*|[12][0-9]{3})\b)\S+\b', '', 
            token) # removes all digits except digits that represent 
            years
            token = re.sub(r'<.*?>', '', token)# remove html
            token = re.sub(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-
            9-.]+', '', token)# remove email addresses
            token = re.sub(r'["\']', '', token )# remove quotes
            token = token.replace('\n', ' ')# replace newlines

            tokens = tokenizer.tokenize(token)


            return tokens
        except:
            return 'NC'


def postprocess(self):
    self.data = self.df.head(58)
    self.data['tokens'] = 
    self.data['review_text'].progress_map(tokenize)  ## progress_map 
    is a variant of the map function plus a progress bar. Handy to 
    monitor DataFrame creations.
    self.data = self.data[self.data.tokens != 'NC']
    self.data.reset_index(inplace=True)
    self.data.drop('index', inplace=True, axis=1)

    self.data.drop(['review_text'],inplace=True, axis=1)
    return self.data
我正在调用这个函数  hei = preprocess()  数据= hei.postprocess()

错误消息:

NameError                                 Traceback (most recent call 
last)
<ipython-input-48-0806f2cc8d73> in <module>()
      1 hei = preprocess()
----> 2 data=hei.postprocess()
      3 

<ipython-input-47-57d07abbfeec> in postprocess(self)
     30     def postprocess(self):
     31         self.data = self.df.head(58)
---> 32         self.data['tokens'] = 
self.data['review_text'].progress_map(tokenize)  ## progress_map is a 
variant of the map function plus a progress bar. Handy to monitor 
DataFrame creations.
     33         self.data = self.data[self.data.tokens != 'NC']
     34         self.data.reset_index(inplace=True)

NameError:名称'tokenize'未定义

1 个答案:

答案 0 :(得分:1)

我不确定你在哪里遇到错误(你没有提到它)但我认为它在这里:

train_vecs_w2v = np.concatenate([buildWordVector(z, n_dim) for z in tqdm(map(lambda x: x.words, x_train))])

你就像那样调用buildWordVector - 这似乎是问题,因为函数buildWordVector是一个类,应该这样调用:

classinstance=wordvector()
classinstance.buildWordVector(args)

你应该试试。希望我帮助(如果仍然有疑问,评论)

示例(不完整代码时不完美):

c=wordvector()
train_vecs_w2v = np.concentrate([c.buildWordVector(z, n_dim) for z in tqdm(map(lambda x: x.words, x_train))])

编辑: 你说你需要帮助从类的另一个函数运行类的函数。假设你有一个类似的课程:

class testClass():
    def spam(self):
        print('eggs')

所以说你想在调用spam()的类中创建一个函数foo()。你必须确保在定义spam()时,它(以及调用它的函数)具有魔法自变量(垃圾邮件(自我))。然后,要从另一个函数调用它,你所要做的就是self.spam(),它将被调用。这就是我所说的:

class testClass():
    def spam(self):
        print('eggs')

    def foo(self):
        self.spam()

另外,参数:

class testClass():
    def spam(self,text):
        print(text)

    def foo(self):
        self.spam('eggs')

所以,这就是你如何做到的。但是,由于这种神奇的自变量,你必须以不同的方式调用类中的函数 - 首先创建一个testClass()的实例。怎么做:

假设你已经上课了。首先,创建一个类的实例。

testClassInstance = testClass()

然后使用 testClassInstance调用函数,如下所示:

testClassInstance.foo()

result: eggs

所以这就是你如何做到的,希望你理解。如果仍有疑问,请发表评论。