#python
#python
Вопрос:
Это для tweepy. В нем говорится
TwitterClient не определен.
import re
import tweepy
from tweepy import OAuthHandler
from textblob import TextBlob
class TwitterClient(object):
'''
Generic Twitter Class for sentiment analysis.
'''
def __init__(self):
'''
Class constructor or initialization method.
'''
# keys and tokens from the Twitter Dev Console
consumer_key = 'remove'
consumer_secret = 'remove'
access_token = 'remove-remove'
access_token_secret = 'remove'
# attempt authentication
try:
# create OAuthHandler object
self.auth = OAuthHandler(consumer_key, consumer_secret)
# set access token and secret
self.auth.set_access_token(access_token, access_token_secret)
# create tweepy API object to fetch tweets
self.api = tweepy.API(self.auth)
except:
print("Error: Authentication Failed")
def clean_tweet(self, tweet):
'''
Utility function to clean tweet text by removing links, special characters
using simple regex statements.
'''
return ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )", " ", tweet).split())
def get_tweet_sentiment(self, tweet):
'''
Utility function to classify sentiment of passed tweet
using textblob's sentiment method
'''
# create TextBlob object of passed tweet text
analysis = TextBlob(self.clean_tweet(tweet))
# set sentiment
if analysis.sentiment.polarity > 0:
return 'positive'
elif analysis.sentiment.polarity == 0:
return 'neutral'
else:
return 'negative'
def get_tweets(self, query, count = 10):
'''
Main function to fetch tweets and parse them.
'''
# empty list to store parsed tweets
tweets = []
try:
# call twitter api to fetch tweets
fetched_tweets = self.api.search(q = query, count = count)
# parsing tweets one by one
for tweet in fetched_tweets:
# empty dictionary to store required params of a tweet
parsed_tweet = {}
# saving text of tweet
parsed_tweet['text'] = tweet.text
# saving sentiment of tweet
parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
# appending parsed tweet to tweets list
if tweet.retweet_count > 0:
# if tweet has retweets, ensure that it is appended only once
if parsed_tweet not in tweets:
tweets.append(parsed_tweet)
else:
tweets.append(parsed_tweet)
# return parsed tweets
return tweets
except tweepy.TweepError as e:
#print error (if any)
print("Error : " str(e))
def main():
#creating object of TwitterClient Class
api = TwitterClient()
#calling function to get tweets
tweets = api.get_tweets(query = 'ADF', count = 200)
#picking positive tweets from tweets
ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
# percentage of positive tweets
print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets)))
#picking negative tweets from tweets
ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
#percentage of negative tweets
print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets)))
#percentage of neutral tweets
netweets = [tweet for tweet in tweets if tweet['sentiment'] == 'neutral']
print("Neutral tweets percentage: {} %".format(100*(len(netweets)/len(tweets))))
#printing first 5 positive tweets
print("nnPositive tweets:")
for tweet in ptweets[:10]:
print(tweet['text'])
#printing first 5 negative tweets
print("nnNegative tweets:")
for tweet in ntweets[:10]:
print(tweet['text'])
if __name__ == "__main__":
#calling main function
main()
Комментарии:
1. В
class TwitterClient(object):
, является ли object параметром? Если это так, его необходимо включить в__init__
определение вместо этого.2. Правильно ли я также говорю, что
main()
это не частьTwitterClient()
?3. Убедитесь, что отступ в вопросе соответствует вашему фактическому отступу. Мы попытались очистить форматирование вопроса, но, похоже, все было слишком запутано, чтобы мы могли сделать это правильно. Опубликуйте свой фактический код, затем используйте Ctl-k для отступа в нем 4 места.
4. Спасибо. Этот код выглядит как отступы, которые у меня есть.
Ответ №1:
Вот сокращенная версия вашего кода, которая демонстрирует проблему.
class TwitterClient(object):
None
def main():
api = TwitterClient()
print("main()")
if __name__ == "__main__":
main()
Обратите внимание на отступ обоих main()
и if __name__ == "__main__"
поместите их под определение самого TwitterClient . Отсюда и ошибка в Python 3:
Traceback (most recent call last):
File "twitter-55610165.py", line 2, in <module>
class TwitterClient(object):
File "twitter-55610165.py", line 11, in TwitterClient
main()
File "twitter-55610165.py", line 6, in main
api = TwitterClient()
NameError: name 'TwitterClient' is not defined
TwitterClient
не определен, потому что определение класса TwitterClient
не завершено — вы все еще внутри него. If находится на уровне области видимости класса, поэтому выполняется во время определения класса. Отступ многое определяет в области видимости в Python.
С небольшими, но важными изменениями в пробелах, чтобы main()
вывести if __name__ ...
область действия TwitterClient и вернуть их в основную область, проблема исчезает.
class TwitterClient(object):
None
def main():
api = TwitterClient()
print("main()")
if __name__ == "__main__":
main()
т.е. эти конструкции теперь находятся на том же уровне отступа TwitterClient
, что и, далее слева на один уровень отступа.
$ python3 twitter-55610165.py
main()
Комментарии:
1. Большое спасибо! Вы объяснили это слишком четко. Я не могу поверить, что я это упустил. Я был так сосредоточен на том, что фактический код, возможно, ошибочен. Думаю, я пока не могу использовать python, lol
2. Теперь мне просто нужно работать над его улучшением / обучением лучше. Я только что протестировал его, и он выглядит в основном точным, но я попробовал анализ Хиллари, и он дал положительный твит: RT @Lrihendry: Мне кажется ясным, Мюллер перестал копать, когда все его туннели привели к Хиллари, Обаме и демократам.
Ответ №2:
Простое решение — удалить main()
из TwitterClient()
определения. Точная проблема заключается в том, что main()
находится внутри TwitterClient()
, другими словами, вы не закончили определение TwitterClient()
, поэтому python выдает ошибки.
Как исправить
Самое простое решение — переместить main()
if __name__...
строки и из TwitterClient()
определения. Это избавит вас от текущей ошибки. Этот код должен работать:
импортировать повторно импортировать tweepy из tweepy импортировать OAuthHandler из textblob импортировать класс TextBlob TwitterClient(object): «‘Общий класс Twitter для анализа настроений. «‘ def init(self): «‘ Конструктор класса или метод инициализации. «‘ # ключи и токены из консоли разработчика Twitter consumer_key = ‘удалить’ consumer_secret = ‘удалить’ access_token = ‘удалить-удалить’ access_token_secret = ‘удалить’
# attempt authentication
try:
# create OAuthHandler object
self.auth = OAuthHandler(consumer_key, consumer_secret)
# set access token and secret
self.auth.set_access_token(access_token, access_token_secret)
# create tweepy API object to fetch tweets
self.api = tweepy.API(self.auth)
except:
print("Error: Authentication Failed")
def clean_tweet(self, tweet):
'''
Utility function to clean tweet text by removing links, special characters
using simple regex statements.
'''
return ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )", " ", tweet).split())
def get_tweet_sentiment(self, tweet):
'''
Utility function to classify sentiment of passed tweet
using textblob's sentiment method
'''
# create TextBlob object of passed tweet text
analysis = TextBlob(self.clean_tweet(tweet))
# set sentiment
if analysis.sentiment.polarity > 0:
return 'positive'
elif analysis.sentiment.polarity == 0:
return 'neutral'
else:
return 'negative'
def get_tweets(self, query, count = 10):
'''
Main function to fetch tweets and parse them.
'''
# empty list to store parsed tweets
tweets = []
try:
# call twitter api to fetch tweets
fetched_tweets = self.api.search(q = query, count = count)
# parsing tweets one by one
for tweet in fetched_tweets:
# empty dictionary to store required params of a tweet
parsed_tweet = {}
# saving text of tweet
parsed_tweet['text'] = tweet.text
# saving sentiment of tweet
parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
# appending parsed tweet to tweets list
if tweet.retweet_count > 0:
# if tweet has retweets, ensure that it is appended only once
if parsed_tweet not in tweets:
tweets.append(parsed_tweet)
else:
tweets.append(parsed_tweet)
# return parsed tweets
return tweets
except tweepy.TweepError as e:
#print error (if any)
print("Error : " str(e))
def main():
#creating object of TwitterClient Class
api = TwitterClient()
#calling function to get tweets
tweets = api.get_tweets(query = 'ADF', count = 200)
#picking positive tweets from tweets
ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
#percentage of positive tweets
print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets)))
#picking negative tweets from tweets
ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
#percentage of negative tweets
print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets)))
#percentage of neutral tweets
netweets = [tweet for tweet in tweets if tweet['sentiment'] == 'neutral']
print("Neutral tweets percentage: {} %".format(100*(len(netweets)/len(tweets))))
#printing first 5 positive tweets
print("nnPositive tweets:")
for tweet in ptweets[:10]:
print(tweet['text'])
#printing first 5 negative tweets
print("nnNegative tweets:")
for tweet in ntweets[:10]:
print(tweet['text'])
if __name__ == "__main__":
#calling main function
main()