Hope is a dangerous thing, but I have it.


【实验分析】Yelp数据处理

最近可能有几个看效果的实验可能要用到Yelp review的数据,官网(https://www.yelp.com/dataset/documentation/main)下载的数据是原始的数据,我要将它预处理成我要的样子。

数据要求

  1. 要得到review的text、user ID和star。
  2. 仅保留review条数在REVIEW_NUM(参数可调)以上的user ID。
  3. 仅保留符合要求的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,果然超快。