2013-04-17 2 views
-2

Я пытаюсь сделать чистое действие DOC удалить стоп-слова, пос мечение и вытекающий ниже мой кодPython AttributeError: «Кортеж» объект не имеет атрибута «ниже»

def cleanDoc(doc): 
    stopset = set(stopwords.words('english')) 
    stemmer = nltk.PorterStemmer() 
    #Remove punctuation,convert lower case and split into seperate words 
    tokens = re.findall(r"<a.*?/a>|<[^\>]*>|[\w'@#]+", doc.lower() ,flags = re.UNICODE | re.LOCALE) 
    #Remove stopwords and words < 2 
    clean = [token for token in tokens if token not in stopset and len(token) > 2] 
    #POS Tagging 
    pos = nltk.pos_tag(clean) 
    #Stemming 
    final = [stemmer.stem(word) for word in pos] 
    return final 

Я получил эту ошибку:

Traceback (most recent call last): 
    File "C:\Users\USer\Desktop\tutorial\main.py", line 38, in <module> 
    final = cleanDoc(doc) 
    File "C:\Users\USer\Desktop\tutorial\main.py", line 30, in cleanDoc 
    final = [stemmer.stem(word) for word in pos] 
    File "C:\Python27\lib\site-packages\nltk\stem\porter.py", line 556, in stem 
    stem = self.stem_word(word.lower(), 0, len(word) - 1) 
AttributeError: 'tuple' object has no attribute 'lower' 
+5

Пробовала ли какая-либо отладка, чтобы выяснить, почему 'word' является' tuple', а не строкой? Или найдите документацию для 'ntlk.pos_tag()', чтобы увидеть, что она возвращает вместо списка строк? – millimoose

ответ

3

В этой строке:

pos = nltk.pos_tag(clean) 

nltk.pos_tag() возвращает список кортежей (word, tag), а не строк. Используйте это, чтобы получить слова:

pos = nltk.pos_tag(clean) 
final = [stemmer.stem(tagged_word[0]) for tagged_word in pos] 
2

nltk.pos_tag возвращает список кортежей, а не список строк. Может быть, вы хотите

final = [stemmer.stem(word) for word, _ in pos] 
Смежные вопросы