【RippleNet】(一)preprocessor.py【未完】

首先读入的文件有movie和book和news三种,肯定会选择一种进行解析!
下面我们以movies作为样例分析:

本论文中使用的数据集是movie-1m

  • ratings.dat:
    分别是用户::电影::评分::电影编号
    ratings.dat

  • item_index2entity_id_rehashed.txt文件:
    在这里插入图片描述

内容:

import argparse
import numpy as npRATING_FILE_NAME = dict({'movie': 'ratings.dat', 'book': 'BX-Book-Ratings.csv', 'news': 'ratings.txt'})   #定义字典   字典保存中保存的都是原始文件
SEP = dict({'movie': '::', 'book': ';', 'news': '\t'})  #定义的分隔符! 
THRESHOLD = dict({'movie': 4, 'book': 0, 'news': 0})   #定义电影喜好的阈值吧def read_item_index_to_entity_id_file():  #看名字:读item的索引转化为实体的idfile = '../data/' + DATASET + '/item_index2entity_id_rehashed.txt'#../data/movie/item_index2entity_id_rehashed.txtprint('reading item index to entity id file: ' + file + ' ...')i = 0for line in open(file, encoding='utf-8').readlines():item_index = line.strip().split('\t')[0]  satori_id = line.strip().split('\t')[1]    #返回字符列表,并获取第一个和第二个元素, 第一个元素是原item的索引,第二个元素是satori中实体的索引。  satori是微软的大型知识图谱。 具体看后面解析item_index_old2new[item_index] = i   # item 的旧的index转换为新的indexentity_id2index[satori_id] = i    # 实体id转换为index i += 1      def convert_rating():file = '../data/' + DATASET + '/' + RATING_FILE_NAME[DATASET]# '../data/movie/ratings.datprint('reading rating file ...')item_set = set(item_index_old2new.values())  # 将item新的index转化为集合user_pos_ratings = dict()   # 用户正样本的评分user_neg_ratings = dict()  #  用户负样本的评分for line in open(file, encoding='utf-8').readlines()[1:]:array = line.strip().split(SEP[DATASET])    #看上面,我们经过分割后得到四个元素# remove prefix and suffix quotation marks for BX datasetif DATASET == 'book':array = list(map(lambda x: x[1:-1], array))item_index_old = array[1]   # 取的是第二个元素,item的旧index   if item_index_old not in item_index_old2new:  # the item is not in the final item set       # 比较的是keys,不是values,item_index_old也是字符,查看评价的items是不是在我们记录的item_index中,如果不在直接终止continueitem_index = item_index_old2new[item_index_old]  #如果在,那么我们就赋值新的item_indexuser_index_old = int(array[0]) # 获得user旧的id的indexrating = float(array[2])   #获得用户的电影评分if rating >= THRESHOLD[DATASET]:  #我们选取列表中所有大于阈值的评分if user_index_old not in user_pos_ratings:    #注意这里比较的是keys值user_pos_ratings[user_index_old] = set()   # 积极评分的设置为set集合user_pos_ratings[user_index_old].add(item_index)  #list列表中添加用户旧的index#并且添加了item新的indexelse:if user_index_old not in user_neg_ratings: #同样的道理,这里存储列表中小于阈值的评分user_neg_ratings[user_index_old] = set()user_neg_ratings[user_index_old].add(item_index)print('converting rating file ...')   #将用户的index转为新的writer = open('../data/' + DATASET + '/ratings_final.txt', 'w', encoding='utf-8')user_cnt = 0user_index_old2new = dict()for user_index_old, pos_item_set in user_pos_ratings.items():if user_index_old not in user_index_old2new:user_index_old2new[user_index_old] = user_cnt   #记录user的总数user_cnt += 1user_index = user_index_old2new[user_index_old]   #for item in pos_item_set:writer.write('%d\t%d\t1\n' % (user_index, item))unwatched_set = item_set - pos_item_setif user_index_old in user_neg_ratings:unwatched_set -= user_neg_ratings[user_index_old]for item in np.random.choice(list(unwatched_set), size=len(pos_item_set), replace=False):writer.write('%d\t%d\t0\n' % (user_index, item))writer.close()print('number of users: %d' % user_cnt)print('number of items: %d' % len(item_set))def convert_kg():    #基本都是转变id的事 print('converting kg file ...')entity_cnt = len(entity_id2index)relation_cnt = 0writer = open('../data/' + DATASET + '/kg_final.txt', 'w', encoding='utf-8')files = []if DATASET == 'movie':files.append(open('../data/' + DATASET + '/kg_part1_rehashed.txt', encoding='utf-8'))files.append(open('../data/' + DATASET + '/kg_part2_rehashed.txt', encoding='utf-8'))else:files.append(open('../data/' + DATASET + '/kg_rehashed.txt', encoding='utf-8'))for file in files:for line in file:array = line.strip().split('\t')head_old = array[0]relation_old = array[1]tail_old = array[2]if head_old not in entity_id2index:entity_id2index[head_old] = entity_cntentity_cnt += 1head = entity_id2index[head_old]if tail_old not in entity_id2index:entity_id2index[tail_old] = entity_cntentity_cnt += 1tail = entity_id2index[tail_old]if relation_old not in relation_id2index:relation_id2index[relation_old] = relation_cntrelation_cnt += 1relation = relation_id2index[relation_old]writer.write('%d\t%d\t%d\n' % (head, relation, tail))writer.close()print('number of entities (containing items): %d' % entity_cnt)print('number of relations: %d' % relation_cnt)if __name__ == '__main__':np.random.seed(555)parser = argparse.ArgumentParser()parser.add_argument('-d', '--dataset', type=str, default='movie', help='which dataset to preprocess')args = parser.parse_args()DATASET = args.datasetentity_id2index = dict()relation_id2index = dict()item_index_old2new = dict()read_item_index_to_entity_id_file()convert_rating()convert_kg()print('done')

补充:

1. line.strip.split(’\t’)

  • 描述
    Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
    注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
  • 语法
    strip()方法语法:
str.strip([chars]);
  • 参数
    chars – 移除字符串头尾指定的字符序列

  • 返回值
    返回移除字符串头尾指定的字符序列生成的新字符串

2. split(’\t’)

已经在上个代码分析中讨论过了,这里只是简单说一下,它会返回字符列表!

  • 源代码分析:
def read_item_index_to_entity_id_file():file = '../data/movie/item_index2entity_id_rehashed.txt'print('reading item index to entity id file: ' + file + ' ...')i = 0for line in open(file, encoding='utf-8').readlines():i = i + 1if i < 10:print(line)print(len(line))print(line.strip())print(len(line.strip()))print(line.strip().split('\t'))print(line.strip().split('\t')[0])
read_item_index_to_entity_id_file()

可以看出歧义
可以看出其一,如果只是输出一行的数据,长度为4,该字符串是"1 \t 0 空格" 多个空格为一个!

所以我们在获取一行数据的时候,要特别注意这些空格符(在首尾)、分隔符(在中间)

最后split返回的是字符列表!

3. Set()集合

集合是为了啥? 关系运算啊! 并交差集

定义:
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
注意是没有顺序,而是是不重复的集合!

返回值:
返回新的集合对象

实例:

>>>x = set('runoob')
>>> y = set('google')
>>> x, y
(set(['b', 'r', 'u', 'o', 'n']), set(['e', 'o', 'g', 'l']))   # 重复的被删除
>>> x & y         # 交集
set(['o'])
>>> x | y         # 并集
set(['b', 'e', 'g', 'l', 'o', 'n', 'r', 'u'])
>>> x - y         # 差集
set(['r', 'b', 'u', 'n'])
>>>

4. “XXX” not in dict

比较的是keys,不是values; 如果字典中没有,那么就返回False,否则返回True。
配合的操作就是如果没有,那么就添加该key值!

源码举例:

 if item_index_old not in item_index_old2new:  # the item is not in the final item set       # 比较的是keys,不是values,item_index_old也是字符,查看评价的items是不是在我们记录的item_index中,如果不在直接终止continueitem_index = item_index_old2new[item_index_old]  #如果在,那么我们就赋值新的item_index

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 961. 重复 N 次的元素

1. 题目 在大小为 2N 的数组 A 中有 N1 个不同的元素&#xff0c;其中有一个元素重复了 N 次。 返回重复了 N 次的那个元素。 示例 1&#xff1a; 输入&#xff1a;[1,2,3,3] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;[2,1,2,5,3,2] 输出&#xff1a;2示例 3&a…

日照华软游戏开发价格_开发区将是未来刚需人群的首选!

开发区真的只是备胎吗?想必在日照人的心目中一定有一张区域排行榜&#xff0c;而排在榜首的一定是东城片区&#xff0c;这是无可厚非的&#xff0c;毕竟东城片区的各项资源是全市其他区域无法抗衡的&#xff0c;然后西城片区、山海天片区、石臼片区……紧随其后&#xff0c;而…

知识图谱论文阅读(十六)【WWW2019】Knowledge Graph Convolutional Networks for Recommender

题目&#xff1a; KGCN 论文链接&#xff1a; 代码链接&#xff1a;https://github.com/hwwang55/KGCN 想法 高阶的意思就是multi-hop的意思注意是从外向里聚合的&#xff0c;第h-1跳是外侧&#xff0c;第h跳是里侧&#xff01; 所以才有聚合邻居和本身之说 创新 摘要 为了…

LeetCode 925. 长按键入(双指针)

1. 题目 你的朋友正在使用键盘输入他的名字 name。 偶尔&#xff0c;在键入字符 c 时&#xff0c;按键可能会被长按&#xff0c;而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。 如果它对应的可能是你的朋友的名字&#xff08;其中一些字符可能被长按&#…

java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别

最近在做邮件提醒抄送企业微信消息系统&#xff0c;就目前而言&#xff0c;无论是pop3还是imap都没有一个好的方法只接收新邮件&#xff0c;基本只能依靠收件箱列表message自行判断&#xff0c;下面给出几种思路并作对比。//收件箱 folder store.getFolder("INBOX")…

Jquery 操作select总结

//遍历option和添加、移除optionfunction changeShipMethod(shipping){var len $("select[nameISHIPTYPE] option").lengthif(shipping.value ! "CA"){$("select[nameISHIPTYPE] option").each(function(){if($(this).val() 111){$(this).remo…

知识图谱论文阅读(十七)【WWW2021】DGCN: Diversified Recommendation with Graph Convolutional Networks

本论文是很明显是基于KGCN的&#xff01; 如果不懂KGCN&#xff0c;可以看我上一篇博文 论文题目&#xff1a; DGCN: Diversified Recommendation with Graph Convolutional Networks 论文链接&#xff1a; 论文代码&#xff1a; https://github.com/tsinghua-fib-lab/DGCN 想…

PKU-3624

代码 //0-1背包问题 如果不使用循环数组&#xff0c;空间越界。#include <stdio.h>intmain(){ intn, v, i, j; intw[3403], p[3403]; intf[12881]; scanf("%d %d", &n, &v); for(i 1; i <n; i) scanf("%d %d", &a…

LeetCode 1309. 解码字母到整数映射

1. 题目 给你一个字符串 s&#xff0c;它由数字&#xff08;‘0’ - ‘9’&#xff09;和 ‘#’ 组成。 我们希望按下述规则将 s 映射为一些小写英文字符&#xff1a; 字符&#xff08;a - i&#xff09;分别用&#xff08;1 - 9&#xff09;表示。 字符&#xff08;j - z&am…

redis如何设置定时过期_redis补充6之Redis 设置过期时间

一般情况下&#xff0c;我们设置保存的缓存数据的时候都会设置一个过期时间。Redis 中有个设置时间过期的功能&#xff0c;即对存储在 Redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库&#xff0c;这是非常实用的。如我们一般项目中的 token 或者一些登录信息&…

知识图谱论文阅读(十八)【KDD2019】AKUPM: Attention-Enhanced Knowledge-Aware User Preference Model for Recommend

论文题目&#xff1a; AKUPM: Attention-Enhanced Knowledge-Aware User Preference Model for Recommendation 论文代码&#xff1a; 论文链接&#xff1a; 想法 什么叫折射到关系空间&#xff1f; &#xff08;添加了一个关系矩阵&#xff0c;但是关系矩阵为啥要加&#xf…

LeetCode 1304. 和为零的N个唯一整数

1. 题目 给你一个整数 n&#xff0c;请你返回 任意 一个由 n 个 各不相同 的整数组成的数组&#xff0c;并且这 n 个数相加和为 0 。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;[-7,-1,1,3,4] 解释&#xff1a;这些数组也是正确的 [-5,-1,1,2,3]&#xff0c;…

vue做混合式app_Vue+原生App混合开发手记#1

项目的大致需求就是做一个App&#xff0c;里面集成各种功能供用户使用&#xff0c;其中涉及到很多Vue的使用方法&#xff0c;单独总结太麻烦&#xff0c;所以通过这几篇笔记来梳理一下。原型图如下&#xff1a;路由配置主界面会用到一些原生App方法&#xff0c;比如验证用户身份…

Android入门第八篇之GridView(九宫图)

GridView跟ListView都是比较常用的多控件布局&#xff0c;而GridView更是实现九宫图的首选!本文就是介绍如何使用GridView实现九宫图。GridView的用法很多&#xff0c;网上介绍最多的方法就是自己实现一个ImageAdapter继承BaseAdapter&#xff0c;再供GridView使用&#xff0c;…

(十九)【AAAI2021】Knowledge-Enhanced Hierarchical Graph Transformer Network for Multi-Behavior Recommend

题目&#xff1a; Knowledge-Enhanced Hierarchical Graph Transformer Network for Multi-Behavior Recommendation 论文链接&#xff1a; 代码链接&#xff1a;https://github.com/akaxlh/KHGT 论文 时间戳放入到关系中&#xff0c;可以参考这篇《Heterogeneous graph trans…

LeetCode 1295. 统计位数为偶数的数字

1. 题目 给你一个整数数组 nums&#xff0c;请你返回其中位数为 偶数 的数字的个数。 示例 1&#xff1a; 输入&#xff1a;nums [12,345,2,6,7896] 输出&#xff1a;2 解释&#xff1a; 12 是 2 位数字&#xff08;位数为偶数&#xff09; 345 是 3 位数字&#xff08;位数…

pymysql保存数组_pymysql 读取大数据内存卡死的解决方案

背景&#xff1a;目前表中只有5G(后期持续增长)&#xff0c;但是其中一个字段(以下称为detail字段)存了2M(不一定2M&#xff0c;部分为0&#xff0c;平均下来就是2M)&#xff0c;字段中存的是一个数组&#xff0c;数组中存N个json数据。这个字段如下&#xff1a;[{"A"…

WPF学习笔记-第二周【基本笔刷】

书接上回&#xff0c;这一次&#xff0c;讲的是WPF中的基本笔刷&#xff0c;由于是菜鸟&#xff0c;就不多说了&#xff0c;继续帖示例代码&#xff1a;&#xff09; 第一部份 代码 第二章 基本笔刷 第一个 示例 VaryTheBackgroud P38 1 #regionVaryTheBackgroud P382 3 ///<…

知识图谱论文阅读(二十)【WWW2020】Heterogeneous Graph Transformer

题目&#xff1a; Heterogeneous Graph Transformer 论文链接&#xff1a; https://arxiv.org/abs/2003.01332 代码链接&#xff1a;https://github.com/acbull/pyHGT 论文 异构图研究之一&#xff1a; 使用元路径来建模异构结构 heterogeneous graphs 《Mining Heterogeneous…

LeetCode 1287. 有序数组中出现次数超过25%的元素

1. 题目 给你一个非递减的 有序 整数数组&#xff0c;已知这个数组中恰好有一个整数&#xff0c;它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 示例&#xff1a; 输入&#xff1a;arr [1,2,2,6,6,6,6,7,10] 输出&#xff1a;6提示&#xff1a; 1 < arr…