前言

互联网中,对一个内容实体的建模,如新闻,商品,通常有两个方向:1,content-based,如该文章属于哪个类别、文章标题、关键字、作者、新闻字数等等信息,这些属于从内容上描述文章信息;2,另一块是action-based,即从用户与内容之间的各种不同行为来建模用户的关系。今天我们就来重点关注下基于用户行为的内容表示的一些有意思的东西。

协同过滤

协同过滤相信很多做推荐的人经常接触的一个算法,是一种经典的集体智慧的算法:在大量的人群行为数据中收集信息,得到大部分人群的统计结论来表示人群中某种趋势,或者我们称为共性的部分。

为帮助理解,这里简单举几个栗子:比如我等屌丝程序猿,大部分会是下面这种情况:

除了程序猿的装扮,程序猿的timeline很多时候也有下面这个特点:

特点人群,会更大几率对他相关或者有兴趣的内容产生行为,同理,转换下用户和内容的彼此身份,如果某个内容,被相似的人群产生行为是否能够书名这些内容有一些实体会引起这一类人群的兴趣,这就是action-based的假设前提,action-based和content-based属于一个硬币的两面,应该综合考虑才能算是比较合理的某个内容实体的表征方式。

很显然一些公共的信息如一个出生湖北武汉,年纪29岁的未婚女演员并不能表征她就是刘亦菲,但是如果加上她的action信息,她参演过功夫之王、铜雀台、四大名铺等等那就八九不离十了。

是的,content-based的数据就是那么重要,而协同过滤就是使用的比较多的方法

基于用户的协同过滤

一句话描述基于用户的协同过滤,就是找到和目标用户最相思的用户,然后把该用户产生过的物品,收集为候选列表,滤除掉已产生行为物品,并考虑用户相似度为权重,进行加权排序,大体如下:

对用户A进行推荐,因为与用户行为相似度较大[1,1,0,0]与[1,1,0,1],其相似度为sim(A,D),B,C用户[0,0,1,0],其相似度为sim(B,c),其值为0,所以最终对用户A的推荐为商品D。

基于Item的协同过滤

一句话描述基于Item的协同过滤就是计算Item的相似度,然后推荐用户已购买的商品相似度比较大的物品。

很明显商品D与商品A的和商品B的相似度都比较高,滤除已产生行为商品,对用户A推商品D。

基于模型的协同过滤

基于模型的协同过滤的方法,大体是用模型来替代比较粗糙的相似度计算法方式,这里描述下比较经典的Matrix Factorization方法, 前面基于用户和Item的方法在实际场景中会出现数据稀疏、计算复杂的问题,Matrix Factorization是一个比较好的方法,采用了矩阵分解的思路,将原始的用户对Item的行为矩阵转换为两个dense矩阵用来表示用户、Item的隐向量表示,然后在隐向量空间来度量用户或者Item的相似度

等号左边的矩阵记录不同用户对不同商品的行为分布,通常在实际系统中,矩阵很大,而且通常十分稀疏,Matrix Factorization方法就是将这个矩阵分解为两个比较小的矩阵,分别为用户和Item的隐向量矩阵,然后利用这些隐向量矩阵计算用户对Item的偏好得分,或者计算Item与Item或者用户与用于之间的相似性,在不同场景下来进行各种需求的计算。

利用Word2Vec建模共现关系

前面提到了使用协同过滤来建模,得到action_based的方式,那么是否有其他的方法呢? 回归到数据来源,用户对各种不同的行为如果组成一个有一个的序列,如果我能建模序列内,元素之间的相似度,是不是就能很好的表征这些元素。好吧,大家可能发现了,这tm不就是Word2Vec吗?每个序列不就是Word2Vec的语料语句吗?是的,就是这样, 其实说了前面许多,什么协同过滤,Matrix Factorization,就是想引出这个,使用Word2Vec来建模Action数据,下面我将详细描述,我是怎么在实际数据中做这些尝试的。

Word2Vec原理

Word2Vec的原理,有很多文章都讲过了,这里就不详细描述了,想进一步了解的可以去Google一下, 这里一句话解释下:利用cbow或skip-gram收集窗口上下文信息,来建模词与词之间的共现关系。

Tag2Vec尝试

用于阅读资讯相关内容,通常在一个有效时间内,如一个session,所有文章会形成一个文章序列,通常文章与Tag词的映射,(何为Tag?如

数据收集

一个Session数据的收集理论上应该包括Tag词序列,还有先后关系,才能比较合理的建模一个可用的Tag2Vec模型,但是,数据收集难度问题,

我们这里使用的是用户每天在Tag词上的行为序列,也没考虑Tag词的先后,所以这里其实有一个风险,可能达不到我们预先想要的类似Word2Vec的结果,因为Word2Vec理论上是有一个window size限制,然后窗口了上下文来和中间词做一个推断,其实质是一个分类问题(正样本为中间词,负样本为窗口外词), 所以其实这里如果没有时间先后,还有窗口太大为天,本身在模型上是有风险的,但是,又稍微一想,其实语义的依赖关系本身就也有可能不在windows size内,随机性的顺序,丢失的信息应该不多,考虑了很多,和小伙伴也讨论,感觉问题不大,直接先上看看,最后的数据如下:

需要说明的是这里的数据做过基本的去脏处理,包括设置阈值,排除行为过少的用户,大概能拿到500w+的数据。

模型训练

Tag2Vec on Gensim

在Gensim上实现Word2Vec很容易,只需要几行就可以完成:

#-*-coding:utf-8-*-

from gensim.models import word2vec

import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

sentence = word2vec.LineSentence(

'../data/tag_day_ok.csv'

)

model = word2vec.Word2Vec(sentences=sentence, size=50, workers=4, min_count=5)

news_w2v = '../data/tag_word2vec.model'

model.save(news_w2v)

Tag2Vec on TensorFlow

现在在TensorFlow实现的WordVec,效果不是很好,这里先占个坑,后面等搞好了再来填。

Tag2Vec结果

这里我们对Tag2Vec做一些展示:

#-*-coding:utf-8-*-

import gensim

import matplotlib.pyplot as plt

from sklearn.manifold import TSNE

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

model = gensim.models.Word2Vec.load("../data/tag_word2vec.model")

tag_id_name = {'UNK': "UNk"}

# tag_id=>tag_name

with open("../data/t_tag_infos.csv", "r") as fread:

for line in fread.readlines():

tag_id_name_list = line.split("\t")

tag_id = tag_id_name_list[0]

tag_name = tag_id_name_list[1].strip()

tag_id_name[tag_id] = tag_name

tsne = TSNE(

perplexity=30,

n_components=2,

init='pca',

random_state=1,

n_iter=5000,

method='exact')

def plot_with_labels(low_dim_embs, labels, filename='tsne.png'):

assert low_dim_embs.shape[0] >= len(labels), 'More labels than embeddings'

plt.figure(figsize=(18, 18)) # in inches

for i, label in enumerate(labels):

x, y = low_dim_embs[i, :]

plt.scatter(x, y)

plt.annotate(

label,

xy=(x, y),

xytext=(5, 2),

textcoords='offset points',

ha='right',

va='bottom')

plt.savefig(filename)

X = model[model.wv.vocab]

X_tsne = tsne.fit_transform(X[:500])

labels = model.wv.vocab.keys()[:500]

labels = [tag_id_name[i].decode('utf-8') for i in labels]

plot_with_labels(X_tsne, labels)

tag_name_id = dict(zip(tag_id_name.values(), tag_id_name.keys()))

def get_topk(tag_word, model, topk=50):

nearest_list = model.wv.similar_by_word(tag_name_id[tag_word], topn=topk)

nearest_words = [tag_id_name[i[0]] for i in nearest_list]

# nearest_words_score = [tag_id_name[i] for i in nearest_list]

print "near the {0}, the top {1} words are {2}".format(

tag_word, topk, ' '.join(nearest_words))

get_topk("知乎", model)

以下是一些例子, 感觉还是蛮有意思的:

如王者荣耀,相似度最高的是天美工作室, 然后就是很多相关的英雄以及一些主播信息,还有一些有意思的如宋喆、车晓、张静初、郑则仕,这类看起来相关性不大的实体,应该是因为看王者荣耀的小伙伴们更偏向于娱乐化的新闻,因此更优可能露出车晓、张静初、宋喆这些娱乐圈人物。

500个tag的t-sne分布:

Tag2Vec如何使用?

Tag2Vec产生的向量表示,原则上可以用来表征Tag词,由于数据来源于Action,可以加上Content-based的数据,然后放在诸如CTR模型,在文章点击率预估,又或者模型的部分Feature,提升模型准确性;还可以在一些相关文章推荐时,通过Tag2Vec来露出其他相关的Tag,推荐这些Tag的文章;甚至可以和word2vec相同的用法,作为embedding的一种初始化表示,在任务中retrain这些参数。

所有代码都在

python word2vec 移植_真实资讯语料下的Word2Vec的迁移实践:Tag2Vec相关推荐

  1. ubuntu导入python的包_在ubuntu环境下怎么利用python将数据批量导入数据hbase

    斯蒂芬大帝 能够单条导入就能够批量导入配置 thriftpython使用的包 thrift个人使用的python 编译器是pycharm community edition. 在工程中设置中,找到pr ...

  2. python 获取文件名_真实需求 | Python+os+openpyxl 批量获取Excel的文件名和最大行数...

    1. 提出需求 这已经不知道是粉丝问我的第几个办公自动化的问题了,并且这些问题都是大家在学习和工作中碰到过的真实问题场景.其实从下图中已经可以很明确的看出别人的需求了,我这里就不用在赘述了,下面直接上 ...

  3. python没有联网_无网环境下的 Python 开发指南

    说起有关 Python 的指南,便一定得提到 K 神创建的『Python最佳实践指南』,英文名字是『The Hitchhiker's Guide to Python!』.毫不夸张地说,K 神创建的指南 ...

  4. python智慧城市_智慧城市背景下Python机器学习项目实战案例分享

    首先,何为智慧城市?智慧城市的"智慧"源自何处? 智慧城市的特征在于运用大数据和数字技术提高居民生活质量. 机构获得的数据越全面.越实时,它们就越有能力观测事件发生的详情.分析需求 ...

  5. python的字符串_百度资讯搜索_python的字符串

    澎湃新闻 8小时前该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现快速生成 Python 文档字符串的功能. Visual Studio Code(简称 VS Code)是一个由 ...

  6. windows10怎么安装python第三方库_怎么在windows下安装python第三方包

    python第三方包的windows安装文件exe格式, 这上面有很多python第三方包的二进制安装文件,包括32位和64位的.下载安装就ok了! 这下面有很多python第三方包的二进制安装文件, ...

  7. python版本切换_如何在cmd下切换不同版本的Python

    (1)分别安装 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官网下载的) 顺序无所谓(为了看着方便,我把安装路径修改统一了) (2)配置 ...

  8. python 复数幂_在什么情况下Python复数求幂会抛出溢出错误?

    Python整数值可以自动提示为long,以获得任意精度:>>> (10**300)**2 100000000000000000000000000000000000000000000 ...

  9. python打蛇_页高速缓存(下)_Linux系统编程第 3 期:文件I/O缓存与内存映射视频课程_嵌入式开发视频-51CTO学院...

    <嵌入式工程师自我修养>自学系列教程 一线嵌入式工程师精心打造,嵌入式学习路线六步走: 第 1 步:Linux三剑客(更新完毕)零基础玩转Linux+Ubuntu Git零基础实战:Lin ...

最新文章

  1. 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错
  2. 赫夫曼编码(基于赫夫曼树的实现)
  3. Gartner 2019年超融合魔力象限:新增深信服,国内华为、华云在榜
  4. 传2020年苹果Mac将用自制芯片
  5. JDK7 AIO介绍
  6. 每个人的宿命都是从文本走向二进制,你也不例外 !
  7. Python3空字符串和len()函数
  8. 37 Reasons why your Neural Network is not working
  9. 初学Vue.js,从头来过~
  10. D. Flowers
  11. TCP协议连环12问
  12. CCF2018-3-2 碰撞的小球
  13. 《南溪的目标检测学习笔记》——权重初始化
  14. 从 VI 编辑器谈操作系统起源及编辑器本质
  15. 易语言5.9 免狗完美版下载+安装教程
  16. vue-element-admin 项目更换浏览器图标与标头
  17. Qt编译报错:Error in Util.asciify(build-Project1_msvc-Desktop_Qt_5_8_0_MSVC2015_32bit_qt_58_w-Debug)
  18. HTML5 codecademy
  19. 【车间调度】帝国企鹅算法求解柔性车间调度问题【含Matlab源码 1991期】
  20. 心はちょっと疲れた、誰も片隅に休んで……作者の宝物は

热门文章

  1. 通过改变innerHTML的内容,动态增加选择项
  2. 二级VB培训笔记05:文件操作
  3. VB讲课笔记01:VB6.0安装与启动
  4. Java案例:编译器生成桥方法
  5. 【codevs3732】【BZOJ3751】解方程,hash+秦九韶算法
  6. 【codevs1048】【codevs115406TG】石子归并、能量项链,序列dp的典型题目
  7. 计算机网络中的所谓资源是指硬件软件,计算机网络中的所谓“资源”是指硬件、软件和______资源。A.通信B.系统C.数据D.资金...
  8. 2017.9.24 虔诚的墓主人 思考记录
  9. Android基础知识学习
  10. 6416与aic23进行语言数据采集和处理的程序beta版