所以我想删除推文/字符串中的所有用户提及和网址。
例如,如果我有这样的推文:
@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'}]
}
有谁知道如何删除用户提及和网址? 非常感谢!
答案 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