推荐系统学习笔记——十二、结巴分词用于内容相似推荐
十二、结巴分词用于内容相似推荐
计算物品最相似的其他物品,直接用于I2I相似推荐,或者U2I2I推荐
以文章为例,进行内容相似推荐,一般需要以下几个步骤:
内容获取
- 一般包含ID、标题、介绍、详情等,存储于MySQL数据库中。批量查取这些内容,进行下一步
中文分词:提取关键词
- 中文没有空格进行分词,所以需要手动分词,使用TFIDF技术,jieba分词
- 结巴分词,中文分词组件,三种模式:全模式、精确模式、搜索引擎模式。一般用精确模式。
- 有一些词是不需要的,比如我、一些等等。结巴分词提供了关键词提取技术
- 基于TF-IDF算法的关键词提取
- import jieba.analysis
- jieba.analysis.extract_tags(sentence,topK=20,withWeight=True,allowPOS=())
- sentence:待分词的句子
- topK=20:返回20个权重最大的关键词
- withWeight=True:是否一并返回关键词的权重,默认为False,一般选择True
- allowPOS=():仅包含指定词性的词,默认为空,即不筛选
- jieba.analysis.TFIDF(idf_path=None) 新建TFIDF实例,idf_path为IDF频率文件
- 通过这种方式,过滤掉没有意义的词,并获取关键词的权重。得到结果之后,有两个分支,一个是Doc2Vec,一个是Word2vec
Doc2Vec:平均、加权平均
- 得到关键词和权重之后,计算文章的数字向量,两种方法:平均、加权平均
- 平均:[1,0,0,1,0]
- 加权平均:[0.8, 0.6, 0, 0.3, 0.5]
- 这样就把文章的多个关键词和权重变成一个向量,这是多个词的组合得到的一个结果
- 有缺点:只能实现精确匹配。原来的文章中有“推荐系统”关键词,那目标文章中也有“推荐系统”才能被匹配到
Word2vec:语意扩展
- 可以发现语意的关系,比如推荐系统的文章中经常出现大数据,那么推荐系统文章下面的推荐也会有大数据的文章
- 实现:
- 自己训练一个Word2vec,比如Spark Word2vec,
- Spark官网——Programming Guides ——MLlib(Machine Learning)进入spark的机器学习库,点击Extracting,transforming and selecting features进入提取、转换和选择特征,找到Word2vec,看例子
- 问题:数据量小的话,训练结果不是很好,不能发现相关语意的词
- 使用开源的,比如腾讯的Word2vec
- ai.tencent.com/ailab/nlp/embedding.html
- 腾讯AI实验室,根据百度百科、维基百科得到的
- 数据有两列,一列是词,一列是向量,下载可以直接用
- 可以得到字面不等、语意相关的词,用于推荐系统有很好的泛化性
- 自己训练一个Word2vec,比如Spark Word2vec,
TopN相似近邻搜索
得到每篇文章的向量之后,进行相似近邻搜索,输入一篇文章,计算相似得到TopN。方法有两种:scipy余弦相似度、LSH局部敏感哈希
- scipy余弦相似度,直接算出相似度,
- scipy.spatial.distance.cosine(u,v)
- u,v都是一维数字数组,
- scipy库是C实现的,效果比python实现效果好。
- 有问题:需要自己实现每篇文章和其他文章的相似度,再排序找出TopN
- scipy.spatial.distance.cosine(u,v)
- LSH局部敏感哈希
- spark官网——Programming Guides ——MLlib(Machine Learning)进入spark的机器学习库,点击Extracting,transforming and selecting features进入提取、转换和选择特征,找到Locality Sensitive Hashing局部敏感哈希
- 局部敏感哈希,一种重要的哈希算法,一般用于聚类、相似近邻搜索
- 把一万篇文章,分到多个分桶,再分桶中计算相似
redis缓存
把相似近邻搜索的TopN文章,存储在redis中,key是文章ID,value是TopN文章ID的list
Flask/Java Web服务
根据redis中存储的文章ID列表,查询文章并返回文章列表,实现内容相似推荐