【实验分析】Yelp数据处理
最近可能有几个看效果的实验可能要用到Yelp review的数据,官网(https://www.yelp.com/dataset/documentation/main)下载的数据是原始的数据,我要将它预处理成我要的样子。
数据要求
- 要得到review的text、user ID和star。
- 仅保留review条数在REVIEW_NUM(参数可调)以上的user ID。
- 仅保留符合要求的user ID对应的text、user ID和star。
数据处理
读取数据
需要的文件是review.json,需要读取我们需要的text、user ID和star三项。之前直接使用json.load报错,后来查了这个读取一条数据,所以换成了现在的循环形式。
raw_review = []
raw_user = []
raw_star = []
with open('./data/review.json', "rb") as file:
for line in file:
data = json.loads(line)
raw_review.append(data["text"])
raw_user.append(data["user_id"])
raw_star.append(data["stars"])
数据处理
大小写转换,去掉文本中非英文字符和空格的其他字符。
raw_review = [text.lower() for text in raw_review]
pattern = re.compile(r'[^a-z\s]')
raw_review = [re.sub(pattern, '', text) for text in raw_review]
去掉评论太少的用户
仅保留评论数量在REVIEW_NUM(参数可调)以上的user ID。
userset = list(set(raw_user))
print(2)
usercount = collections.Counter(raw_user) # list.count实在太慢了
print(3)
sorted_user = sorted(usercount.items(), key=operator.itemgetter(1), reverse=True)
for usernum in range(len(sorted_user)):
u = sorted_user[usernum]
if u[1]<REVIEW_NUM:
break
selected_user = [sorted_user[i][0] for i in range(usernum)]
# with open('./data/user_count.txt', 'w', encoding='UTF-8') as file:
# su = [u[0]+'\t'+str(u[1]) for u in selected_user]
# su = '\n'.join(su)
# file.write(su)
这里我有保存到文件中,因为REVIEW_NUM是可调的,但是具体的大小我一开始设置为5,然后根据打印出来的文件中的数量结果进行选择,现设置为300。
另外,这里计数器一开始使用了list自带的count,但是真的太慢了,等了将近20min都没有算完。后来在https://code-examples.net/zh-CN/q/27acff 看到“在循环中调用count
需要在每次count
调用时对列表进行单独传递,这对性能可能是灾难性的。 如果您想要计算所有项目,或者甚至只计算多个项目,请使用Counter
。”后来换了Counter,果然超快。