2014-05-23 23 views
9

Tôi mới dùng Python và Stackoverflow (hãy nhẹ nhàng) và đang cố gắng tìm hiểu cách phân tích tình cảm. Tôi đang sử dụng một sự kết hợp của mã tôi tìm thấy trong một hướng dẫn và ở đây: Python - AttributeError: 'list' object has no attribute Tuy nhiên, tôi tiếp tục nhận đượcXử lý văn bản Python: AttributeError: đối tượng 'list' không có thuộc tính 'lower'

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'` 

Đây là mã của tôi:

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) 

Bất kỳ trợ giúp sẽ được ồ ạt đánh giá cao.

Trả lời

8

Kết quả từ trình đọc csv là danh sách, lower chỉ hoạt động trên chuỗi. Có lẽ nó là một danh sách các chuỗi, do đó, có hai lựa chọn. Hoặc bạn có thể gọi lower trên mỗi phần tử hoặc chuyển danh sách thành chuỗi và sau đó gọi lower trên đó.

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

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

Nhưng hợp lý hơn (khó có thể biết thêm thông tin), bạn chỉ thực sự muốn một mục trong danh sách của mình. Một cái gì đó dọc theo dòng:

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

Ngoài ra, đoán rằng bạn đang không sử dụng người đọc csv khá giống như bạn nghĩ bạn đang có, bởi vì ngay bây giờ bạn đang đào tạo một phân loại Naive Bayes trên một ví dụ duy nhất mỗi thời gian và sau đó có nó dự đoán một ví dụ mà nó đã được đào tạo. Có thể giải thích những gì bạn đang cố gắng làm?

+0

Cảm ơn bạn đã phản hồi nhanh. Những gì tôi đang cố gắng là: Tôi có một tập huấn nhỏ, được dán nhãn .csv với 1000 câu tích cực và 1000 âm. Đào tạo dường như hoạt động khi tôi thử nghiệm nó bằng cách chỉ viết mã cứng trong một tuyên bố thử nghiệm, v.d. ' thật tuyệt!'. Tuy nhiên, tôi có một tập tin với khoảng 10000 tweet và các bài đăng trên Facebook và tôi muốn mở nó trong chương trình này và kiểm tra tình cảm của nó bằng cách sử dụng Naive Bayes. Tôi không nghĩ rằng tôi đang sử dụng csv đọc một cách chính xác, nhưng tôi không thể đặt ngón tay của tôi trên nó được nêu ra .. – user3670554

Các vấn đề liên quan