web-dev-qa-db-ja.com

Pythonテキスト処理:AttributeError: 'list' object has no attribute 'lower'

私は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)

どんな助けでも大歓迎です。

9
user3670554

Csvリーダーからの結果はリストです。lowerは文字列でのみ機能します。おそらくそれは文字列のリストなので、2つのオプションがあります。各要素でlowerを呼び出すか、リストを文字列に変換してからlowerを呼び出すことができます。

# the first approach
[item.lower() for item in Tweet]

# the second approach
' '.join(Tweet).lower()

しかし、より合理的に(詳細情報なしではわかりにくい)実際には、リストから1つの項目のみを必要とするだけです。以下に沿ったもの:

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

また、あなたが現在思っているようにcsvリーダーを使用していないことを推測します。現在、毎回1つの例で単純ベイズ分類器をトレーニングし、トレーニングされた1つの例を予測させるためです。たぶん、あなたが何をしようとしているのか説明してください。

10