上面的做法的本质问题是人为的定义了一个中间属性层,使得不论是基础数据映射到中间层,还是具体应用通过中间层数据进行规则匹配,都存在很大的误差。所以我们的做法是去掉这个中间层,通过机器学习方法直接通过基础数据映射到个性化应用中。具体方式为:
(1)每个应用保留多个维度的用户数据,如表1。
表1 多维度用户数据示例
(2)将用户在每个应用中的数据进行整合,形成用户向量P。
(3)使用基于用户的协同过滤方法进行新用户推荐。基于用户的协同过滤的思想是当一个用户A 需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A 没有听说过的物品推荐给A。
第一步,找到相似兴趣的其他用户:
第二步,根据相似用户的喜好进行推荐:
(www.xing528.com)
对于新用户,往往没有什么行为,所以通过第一步中的行为进行相似度计算往往没有结果。所以我们用前面提到的跨应用的数据来解决这个问题。
每个用户可以通过第一步的结果形成用户向量,计算用户间的距离。由于不同应用下不论是类别还是标签,都不统一,比如有些应用下称为“搞笑”,有些称为“笑话”,标签上更加五花八门,比如有些标签是“范冰冰”,有些是“范爷”。需要转化成词向量才能方便而准确地计算距离。
先介绍一下词向量的定义。一种最简单的词向量是one-hot representation,就是用一个很长的向量来表示一个词,向量的长度是词典D 的大小N,向量的分量只有一个为1,其他全为0,1 的位置对应该词在词典中的索引。这种词向量表示的缺点是容易受维数灾难的困扰。另一种词向量是Distributed Representation,它最早是Hinton 于1986年提出来的,可以克服one-hot representation 的上述缺点。其基本想法是通过训练将某种语言中的每个词映射成一个固定长度的短向量。所有这些向量构成一个词向量空间,每个向量是该空间中的一个点,在这个空间上引入“距离”,就可以根据词之间的距离来判断它们之间的(词法、语义上的)相似性了。如何获取Distributed Representation 的词向量呢?有很多不同的模型可以用来估计词向量,包括有名的LSA、LDA 和神经网络算法。Word2Vec 就是使用度比较广的一个神经网络算法实现的词向量计算工具[1]。
Word2Vec 是google 在2013年推出的一个NLP 工具,它的特点是将所有的词向量化。该工具已经开源。Word2Vec 中最重要的两个模型是CBOW(Continuous Bag-of-Word)模型和Skip-gram(Continuous Skip-gram)模型,两个模型都包含三层:输入层、投影层、输出层。CBOW 模型的作用是已知当前词Wt 的上下文环境(Wt-2,Wt-1,Wt+1,Wt+2)来预测当前词,Skip-gram 模型的作用是根据当前词Wt来预测上下文(Wt-2,Wt-1,Wt+1,Wt+2)。在模型求解中,和一般的机器学习方法类似,也是定义不同的损失函数,使用梯度下降法寻找最优值。Word2Vec 模型求解中,使用了Hierarchical Softmax 方法和Negative Sampling 两种方法。通过使用Word2Vec,我们可以方便地将词转化成向量表示,让计算机和理解图像中的每个点一样,数字化词的表现[2]。
所以在目前场景下,基于Distributed Representation的词向量可以更好地解决跨应用标签不一致的问题。为了训练一个比较好的词向量,我们实践中抓取了3 000 多万微信文章作为训练,词向量本身不容易分辨好坏,所以通过抽查近距离词来看结果:
范爷→范冰冰:0.840,神仙姐姐:0.762,唐嫣:0.753
梅西→内马尔:0.772,苏亚雷斯:0.732,巴萨:0.722
通过词向量的方式,可以正确计算出字面上看似无关,但含义相似的词之间的距离,进而可以更加准确地计算用户之间的距离。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。