关联的相似文章推荐阅读,怎么写一个自己的推荐算法?

我在之前的文章里也提到了我给每一篇文章加了类似“你也喜欢”的列表,今天就把处理这个问题的解决方法分享出来。

这类推荐如果需要完美解决,需要依靠大数据和推荐算法来完成,坦白说这不是我目前能够完成的。

如果是使用一些接口或工具,无论如何也绕不开需要对外暴露一定的数据或方法给第三方。

我原本的目的仅仅是在文章内部增加一些关联的其他文章,并相对友好的反馈给用户, 所以最后决定用我自己想到的“傻”方法,具体以下面的示例代码来说一下思路:

首先,通过所有文章列表利用nodejieba分词库将所有文章的关键词进行提取:

const nodejieba = require('nodejieba')
const allArticle = await Model.findAll()

let hotWords = nodejieba.extract(allArticle, 200)
//取前出现频率最高的200个关键词

其次,将每篇文章通过热词表找出另一篇也同样含有该热词的文章:

这里通过一个函数getRelatedArticleList来通过热词列表来获取相关的文章:

const getRelatedArticleList = async (article) =>{
    let relatedArticleList = []
    // 关联文章列表
    for(let i =0;i<hotWords.length;i++){
        if(relatedArticleList.length===5) break;
        //关联文章数超过5,退出循环
        let word = hotWords[i].word
        //获取热词字符串
        if(article.title.includs(word)){
            //如果文章标题中含有热词
            let res = await Model.findOne({
                where:{
                    title:{
                        like:`${word}`
                    }
                }
            })
            //查找含有该热词的其他文章
            if(res && res.id!===article.id){
            // 如果有结果,并且id和本文id不一致
              relatedArticleList.push(res.id)  
            }
        }
    }
    return relatedArticleList
}

最后注意一点是,这个过程相当的消耗资源,所以在文章展示出来的时候就应该处理完逻辑得到关联文章的数据并持久化。

虽然事实上这不是一个完美的推荐的解决方案,不过我想对于绝大多数和我一样诉求的站长,完全可以通过这种相对简单易行的算法来给爬虫和用户展示关联文章。