-欢迎加入AI技术专家社群>>
这篇文章主要讲应用,不讲原理。通俗的说,word2vec是一种将『词』变成向量的工具,在nlp的场景中『词』是显而易见的,但是在有些时候,什么可以看做『词』和『文档』就不那么容易了。
前东家工作的时候,有一个个性化推荐的场景,给当前用户推荐他可能关注的『大V』。对一个新用户,此题基本无解,如果在已知用户关注了几个『大V』之后,相当于知道了当前用户的一些关注偏好,根据此偏好给他推荐和他关注过大V相似的大V,就是一个很不错的推荐策略。所以,如果可以求出来任何两个V用户的相似度,上面问题就可以基本得到解决。
我们知道word2vec中两个词的相似度可以直接通过余弦来衡量,接下来就是如何将每个V用户变为一个词向量的问题了。巧妙的地方就是如何定义doc和word,针对上面问题,可以将doc和word定义为:
1 2 |
word -> 每一个大V就是一个词 doc -> 根据每一个用户关注大V的顺序,生成一篇文章 |
由于用户量很大(大约4亿),可以将关注word个数少的doc删掉,因为本身大V的种类是十万级别(如果我没记错的话), 选择可以覆盖绝大多数大V的文章数量就足够了。
在商品推荐的场景中,竞品推荐和搭配推荐的时候都有可能需要计算任何两个商品的相似度,根据浏览/收藏/下单/App下载等行为,可以将商品看做词,将每一个用户的一类行为序看做一个文档,通过word2vec将其训练为一个向量。
同样的,在计算广告中,根据用户的点击广告的点击序列,将每一个广告变为一个向量。变为向量后,用此向量可以生成特征融入到rank模型中。
在nlp的任务中,可以通过将词聚类后,生成一维新的特征来使用。在CRF实体识别的任务中,聚类结果类似词性,可以作为特征来使用。
在依存句法分析的任务中,哈工大ltp的nndepparser则是将词向量直接作为输入。
具体论文『A Fast and Accurate Dependency Parser using Neural Networks』
当我们将一个文档变成一个向量之后,如何根据余弦/欧氏距离快速得到其最相似的topk个文章,是工程实现上不得不考虑的问题。例如线上可以允许的时间是5ms以内,如果文章数量往往上万或者更多,O(n)的方式计算明显不可接受了。
如果文章更新的速度很慢,可以通过离线的方式一天或者几天计算一次,导入redis(或者别的)提供线上快速查询。 但是如果文章实时新增,并且大量流量来自新文章,这个问题就要好好考虑一下。
一般可以通过PQ, kd-tree、simhash、聚类等方式解决,选择不同的方式和具体的推荐场景、数据分布有关。
↓ 点击阅读原文,进入学院