2016-07-06 1 views
0

Я работаю с Vader из пакета nltk. Я импортировал свой набор данных следуя Вейдер учебник:AttributeError: объект 'list' не имеет атрибута 'text'

list = [] 
    for line in open("C:\Users\Luca\Desktop\Uni\Tesi\PythonTest\paolo.txt","r").readlines(): 
     for value in line.split(","): 
      list.append(value) 

Затем я создал функцию, чтобы удалить знаки препинания:

 def _words_only(self): 
    text_mod = REGEX_REMOVE_PUNCTUATION.sub('', self.text) 
    words_only = text_mod.split() 
    words_only = [word for word in words_only if len(word) > 1] 
    return words_only 

Но когда я пытаюсь использовать «только слова» функция I получить эту ошибку

AttributeError       Traceback (most recent call last) 
    <ipython-input-14-cbc12179c890> in <module>() 
    ----> 1 _words_only(list) 

    <ipython-input-13-68a545bbbaa4> in _words_only(self) 
    1 def _words_only(self): 
    ----> 2  text_mod = REGEX_REMOVE_PUNCTUATION.sub('', self.text) 
     3  words_only = text_mod.split() 


    AttributeError: 'list' object has no attribute 'text' 

Я действительно новичок в Python. Это проблема в процессе импорта или это что-то еще? Спасибо за вашу помощь.

+0

Можете ли вы поделиться своим классом? Вы отправляете список в качестве аргумента своей функции words_only. Я думаю, вы должны отправить строку, не указанную здесь. –

+0

Является ли '_words_only' частью класса? –

ответ

1

Вы не указали, где/как вы создали функцию _words_only(), но аргумент self указывает, что вы нарисовали его по шаблону методом класса. Вы, очевидно, используя его в качестве автономной функции, например:

_words_only(list) 

Я бы посоветовал вам не решать классы еще, если вы можете избежать этого. Напишите функцию, как это:

def words_only(text): 
    text_mod = REGEX_REMOVE_PUNCTUATION.sub('', text) 
    words_only = text_mod.split() 
    words_only = [word for word in words_only if len(word) > 1] 
    return words_only 

Вы также должны знать, что ваша функция предназначена для обработки один строку, а не список из них. Кроме того, не используйте встроенные имена, такие как list, как имена переменных - вы просите за очень запутанную ошибку через день или два. Используйте более информативное название, или аббревиатуру как lst:

lines = [] 
... 

some_words = words_only(lines[0]) 

Поскольку вы на самом деле хотите работать со списком строк, применять пересмотренную функцию к каждому, как это:

filtered_lines = [ words_only(line) for line in lines ] 

Если вы хотел бы работать со всем содержимым файла, вы бы прочитали в своем тексте вот так:

myfile = open(r"C:\Users\Luca\Desktop\Uni\Tesi\PythonTest\paolo.txt","r") 
text = myfile.read() 
myfile.close() 
some_words = words_only(text) 
+0

Функция работает очень хорошо! Но мой набор данных - это список твитов, и если я использую процесс импорта, который вы предложили в результате, у меня есть только один большой список слов. Я хотел бы оставить чириканье разделенным, а затем очистить каждый из них. Использование моего процесса импорта, а затем цикл for в сочетании с функцией words_only может быть решением? –

+0

Легко, теперь, когда я знаю, что вам нужно! Отредактировал ответ. – alexis

+0

Хорошо, он отлично работает! Спасибо! –