2014-05-23 10 views
9

मैं पाइथन और स्टैक ओवरफ्लो (कृपया नम्र रहें) में नया हूं और भावनात्मक विश्लेषण कैसे करना है, सीखने की कोशिश कर रहा हूं। मुझे लगता है मैं एक ट्यूटोरियल और यहाँ में पाया कोड के संयोजन का उपयोग कर रहा हूँ: 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) 

किसी भी मदद की सराहना की बड़े पैमाने पर किया जाएगा।

उत्तर

8

सीएसवी रीडर का परिणाम एक सूची है, 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 पाठक काफी की तरह आपको लगता है कि आप कर रहे हैं का उपयोग नहीं कर रहे हैं, क्योंकि अभी आप हर बार एक भी उदाहरण पर एक अनुभवहीन Bayes वर्गीकारक प्रशिक्षित कर रहे हैं और उसके बाद यह एक उदाहरण की भविष्यवाणी कर रहा है जिस पर इसे प्रशिक्षित किया गया था। शायद समझाओ कि आप क्या करने की कोशिश कर रहे हैं?

+0

तेज प्रतिक्रिया के लिए धन्यवाद। मैं जो कोशिश कर रहा हूं वह है: मेरे पास 1000 पॉजिटिव और 1000 नकारात्मक कथन के साथ एक छोटा, लेबल किया गया .csv प्रशिक्षण सेट है। प्रशिक्षण यह काम करता प्रतीत होता है क्योंकि मैंने टेस्ट स्टेटमेंट में बस हार्ड कोडिंग द्वारा इसका परीक्षण किया था। ' यह बहुत अच्छा है!'। हालांकि, मेरे पास लगभग 10000 ट्वीट्स और फेसबुक पोस्टिंग वाली एक फाइल है और मैं इसे इस कार्यक्रम में खोलना चाहता हूं और नैवे बेयस का उपयोग करके इसकी भावना का परीक्षण करना चाहता हूं। मुझे नहीं लगता कि मैं सीएसवी रीडर का सही ढंग से उपयोग कर रहा हूं लेकिन मैं अभी तक अपनी अंगुली नहीं डाल सकता .. – user3670554

संबंधित मुद्दे

 संबंधित मुद्दे