文章内容相似度计算几种方式及优缺点

PHP 内置方法 similar_text

similar_text 是PHP内置的字符串相似度对比函数,是使用方式最便捷的一种,但是因为它的时间复杂度是 O(N**3),处理时间会随着内容长度增加,若比较5000字以上的文章,或者比较文章的量级比较大不建议使用,只是单篇文章对单篇文章可以使用。

通过分词进行余弦相似度对比

解决方案是首先进行文章分词可以用结巴或者迅搜分词服务进行文章分词,然后将需要对比的文章分词结果存入redis,在有新文章进行对比的时候从redis将所有文章的分词结果从内存中取出来然后进行相似度对比,逐词进行相似度计算。相似度计算的准确性很高,但是对比的文章量非常大的时候,处理时间还是会很长,5000文章的相似度计算需要近30S

主要计算代码:

Class TextSimilarity

{

/**

* [排除的词语]

*

* @var array

*/

private $_excludeArr = array('的', '了', '和', '呢', '啊', '哦', '恩', '嗯', '吧');

/**

* [词语分布数组]

*

* @var array

*/

private $_words = array();

/**

* [分词后的数组一]

*

* @var array

*/

private $_segList1 = array();

/**

* [分词后的数组二]

*

* @var array

*/

private $_segList2 = array();

private static $test1 = array();

private static $test2 = array();

/**

* [分词两段文字]

*

* @param [type] $text1 [description]

* @param [type] $text2 [description]

*/

public function __construct($text1, $text2)

{

$this->_segList1 = is_array( $text1 ) ? $text1 : $this->segment( $text1 );

$this->_segList2 = is_array( $text2 ) ? $text2 : $this->segment( $text2 );

}

/**

* [外部调用]

*

* @return [type] [description]

*/

public function run()

{

$this->analyse();

$rate = $this->handle();

return $rate ? $rate : 'errors';

}

/**

* [分析两段文字]

*/

private function analyse()

{

//t1

foreach ($this->_segList1 as $v) {

if (!in_array($v, $this->_excludeArr)) {

if (!array_key_exists($v, $this->_words)) {

$this->_words[$v] = array(1, 0);

} else {

$this->_words[$v][0] += 1;

}

}

}

//t2

foreach ($this->_segList2 as $v) {

if (!in_array($v, $this->_excludeArr)) {

if (!array_key_exists($v, $this->_words)) {

$this->_words[$v] = array(0, 1);

} else {

$this->_words[$v][1] += 1;

}

}

}

}

/**

* [处理相似度]

*

* @return [type] [description]

*/

private function handle()

{

$sum = $sumT1 = $sumT2 = 0;

foreach ($this->_words as $word) {

$sum += $word[0] * $word[1];

$sumT1 += pow($word[0], 2);

$sumT2 += pow($word[1], 2);

}

$rate = $sum / (sqrt($sumT1 * $sumT2));

return $rate;

}

/**

* [分词 【http://www.xunsearch.com/scws/docs.php#pscws23】]

*

* @param [type] $text [description]

*

* @return [type] [description]

*

* @description 分词只是一个简单的例子,你可以使用任意的分词服务

*/

private function segment( $text )

{

$outText = array();

$xs = new XS('demo'); // 必须先创建一个 xs 实例,否则会抛出异常

$tokenizer = new XSTokenizerScws; // 直接创建实例

$tokenizer->setIgnore();

//处理

$outText = $tokenizer->setMulti(1)->getResult($text);

$outText = array_column( $outText, 'word');

$res = $xs->getScwsServer();

$res->close();

return $outText;

}

}

SimHash

SimHash的原理是将很长的一段文字降维成一个0和1组成的字符串,然后计算两个01字符串的相似度,从而算出两篇文章的相似程度。也是将文章先分词,计算存量文章的相似度存入redis或者mysql,需要的时候取出来对比,对比速度20000篇文章的计算时间基本上在2s以内,但是当文章字数非常小并且重复词非常多的时候会出现文章不相同但是相似度非常高的问题。

主要计算代码:

class SimHash

{

protected static $length = 256;

protected static $search = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

protected static $replace = array('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','1011','1100','1101','1110','1111');

/**

* [排除的词语]

*

* @var array

*/

private static $_excludeArr = array('的', '了', '和', '呢', '啊', '哦', '恩', '嗯', '吧','你','我',' ');

public static function get(array &$set)

{

$boxes = array_fill(0, self::$length, 0);

if (is_int(key($set)))

$dict = array_count_values($set);

else

$dict = &$set;

foreach ($dict as $element => $weight) {

if ( in_array($element, self::$_excludeArr )){

continue;

}

$hash = hash('sha256', $element);

$hash = str_replace(self::$search, self::$replace, $hash);

$hash = substr($hash, 0, self::$length);

$hash = str_pad($hash, self::$length, '0', STR_PAD_LEFT);

for ( $i=0; $i < self::$length; $i++ ) {

$boxes[$i] += ($hash[$i] == '1') ? $weight : -$weight;

}

}

$s = '';

foreach ($boxes as $box) {

if ($box > 0)

$s .= '1';

else

$s .= '0';

}

return $s;

}

public static function hd($h1, $h2)

{

$dist = 0;

for ($i=0;$i<:>

if ( $h1[$i] != $h2[$i] )

$dist++;

}

return (self::$length - $dist) / self::$length;

}

mysql文章相似度计算_文章相似度计算相关推荐

  1. 标题相似度算法_一个简单的计算文章相似度功能!

    在做文章系统的时候,很多时候需要为这篇文章推荐最相近的文章. 解决思路是:给文章设定关键词然后模糊查询进行匹配.找到包含这个关键词的标题,然后给显示出来,作为最接近的文章. 但是有问题:这样的文章,排 ...

  2. 什么是边缘计算边缘计算_什么是边缘计算?

    什么是边缘计算边缘计算 在过去的二十年中, 云计算一直主导着IT讨论,尤其是自Amazon在2006年通过发布其Elastic Compute Cloud推广该术语以来. 在最简单的形式中,云计算是计 ...

  3. 片偏移怎么计算_搞懂钢丝网片计算原理,怎么算都不怕出错!

    钢丝网片是很多同学都模糊的概念,钢丝网片是怎么回事?什么时候要计算钢丝网片?是有填充墙的时候都要计算吗?软件是怎么计算的?我们如何知道软件计算的是错的还是对的? 今天的文章,我们就来解答这些问题. 钢 ...

  4. excel 置信区间 计算_如何用excel计算 95%的置信区间

    展开全部 用excel计算e68a843231313335323631343130323136353331333433623764 95%的置信区间,需要用户首先计算Y的估计值,在C2单元格里面输入& ...

  5. mysql mtbf计算_手把手教你计算MTBF(平均故障间隔时间),有实例!

    原标题:手把手教你计算MTBF(平均故障间隔时间),有实例! MTBF(平均故障间隔时间) MTBF,即平均故障间隔时间,英文全称是"Mean Time Between Failure&qu ...

  6. Java自己文章只能自己修改_文章目录Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见。目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽...

    文章目录 Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见. 目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽早的发现BUG. 统一代码风格:统一 ...

  7. java余弦相似度算法_余弦相似度计算

    余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小.余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性". 我们知道,对于两个向量, ...

  8. 在置信区间下置信值的计算_使用自举计算置信区间

    在置信区间下置信值的计算 嗨,大家好, (Hi everyone,) In this article, I will attempt to explain how we can find a conf ...

  9. 决策树信息熵计算_决策树熵|熵计算

    决策树信息熵计算 A decision tree is a very important supervised learning technique. It is basically a classi ...

  10. 弹性地基梁板实用计算_桥梁支架设计计算,看这里!

    点击下面图标,想要什么有什么 正哥推荐(点击标题阅读详细内容): 1.30篇名企实用<市政道路施工组织设计> 2.2019第2季度<市政工程宝典>文章汇编 3."顶管 ...

最新文章

  1. 【高级数据结构】[SPOJ QTREE]树链剖分/动态树各一模板
  2. 国内首批!阿里云实时计算 Flink 版通过信通院大数据产品能力测试
  3. r语言ggplot2一夜多图_R语言ggplot2画四方形的热图展示相关系数的简单小例子
  4. terminated 线程_Java【多线程系列】JUC线程池—2. 原理(二)、Callable和Future
  5. G - 水陆距离 HihoCoder - 1478(广搜+队列先进先出性质)
  6. 关于session.auto_start报警的问题
  7. 7-10 求数字个数 (20 分)
  8. C语言万年历设计制作
  9. 网页播放Flash视频尝试的三种方式
  10. 5分钟摄像头抓拍一次,居家一天至少89次!尚德员工:连厕所都不敢上
  11. 有没有网上打印可以派送的?
  12. 奇葩Bug频出,苹果AirPods Pro 2提醒用户换电池
  13. 自动化1121和1122班学生链接
  14. Python与Java容器总结
  15. 网页设计作业——小米商城官网首页(1页) HTML+CSS+JavaScript web期末作业设计网页_清新淡雅个人网页大学生网页设计作业成品
  16. 太离谱了!一行Python代码写的游戏,我能这样玩一天!
  17. StackOverflow和OutOfMemory
  18. Python爬虫实战:QQ空间全自动点赞工具
  19. HTML5的基础知识整理
  20. RJ45及RJ11的接线方法

热门文章

  1. 前端实习小白日记—1
  2. 恢复计算机注册表命令,电脑的注册表如果损坏怎么恢复
  3. win10设置计算机关机时间,教你windows10电脑怎么设置定时关机
  4. 坚果pro2刷回官方_锤子坚果Pro2刷魔趣、刷回官方踩坑记
  5. C#修改内存制作外挂
  6. excel换行快捷键_超实用的16个Excel快捷键,一定要收藏!
  7. 如何申请自己的免费企业邮箱
  8. 金刚石结构的各向异性
  9. JS中经纬度的正则表达式(亲测有效)
  10. activiti 获取审批人员_activiti,根据任务id获取该任务节点配置的获选人或者获选组...