#python #twitter
#python #Twitter
Вопрос:
Я новичок в python и пытаюсь собирать данные из Twitter с помощью API. Я хочу собрать имя пользователя, дату и чистые твиты без @username, хэштегов и ссылок, а затем поместить их в фрейм данных.
Я нахожу способ добиться этого с помощью: ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )"," ",tweet.text).split())
но когда я реализую его в своих кодах, он возвращает NameError: name 'tweet' is not defined
Вот мои коды
tweets = tw.Cursor(api.search, q=keyword, lang="id", since=date).items()
raw_tweet = ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )"," ",tweet.text).split())
data_tweet = [[tweet.user.screen_name, tweet.created_at, raw_tweet] for tweet in tweets]
dataFrame = pd.DataFrame(data=data_tweet, columns=['user', "date", "tweet"])
Я знаю, что проблема в data_tweet
, но я не знаю, как это исправить. Пожалуйста, помогите мне
Спасибо.
Ответ №1:
Проблема на самом деле во второй строке:
raw_tweet = ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )"," ",tweet.text).split())
Здесь вы используете tweet.text. Однако вы еще не определили, что такое твит, только твиты. Кроме того, из чтения вашей третьей строки, где вы фактически определяете tweet:
for tweet in tweets
Я предполагаю, что вы хотите, чтобы tweet был значением, которое вы получаете при повторении твитов.
Итак, что вам нужно сделать, это запустить обе строки через итератор вместе, предполагая, что моя предыдущая гипотеза верна.
Итак:
for tweet in tweets:
raw_tweet = ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )"," ",tweet.text).split())
data_tweet = [[tweet.user.screen_name, tweet.created_at, raw_tweet]]
Ответ №2:
Вы также можете использовать reg-ex для удаления любых слов, начинающихся с «@» (имена пользователей) или «http» (ссылки) в предопределенной функции и применить функцию к столбцу фрейма данных pandas
import re
def remove_usernames_links(tweet):
tweet = re.sub('@[^s] ','',tweet)
tweet = re.sub('http[^s] ','',tweet)
return tweet
df['tweet'] = df['tweet'].apply(remove_usernames_links)
Если вы столкнулись с «ожидаемой ошибкой объекта типа string или byte», просто используйте
import re
def remove_usernames_links(tweet):
tweet = re.sub('@[^s] ','',str(tweet))
tweet = re.sub('http[^s] ','',str(tweet))
return tweet
df['tweet'] = df['tweet'].apply(remove_usernames_links)
Кредит: https://www.datasnips.com/59/remove-usernames-http-links-from-tweet-data /