如何使用python删除tweet /字符串中的用户提及和URL

时间:2012-12-15 20:47:13

标签: python

所以我想删除推文/字符串中的所有用户提及和网址。

例如,如果我有这样的推文:

@username1: some tweet here, http://www.url.com, aaaaa @username2

我想得到这样的东西:

some tweet here, aaaaa

我想使用正则表达式,但我是python的新手,不知道该怎么做。

此外,推文存储在JSON文件(字典列表)中,每条推文(字典)都有一个名为“实体”的密钥,用于存储有关“user_mentions”,“urls”和“hashtags”的信息。格式如下:

{u'user_mentions': [{u'indices': [3, 18],
                     u'screen_name': u'username1',
                     u'id': 1234567,
                     u'name': u'user name 1',
                     u'id_str': u'1234567'},

                    {u'indices': [108, 116],
                     u'screen_name': u'username2',
                     u'id': 112233,
                     u'name': u'user name 2',
                     u'id_str': u'112233'}],

 u'hashtags': [],
 u'urls': [{u'url': u'http://www.url.com',
            u'indices': [83, 103],
            u'expanded_url': u'http://www.url.com',
            u'display_url': u'http://www.url.com'}]
}

有谁知道如何删除用户提及和网址? 非常感谢!

5 个答案:

答案 0 :(得分:7)

from itertools import chain

result = []
for text, entries in ((t["text"], t["entries"]) for t in tweets):
    urls = (e["url"] for e in entries["urls"])
    users = ("@"+e["screen_name"] for e in entries["user_mentions"])
    text = reduce(lambda t,s: t.replace(s, ""), chain(urls, users), text)
    result.append(text)

或使用正则表达式(它还会删除尾随的非空格字符):

text = re.sub(r"(?:\@|https?\://)\S+", "", text)

或两种方法的组合:

text = re.sub(r"(?:%s)\S*" % "|".join(map(re.escape, chain(urls, users))), "", text)

答案 1 :(得分:1)

我认为第一个答案应该是“实体”而不是“条目”。此外,如果您试图将其排除在外,请不要忘记媒体中的网址。

https://dev.twitter.com/overview/api/entities-in-twitter-objects

对于Python 3,也剥离了媒体网址:

    from itertools import chain
    from functools import reduce

    result = []
    for text, entities in ((t["text"], t["entities"]) for t in user_timeline):
        urls = (e["url"] for e in entities["urls"])
        users = ("@" + e["screen_name"] for e in entities["user_mentions"])
        media_urls = ()
        if 'media' in entities:
            media_urls = (e["url"] for e in entities["media"])
        text = reduce(lambda t, s: t.replace(s, ""), chain(urls, media_urls, users), text)
        result.append(text)

答案 2 :(得分:0)

首先,我希望您能够访问推文>>>

import json
import glob
for filename in glob.glob('*.json'):
with open("plain text - preprocess.txt",'a') as outfile ,open(filename, 'r') as f:
    for line in f:
        if line=='\n':
            pass
        else:
            tweet = json.loads(line) 
            ###NOW DO SOMETHING WITH tweet['text']

使用Regex删除推文中不需要的#或http链接。我是这样做的>>>

import re
stringwithouthash = re.sub(r'#\w+ ?', '', tweet['text'])
stringwithoutlink = re.sub(r'http\S+', '', tweet['text'])

\ S接收除空白之外的所有字符。

\ w接收A-Z,a-z,0-9

有关正则表达式的更多信息,请参阅this link

答案 3 :(得分:0)

您也可以将其组合为单层,但这是步骤的分解:

memory_profiler

输出:

text = '@username1: some tweet here, http://www.url.com, aaaaa @username2'
processed_text = re.sub(r"(?:\@|http?\://|https?\://|www)\S+", "", text)
processed_text = " ".join(processed_text.split())
print(processed_text)

答案 4 :(得分:0)

test = "@username1: some tweet here, http://www.url.com, aaaaa @username2"
import re
clean_text = re.sub(r'@\w+', '', text)

输出将是

: some tweet here, http://www.url.com, aaaaa