2

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

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

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

我想得到这样的东西:

some tweet here, aaaaa

我想使用正则表达式,但我对 python 很陌生,不知道该怎么做。

此外,推文存储在 JSON 文件(字典列表)中,每条推文(字典)都有一个名为“entities”的键,它以如下格式存储有关“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'}]
}

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

4

5 回答 5

12
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)
于 2012-12-15T22:04:39.550 回答
2

您也可以将其组合到单行上,但这里是步骤的分解:

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)

输出:

some tweet here, aaaaa
于 2020-05-29T16:03:45.703 回答
2

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

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

对于 Python 3,也去除媒体 URL:

    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)
于 2016-10-21T14:21:43.970 回答
1

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

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 包含 AZ,az,0-9

有关正则表达式的更多信息,请参阅此链接

于 2016-04-01T15:44:10.650 回答
1
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
于 2021-05-29T11:05:17.800 回答