博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的计算文章相似度功能!
阅读量:5867 次
发布时间:2019-06-19

本文共 1961 字,大约阅读时间需要 6 分钟。

在做文章系统的时候,很多时候需要为这篇文章推荐最相近的文章。

解决思路是:给文章设定关键词然后模糊查询进行匹配。找到包含这个关键词的标题,然后给显示出来,作为最接近的文章。

但是有问题:这样的文章,排列顺序并不是我们想要的。

例如:两篇文章:第一篇:“用灵芝泡茶的功效”,第二篇:“泡茶的功效与作用”。我们发布一篇文章设定的关键词是:“茶”“功效”。

通过这样进行匹配,查询出来的结果是包含“茶”和“功效”的所有文章。

在显示上,第一篇排在第二篇的上面。

但是:很明显第二篇文章比第一篇的相似度更高。对“茶”和“功效”的相似度更高。

那么,如何做到最匹配的文章呢?

我想到一个简单的方法:计算关键词在标题上出现的位置的大小进行排序;

$words = "茶,功效";$oTitle = "用灵芝泡茶的功效";$oTitleTwo = "泡茶的功效与作用";echo(strpos($oTitle,'茶'))."
";echo(strpos($oTitle,'功效'))."
"; echo "

";echo(strpos($oTitleTwo,'茶'))."
";echo(strpos($oTitleTwo,'功效'))."
";echo "

";

输出的结果:

12

18


3

9

然后计算结果:

第一篇:12+18 = 30,第二篇:3+9 = 12;

让后用这个从小到大排序;就完成了一个简单的相似度排序。

示例代码:

$words = "茶,功效"; $where['title'] = $this->createArr($words); $keywordsList = $keywordsDB->where($where)->select();foreach($keywordsList as $k => $v){    $keywordsList[$k]['poslike'] = $this->posLike($words,$v['title']);};//array_multisort(array_column($keywordsList,'poslike'),SORT_DESC,$keywordsList);array_multisort(array_column($keywordsList,'poslike'),SORT_ASC,$keywordsList);foreach($keywordsList as $v){    echo "
".$v['poslike']."---".$v['id']."---".$v['title'];};

获取相似度:

/* * 计算出现的位置来判断相关性 * 计算出 $words依次在 $str出现的位置 * $words 关键词字符串 用 , 隔开 * $str 字符串 */private function posLike($words,$str){    $sum = 0;    $wordsArr = explode(',',$words);    foreach($wordsArr as $v){        $sum += strpos($str,$v);    };    return $sum;}

 生成查询数组:

/* *     生成模糊查询的数组 */private function createArr($words){    $wordsArr = explode(',',$words);    $whereArr = array();    foreach($wordsArr as $k=>$v){        $arr = array();        if(!$v)unset($wordsArr[$k]);         array_push($arr,'like');        array_push($arr,'%'.$v.'%');        array_push($whereArr,$arr);    }    return $whereArr;}// $where['title'] = array('like','%'.$words.'%');// $where['title'] = array('like',array('%'.$words.'%','%'.$wordss.'%'));// $where['title'] = array(array('like','%'.$words.'%'),array('like','%'.$wordss.'%'));

 

转载于:https://www.cnblogs.com/e0yu/p/9178045.html

你可能感兴趣的文章
送给 Java 程序员的 Spring 学习指南\n
查看>>
分布式团队面临的五大问题及解决办法
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
避免标准数据模型
查看>>
用WinForm/WPF代码来为.NET Core 3.0功能投票
查看>>
如何使用 Druid 和 Kafka 构造 Kappa 架构完成流量分析
查看>>
腾讯游戏云聚焦全球化布局,集合行业能力建立游戏云生态
查看>>
小米人员架构调整:组建中国区,王川任总裁
查看>>
MongoDB数据库工具dbKoda 1.0版本提供了更好的用户体验和性能实验室
查看>>
算法(第4版) Chapter 4.1 无向图
查看>>
从零开始搭建论坛(三):Flask框架简单介绍
查看>>
手机端页面自适应解决方案—rem布局(进阶版,附源码示例)
查看>>
Spring AOP的实现原理
查看>>
IP通信中音频编解码技术与抗丢包技术概要
查看>>
Python 自定义函数的特殊属性(收藏专用)
查看>>
Laravel学习笔记之Demo2——用Ajax来做个ToDoList(待更新)
查看>>
破解Mac上changes提示输入序列号
查看>>
【总结】Json的转换与传递
查看>>
安全无小事:如何给企业用户数据上把锁?
查看>>
CalendarListView解析与重新实现
查看>>