【问题标题】:Python text processing: AttributeError: 'list' object has no attribute 'lower'Python 文本处理:AttributeError: 'list' object has no attribute 'lower'
【发布时间】:2014-07-13 10:21:23
【问题描述】:

我是 Python 和 Stackoverflow 的新手(请保持温和),并且正在尝试学习如何进行情绪分析。我正在使用我在教程和此处找到的代码组合:Python - AttributeError: 'list' object has no attribute 但是,我不断得到

Traceback (most recent call last):
    File "C:/Python27/training", line 111, in <module>
    processedTestTweet = processTweet(row)
  File "C:/Python27/training", line 19, in processTweet
    tweet = tweet.lower()
AttributeError: 'list' object has no attribute 'lower'`

这是我的代码:

import csv
#import regex
import re
import pprint
import nltk.classify


#start replaceTwoOrMore
def replaceTwoOrMore(s):
    #look for 2 or more repetitions of character
    pattern = re.compile(r"(.)\1{1,}", re.DOTALL)
    return pattern.sub(r"\1\1", s)

# process the tweets
def processTweet(tweet):
    #Convert to lower case
    tweet = tweet.lower()
    #Convert www.* or https?://* to URL
    tweet = re.sub('((www\.[\s]+)|(https?://[^\s]+))','URL',tweet)
    #Convert @username to AT_USER
    tweet = re.sub('@[^\s]+','AT_USER',tweet)
    #Remove additional white spaces
    tweet = re.sub('[\s]+', ' ', tweet)
    #Replace #word with word
    tweet = re.sub(r'#([^\s]+)', r'\1', tweet)
    #trim
    tweet = tweet.strip('\'"')
    return tweet

#start getStopWordList
def getStopWordList(stopWordListFileName):
    #read the stopwords file and build a list
    stopWords = []
    stopWords.append('AT_USER')
    stopWords.append('URL')

    fp = open(stopWordListFileName, 'r')
    line = fp.readline()
    while line:
        word = line.strip()
        stopWords.append(word)
        line = fp.readline()
    fp.close()
    return stopWords

def getFeatureVector(tweet, stopWords):
    featureVector = []
    words = tweet.split()
    for w in words:
        #replace two or more with two occurrences
        w = replaceTwoOrMore(w)
        #strip punctuation
        w = w.strip('\'"?,.')
        #check if it consists of only words
        val = re.search(r"^[a-zA-Z][a-zA-Z0-9]*[a-zA-Z]+[a-zA-Z0-9]*$", w)
        #ignore if it is a stopWord
        if(w in stopWords or val is None):
            continue
        else:
            featureVector.append(w.lower())
     return featureVector

def extract_features(tweet):
    tweet_words = set(tweet)
    features = {}
    for word in featureList:
        features['contains(%s)' % word] = (word in tweet_words)
    return features


#Read the tweets one by one and process it
inpTweets = csv.reader(open('C:/GsTraining.csv', 'rb'),
                       delimiter=',',
                       quotechar='|')
stopWords = getStopWordList('C:/stop.txt')
count = 0;
featureList = []
tweets = []

for row in inpTweets:
    sentiment = row[0]
    tweet = row[1]
    processedTweet = processTweet(tweet)
    featureVector = getFeatureVector(processedTweet, stopWords)
    featureList.extend(featureVector)
    tweets.append((featureVector, sentiment))

# Remove featureList duplicates
featureList = list(set(featureList))

# Generate the training set
training_set = nltk.classify.util.apply_features(extract_features, tweets)

# Train the Naive Bayes classifier
NBClassifier = nltk.NaiveBayesClassifier.train(training_set)

# Test the classifier
with open('C:/CleanedNewGSMain.txt', 'r') as csvinput:
    with open('GSnewmain.csv', 'w') as csvoutput:
    writer = csv.writer(csvoutput, lineterminator='\n')
    reader = csv.reader(csvinput)

    all=[]
    row = next(reader)

    for row in reader:
        processedTestTweet = processTweet(row)
        sentiment = NBClassifier.classify(
            extract_features(getFeatureVector(processedTestTweet, stopWords)))
        row.append(sentiment)
        processTweet(row[1])

    writer.writerows(all)

任何帮助将不胜感激。

【问题讨论】:

    标签: python csv text-classification


    【解决方案1】:

    来自 csv 阅读器的结果是一个列表,lower 仅适用于字符串。推测它是一个字符串列表,所以有两个选项。您可以在每个元素上调用lower,或者将列表转换为字符串,然后在其上调用lower

    # the first approach
    [item.lower() for item in tweet]
    
    # the second approach
    ' '.join(tweet).lower()
    

    但更合理(如果没有更多信息很难说)您实际上只想要从列表中删除一项。大致如下:

    for row in reader:
        processedTestTweet = processTweet(row[0]) # Again, can't know if this is actually correct without seeing the file
    

    另外,猜测您并没有像您想象的那样使用 csv 阅读器,因为现在您每次都在一个示例上训练一个朴素贝叶斯分类器,然后让它预测它所训练的一个示例.也许解释一下你想要做什么?

    【讨论】:

    • 感谢您的快速响应。我正在尝试的是:我有一个带有 1000 个肯定语句和 1000 个否定语句的小型标记 .csv 训练集。训练它似乎可以工作,因为我只是通过在测试语句中进行硬编码来测试它,例如' 那太棒了!'。但是,我有一个包含大约 10000 条推文和 Facebook 帖子的文件,我想在这个程序中打开它并使用朴素贝叶斯测试它的情绪。我认为我也没有正确使用 csv 阅读器,但我还不能指望它..
    • 在方法2中进行转换不是更容易吗?推文 = str(tweet).lower
    • @LKT 不会做同样的事情。 str(tweet).lower 给你留下括号和逗号等等,而不是仅仅小写列表中的项目。
    猜你喜欢
    • 2022-01-17
    • 2020-11-02
    • 1970-01-01
    • 2022-12-04
    • 2022-01-10
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多