RESCAL+YELP 垃圾评论识别 论文算法实现

咸鱼好久……记录一下最近做的这个论文里面的重现,主要也就是对数据集的处理。

论文为Learning to Represent Review with Tensor Decomposition for Spam Detection,主要就是将评论和商品两种实体的关系扩展出11种,每一种为一个三维张量,也就是说会有11个三维张量。

然后把这11个三维张量投入RESCAL算法里面分解得到A和R和A^T

RESCAL+YELP 垃圾评论识别 论文算法实现_第1张图片

然后A中就有了评论者和商品的向量表示,最后放到SVM里面训练(这里也挺疑惑的 是用linearsvc还是svm.svc训练器,用后者吧结果会好一点,但是加了商品向量结果反而变低,于是就用了前者……)

除此以外,训练的时候使用的是平衡数据集,测试还分了i平衡和不平衡……不平衡的训练集我也没搞明白具体怎么划分的,反正结果不好,平衡的还差强人意。

至于数据集,论文里是这样RESCAL+YELP 垃圾评论识别 论文算法实现_第2张图片

拿到手的不仅仅分布有差距,还是个.db文件,于是下了SQLite的可视化工具,转成了txt处理(学过SQL跟没学过一样QAQ

处理起来的代码还是比较简单的,就贴一个,这个关系是评论者之间平邮数量差距 X[i,j,8]就是评论者i和评论者j朋友数量差距。

def doX7():
    print("开始创建关系8")
    X7 = zeros((n, n))  # 0-5122为评论者ID  5123-5194为Hotel的ID
    f7 = open("D:\pycharm\RESCAL/rescal.py-master\data/reviewer.csv", encoding='utf-8')  # 打开评论者ID
    reviewers = f7.readlines()
    reviewer_friendcount=[]
    for r in reviewers:
        friendcout=int(r.split(' ')[-9])
        reviewer_friendcount.append(friendcout)

    for i in range(n1):
        for j in range(n1):
            try:
                X7[i][j]=sigmoid(reviewer_friendcount[i]-reviewer_friendcount[j])  #要不要绝对值
            except OverflowError:
                if reviewer_friendcount[i]-reviewer_friendcount[j]>0:
                    X7[i][j]=1
                else:
                    X7[i][j]=0
    print("关系8创建完成")
    f7.close()
    return X7

结果没做五折,大概8:2随机划分了几次,求了平均:
P R F1 A
ours_re 平衡 81.219 86.953 83.963 83.440

与论文有差距(基本1个点)暂时不知道怎么改进

你可能感兴趣的:(机器学习)