如何从推文文本中删除@user、主题标签和链接并将其放入 python 中的数据框

How to remove @user, hashtag, and links from tweet text and put it into dataframe in python

我是 python 的初学者,我正在尝试使用 API 从 Twitter 收集数据。我想收集用户名、日期和没有@用户名、主题标签和链接的干净推文,然后将其放入数据框中。

我找到了一种实现此目的的方法:' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)"," ",tweet.text).split()) 但是当我在我的代码中实现它时,它 returns 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,但我不知道如何解决。请帮助我

谢谢。

其实问题出在第二行:

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]]

您还可以使用正则表达式删除预定义函数中以“@”(用户名)或 '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)

如果遇到“预期的字符串或类字节对象错误”,那么只需使用

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/