使用Jaccard系数计算新闻相似度, 实现相似新闻推荐
- 最近想写一个推荐系统的Api, 有个性化推荐, 相似推荐, 热度推荐等, 于是就使用Django写了一个新闻网站当靶场, 目前实现了一个简单相似新闻推荐,记录下来.
先看看效果
这个是主页面, 我们现在点击一个新闻
这篇文章是前阵子报道罗老师的一篇文章, 我们看看会给我们推荐什么?
系统会推荐和罗老师相关的一些新闻
实现过程
1.后端使用Django
2.爬取新闻后使用jieba分词提取新闻关键字
3.计算新闻之间的杰卡德系数
4.将结果存储到数据库
5.用户点击相关新闻,查询后并渲染到页面上
一、使用jieba进行分词
def get_key_words(self, data_info, data_id):
"""
调用jieba分词来处理数据
:param data_info:数据
:param data_id:数据索引
:return: {id: 分词的数据}
"""
keywords = jieba.cut(data_info, cut_all=False)
kws = list()
for kw in keywords:
if kw not in self.stop_words_list and kw != " " and kw != " ":
kws.append(kw)
_result = (data_id, ",".join(kws))
return _result
二、计算相关性
def get_correlation(self, new_data):
"""
计算相似度
:param new_data: 新数据 (id, content)
:return:
"""
news_cor_list = list() # 将结果保存到列表
data = self.load_data() # 加载数据中已有的数据{id: "分词的数据"}
print(data)
new_id, new_tags = new_data
new_tags = set(new_tags.split(","))
for data_id in data.keys():
data_tags = set(data[data_id].split(","))
cor = (len(new_tags & data_tags)) / len(new_tags | data_tags)
print(new_tags, data_tags, cor)
if cor > 0.0:
news_cor_list.append([new_id, data_id, format(cor, ".2f")]) # [新数据索引, 原数据索引, 相关性数值]
return news_cor_list
其中关键部分代码:
cor = (len(new_tags & data_tags)) / len(new_tags | data_tags)