Есть ли способ создать регистроподобный оператор IF в Python / Jupyter для мониторинга подстрок в твитах с помощью Tweepy?

#python #tweepy

#python #tweepy

Вопрос:

Я пытаюсь отслеживать учетные записи нескольких компаний в Твиттере, экспортируя твиты в .csv, чтобы посмотреть на позитивность или негативность твитов, которые включают название компании, которое затем будет визуализировано.

Чтобы облегчить себе задачу, я присваиваю каждому твиту только одно число, от 1 (отрицательное) до 10 (положительное), однако написанный мной код не дает никакой обратной связи (остается равным 0), застревает в цикле For или выдает синтаксическую ошибку.

Используя Jupyter notebook, я попытался создать оператор If / Elif из 10 строк — из-за того, что в Python нет оператора case, и вставил этот код как в метод ‘get Tweets’, так и в метод ‘write csv’.

Получать твиты

 api = tweepy.API(auth)

query = "ASOS"

language = "en"

results = api.search(q=query, lang=language, count=100)

for tweet in results:
    if (not tweet.retweeted) and ('RT @' not in tweet.text):
        print(tweet.user.screen_name,"Tweeted:",tweet.text,**rating**)
        print()
  

Напишите CSV

 import csv

api = tweepy.API(auth)

csvFile = open('ASOS with emojis1.csv', 'a')

csvWriter = csv.writer(csvFile)

results = api.search(q=query, lang=language, count=100)

for tweet in results:
if (not tweet.retweeted) and ('RT @' not in tweet.text):
    csvWriter.writerow([tweet.created_at, tweet.user.screen_name, tweet.text, **rating**])

csvFile.close()
  

Оператор If / Elif, который я написал

 rating = '0'

if 'abysmal' or 'appalling' or 'dreadful' or 'awful' or 'terrible' or 'very bad' or 'really bad' or '😡' or '😠' or '😷' in tweet.text:
                (rating = '1')
            elif 'rubbish' or 'unsatisfactory' or 'bad' or 'poor' or '🙁' or '😞' or ':(' or '):' or '💀' in tweet.text:
                (rating = '2')
            elif 'quite bad' or 'pretty bad' or 'somewhat bad' or 'below average' or '💔' or '😣' or '☹️' or '😒' or '😢' in tweet.text:
                (rating = '3')
            elif 'mediocre' or '🙃' or '👎' or '🙄' or '🤔' or '😪' in tweet.text:
                (rating = '4')
            elif 'average' or 'not bad' or 'fair' or 'alright' or 'ok' or 'satisfactory' or 'fine' or 'somewhat good' or '😳' or '😭' or '😩' or '😫' or '👀' or '😱' or '😬' or 'omg' in tweet.text:
                (rating = '5')
            elif 'quite good' or 'decent' or 'above average' or 'pretty good' or 'good' or '🙂' or '💪' or '😅' or '😎' or '😈' in tweet.text:
                (rating = '6')
            elif 'great' or 'gr8' or 'really good' or 'rlly good' or 'very good' or 'v good' or '💖' or '☺️' or '😘' or '😌' or '👍' or '👏' or '🙌' ':)' or '(:' or '💥' or '💙' or '🤣' or '🖤' or '👌' in tweet.text:
                (rating = '7')
            elif 'awesome' or 'fantastic' or '😂' or '💕' or '😍' or '😊' or '❤' or '♥' or '💜' or '💛' or '✅' or '🎉' or '🤗' or '🙏' or '✨' in tweet.text:
                (rating = '8')
            elif 'superb' or 'brilliant' or 'incredible' or 'excellent' or 'oustanding' or '😁' or '😄' or '🥰' or '💯' in tweet.text:
                (rating = '9')
            elif 'perfect' in tweet.text:
                (rating = '10')
            else:
                (rating = 'N/A')
  

Ожидается: создается файл .csv с различными номерами в

Актуально: (рейтинг = ‘1’) SyntaxError: недопустимый синтаксис

Ответ №1:

Ваши условия не работают должным образом. Чтобы связать условное:

 
mylist = [1, 2, 3]

# Note that the full condition must be specified for
# each desired conditional
if 1 in mylist or 2 in mylist or 3 in mylist:
    print("True")

# True
  

Проблема с тем, что вы используете, заключается в том, что вы подходите к логике так, как вы бы ее сказали, а не так, как интерпретатор ее читает. В качестве примера:

 if 'a' or 'b':
    print('True')

# True
  

Заполненные строки действуют как True и будут оценивать ваше условие как таковое, поэтому следует внести изменения таким образом, чтобы было указано все условие:

 # Evaluates to True, though it's not what you want
if 'a' and 'b' in 'bc':
    print(True) # This is not what you want, but 'a' is read as 'true'
# True

if 'a' in 'bc' and 'b' in 'bc':
    print(True)
# Doesn't print True because 'a' in 'bc' is False
  

Здесь может помочь any функция, поскольку она будет выглядеть, если какое-либо из значений примет значение True :

 mylist = [1, 2, 3]

if any([i in mylist for i in range(2,5)]):
    print("True")

# True
  

Кроме того, нет необходимости в круглых скобках вокруг присваивания переменной:

 if 'abysmal' in tweet.text or 'horrible' in tweet.text:
    rating = 0

elif ...:
    rating = 1

# So on and so forth
  

Комментарии:

1. Невероятное спасибо, я единственный, кто использует код, и это только для временного проекта, поэтому мне не нужно, чтобы он «выглядел» слишком красиво. Это было идеально.