背景:
上一篇推荐系统实战中LR模型训练(一) 中完成了LR模型训练的代码部分。本文中将详细讲解数据准备部分,即将文本数据数值化为稀疏矩阵的形式。

  • 文本数据:
  • 稀疏矩阵:

实现过程:
文本数据格式如下:
用户ID / 物品ID / 收听时长 / 收听的时间点 / 性别 / 年龄段 / 收入 / 籍贯 / 物品名称 / 物品总时长 / 物品标签

LR模型在此处的目的是用户对某个物品(音乐)的点击率,本文中将通过用户对物品(音乐)的收听时长占比来表示用户对物品的喜好程度。本文中抽取的特征分为两类:

  • 用户特征(user_feature):性别、年龄段、收入
  • 物品特征(item_feature):物品名称

1.从原始数据中抽取相应的特征部分,得到dataset.tmp
代码如下:(1_fromMetaDataTofeatureData.py)

#coding=utf-8
import sysmeta_data = sys.argv[1]with open(meta_data, 'r') as fd:for line in fd:ss = line.strip().split('^A')if len(ss) != 11:continueuser_id = ss[0].strip()item_id = ss[1].strip()watch_time = ss[2].strip()total_time = ss[9].strip()#用户特征gender = ss[4].strip()age = ss[5].strip()income = ss[6].strip()#物品特征item_name = ss[8].strip()user_feature = '^A'.join([user_id, gender, age, income])item_feature = '^A'.join([item_id, item_name])label = round((float(watch_time) / float(total_time)), 1)final_label = '0'if label >= 1.0:final_label = '1'print '^B'.join([final_label, user_feature, item_feature])

得到的dataset.tmp部分数据如下图所示:

2.对dataset.tmp进行操作,数值化用户(user)特征,得到user_feature.data
代码如下:(gen_user_feature.py)

#coding=utf-8
import sysinput_file = sys.argv[1]#性别
# 0:女 1:男#年龄段
# 0-18   =  0
# 19-25  =  1
# 26-35  =  2
# 36-45  =  3
# 46-100 =  4#收入
# 0-2000 = 0
# 2000-5000 = 1
# 5000-10000 = 2
# 10000-20000 = 3
# 20000-100000 = 4user_feature_set = set()
with open(input_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel = ss[0].strip()user_feature = ss[1].strip()item_feature = ss[2].strip()user_feature_set.add(user_feature)for line in user_feature_set:user_id, gender, age, income = line.strip().split('^A')#genderindex = 0if gender == '男':index = 1gender_fea = ':'.join([str(index), '1'])#ageindex = 0if age == '0-18':index = 0elif age == '19-25':index = 1elif age == '26-35':index = 2elif age == '36-45':index = 3else:index = 4#gender偏移index += 2age_fea = ':'.join([str(index), '1'])#incomeindex = 0if income == '0-2000':index = 0elif income == '2000-5000':index = 1elif income == '5000-10000':index = 2elif income == '10000-20000':index = 3else:index = 4#gender和age偏移index += 7income_fea = ':'.join([str(index), '1'])print user_id, gender_fea, age_fea, income_fea

得到的user_feature.data部分数据如下图所示:

3.数值化物品特征
物品的特征主要通过物品名称来抽取,在本文中将运用jieba分词技术进行特征抽取和评分

第一步:物品名称去重,得到item.set
代码如下:(1_gen_item_set.py)

#coding=utf-8
import sysinput_file = sys.argv[1]item_feature_set = set()
with open(input_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel = ss[0].strip()user_feature = ss[1].strip()item_feature = ss[2].strip()item_feature_set.add(item_feature)for line in item_feature_set:item_id, item_name = line.strip().split('^A')print item_name

得到的item.set部分数据如下图所示:

第二步:jieba分词并打分,得到item的token:score列表(item_tokenlist.raw)
代码如下:(2_gen_item_tokenlist.py)

import sys
reload(sys)
sys.setdefaultencoding('utf-8')sys.path.append("./")
import jieba
import jieba.posseg
import jieba.analysein_meta_file = sys.argv[1]with open(in_meta_file, 'r') as fd:for line in fd:name = line.strip()token_score_list = []for x, w in jieba.analyse.extract_tags(name, withWeight=True):token_score_list.append('^A'.join([x, str(w)]))fea = '^B'.join(token_score_list)print ' '.join([name, fea])

得到的item_tokenlist.raw部分数据如下图所示:

第三步:对分词后的每一个token进行编号,得到tokenid_token.data
代码如下:(3_gen_uniq_token.py)

import sys
reload(sys)
sys.setdefaultencoding('utf-8')sys.path.append("./")
import jieba
import jieba.posseg
import jieba.analysein_meta_file = sys.argv[1]token_set = set()
with open(in_meta_file, 'r') as fd:for line in fd:name = line.strip()for x, w in jieba.analyse.extract_tags(name, withWeight=True):token_set.add(x)token_list = list(token_set)for tu in enumerate(token_list):print '     '.join([str(tu[0]), tu[1]])

得到的tokenid_token.data部分数据如下图所示:

第四步:结合第三步的结果tokenid_token.data将第二步item_tokenlist.raw中的token换成tokenid,进一步得到name_tokenid.fea
代码如下:(4_gen_item_tokenid_format.py)

#coding=utf-8
import sysin_token_dict_file = sys.argv[1]
in_item_tokenlist_file = sys.argv[2]#user_feature特征偏移:gender(2)+age(5)+income(5)
offset = 12token_dict = {}
with open(in_token_dict_file, 'r') as fd:for line in fd:ss = line.strip().split('       ')if len(ss) != 2:continuetokenid, token = sstoken_dict[token] = tokenidwith open(in_item_tokenlist_file, 'r') as fd:for line in fd:ss = line.strip().split(' ')if len(ss) != 2:continuename, ts_list_str = sstmp_list = []for ts in ts_list_str.strip().split('^B'):sss = ts.strip().split('^A')if len(sss) != 2:continuetoken, score = sssif token not in token_dict:continuetokenid = token_dict[token]tmp_list.append(':'.join([str(int(tokenid) + 12), str(round(float(score), 2))]))print '\t'.join([name, ' '.join(tmp_list)])

得到的name_tokenid.fea部分数据如下图所示:

第五步:得到物品名称和物品ID的对应数据name_id.dict
代码如下:(5_gen_itemid_name.py)

#coding=utf-8
import sysraw_input_file = sys.argv[1]item_info_set = set()
with open(raw_input_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel = ss[0].strip()user_info = ss[1].strip()item_info = ss[2].strip()item_info_set.add(item_info)for i_info in item_info_set:itemid, name = i_info.strip().split('^A')print '     '.join([name, itemid])

得到的name_id.dict部分数据如下图所示:

第六步:结合第四步和第五步的数据,得到item_id token_id的对应数据itemid_tokenid_fea.data
代码如下:(6_gen_itemid_tokenidfea.py)

#coding=utf-8
import sysname_id_dict_input_file = sys.argv[1]
name_tokenid_input_file = sys.argv[2]name_id_dict = {}
with open(name_id_dict_input_file, 'r') as fd:for line in fd:ss = line.strip().split('       ')if len(ss) != 2:continuename = ss[0].strip()itemid = ss[1].strip()name_id_dict[name] = itemidwith open(name_tokenid_input_file, 'r') as fd:for line in fd:ss = line.strip().split('       ')if len(ss) != 2:continuename = ss[0].strip()tokenid_fea = ss[1].strip()if name not in name_id_dict:continueitemid = name_id_dict[name]print '\t'.join([itemid, tokenid_fea])

自此终于得到数值化后的物品特征数据itemid_tokenid_fea.data,如下图所示:

4.将数值化后的用户特征数据和物品特征数据组合起来,得到最终的训练数据dataset.final
代码如下:(final_merge_feature.py)

import sysuser_fea_file = sys.argv[1]
item_fea_file = sys.argv[2]
base_file = sys.argv[3]user_dict = {}
with open(user_fea_file, 'r') as fd:for line in fd:ss = line.strip().split(' ')if len(ss) != 4:continueuserid, gender_fea, age_fea, income_fea = ssuser_dict[userid] = ' '.join([gender_fea, age_fea, income_fea])item_dict = {}
with open(item_fea_file, 'r') as fd:for line in fd:ss = line.strip().split('\t')if len(ss) != 2:continueitemid, item_fea = ssitem_dict[itemid] = item_feawith open(base_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel, user_info, item_info = ssuserid = user_info.strip().split('^A')[0]itemid = item_info.strip().split('^A')[0]if userid not in user_dict:continueif itemid not in item_dict:continueprint ' '.join([label, user_dict[userid], item_dict[itemid]])

最终得到的训练集数据dataset.final如下图所示:

自此完成了将文本数据数值化为稀疏矩阵工作,最终得到的数据dataset.final可以直接输入到推荐系统实战中LR模型训练(一)LR模型中进行训练,训练结果如下图所示:

推荐系统实战中LR模型训练(二)相关推荐

  1. 推荐系统实战中LR模型训练(一)

    背景: 在"批量导入数据到Redis" 中已经介绍了将得到的itema item1:score1,item2:score2-批量导入到Redis数据库中.本文的工作是运用机器学习L ...

  2. 电影推荐系统(数据预处理+模型训练+预测)

    博客源地址 电影推荐思路   利用doc2vec做电影推荐,其实核心就是比较两部电影介绍文本之间的向量相似程度.自然语言处理中的分布式假设提出了"某个单词的含义由它周围的单词形成" ...

  3. 在LiCO中实现模型训练

    为了获得更加稳健的深度学习训练模型,一些庞大的训练在个人电脑上无法实现,本文主要以在LiCO中实现tensorflow训练模型为例,为读者提供参考,若文档中存在错误,请读者提出宝贵的意见. 文章目录 ...

  4. 黑马NLP实战 --- 新闻分类模型训练

    关于<黑马程序员>课程中NLP中 训练新闻分类模型 最近在学习NLP的相关知识,找了资料比较全的黑马程序员中讲解NLP的课程,可是其中有一部分实战 新闻主题分类实战项目中,我发现黑马程序员 ...

  5. 推荐系统(二)GBDT+LR模型

    推荐系统(二)GBDT+LR模型 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 在写这篇博客之前,一度纠结许久,到底该不该起这个标题,因为把GBDT+LR模型放在推荐系统系列里,似乎有些不妥,如 ...

  6. LR和GBDT模型训练

    [待补充] 数据集和训练模型的意义含义: 数据集给出发博者 和 阅读者之间的各种关系,历史点击.互动.曝光等数据,去预测 给阅读者 曝光一个 发博者的内容,这个阅读者是否回去互动. 一.LR模型训练 ...

  7. gpu处理信号_在PyTorch中使用DistributedDataParallel进行多GPU分布式模型训练

    先进的深度学习模型参数正以指数级速度增长:去年的GPT-2有大约7.5亿个参数,今年的GPT-3有1750亿个参数.虽然GPT是一个比较极端的例子但是各种SOTA模型正在推动越来越大的模型进入生产应用 ...

  8. 从源码到实战:BERT模型训练营

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 开课吧教育 方向:NLP 之 BERT实战 都说BERT模型开启了NLP的新时代,更有" ...

  9. 深度学习推荐系统实战笔记

    小广告 (欢迎大家关注我的公众号"机器学习面试基地",之后将在公众号上持续记录本人从非科班转到算法路上的学习心得.笔经面经.心得体会.未来的重点也会主要放在机器学习面试上!) 序 ...

最新文章

  1. 作价20亿美元!英特尔收购以色列AI芯片公司Habana Labs
  2. 华为网络技术培训笔记之常用网络工具(二)
  3. sublime text 3 使用过程总结记录
  4. Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值
  5. linux lvs公网ip,Linux集群架构(2)LVS介绍、LVS的调度算法、NAT模式搭建、 DR模式、keepalive...
  6. 设计模式---接口隔离模式之门面模式(Façade)
  7. 复合型法matlab,复合形法程序出错求大神改错急急急
  8. Intel Edison学习笔记(二)—— 入门环境配置
  9. 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求
  10. linux(ubuntu) 搭建java程序运行环境
  11. Maven的下载和安装
  12. 修改PT622光猫导致的一系列故障
  13. html控制word打印在一张页面,HTML文件到WORD文档双面打印三步曲
  14. ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with ...)
  15. esp8266使用TF卡并读写数据(基于arduino)
  16. TurboMail邮件系统图片签名档功能
  17. TCP通信协议基本操作
  18. 什么编程语言的开发者平均年薪高达94万?
  19. p7510 rom android 8,三星p7510 recovery卡刷rom 刷机教程
  20. 如何查看别人网站的访问量

热门文章

  1. Windows离线安装IPy库
  2. 数据集扩增--水平和垂直翻转
  3. 华为交换机默认vlan都是通的吗_华为交换机配置VLAN
  4. cad转换成pdf格式之后如何设置其背景色为白色?
  5. 三鹿事件对中国经济的打击将远远超出预料
  6. MinGW的安装及配置
  7. 【Excel】单元格输入换行符、替换换行符
  8. ios5.1.1旧版软件下载_将夜记老版本下载-将夜记旧版下载v1.1.0 安卓版
  9. 企业各个职位英语缩写
  10. Android动画(实现抛物线运动)