php文章相似度计算similar_text()函数升级

 更新时间:2016年11月25日 15:46  点击:1667
有时我们希望调用相关文章时肯定调用相似度高的我先是使用了php的similar_text()函数,但是测试两个相同的标题得出结果只有40%左右啊,下面看实例。

php默认有个函数similar_text()用于计算字符串之间的相似度,该函数也可以计算两个字符串的相似度(以百分比计)。不过这个函数感觉对中文计算很不准确比如:

 代码如下 复制代码
echo similar_text("吉林禽业公司火灾已致112人遇难","吉林宝源丰禽业公司火灾已致112人遇难");

这两个新闻标题其实都是一样的,如果使用similar_text()相似对结果为:42,即只相似42%,所以这个感觉很不靠谱,今天刚好收集到一段PHP代码也是用于比较两个字符串的相似度,直接贴出代码:

 代码如下 复制代码

<?php
class LCS {
    var $str1;
    var $str2;
    var $c = array();
    /*返回串一和串二的最长公共子序列
*/
    function getLCS($str1, $str2, $len1 = 0, $len2 = 0) {
        $this->str1 = $str1;
        $this->str2 = $str2;
        if ($len1 == 0) $len1 = strlen($str1);
        if ($len2 == 0) $len2 = strlen($str2);
        $this->initC($len1, $len2);
        return $this->printLCS($this->c, $len1 - 1, $len2 - 1);
    }
    /*返回两个串的相似度
*/
    function getSimilar($str1, $str2) {
        $len1 = strlen($str1);
        $len2 = strlen($str2);
        $len = strlen($this->getLCS($str1, $str2, $len1, $len2));
        return $len * 2 / ($len1 + $len2);
    }
    function initC($len1, $len2) {
        for ($i = 0; $i < $len1; $i++) $this->c[$i][0] = 0;
        for ($j = 0; $j < $len2; $j++) $this->c[0][$j] = 0;
        for ($i = 1; $i < $len1; $i++) {
            for ($j = 1; $j < $len2; $j++) {
                if ($this->str1[$i] == $this->str2[$j]) {
                    $this->c[$i][$j] = $this->c[$i - 1][$j - 1] + 1;
                } else if ($this->c[$i - 1][$j] >= $this->c[$i][$j - 1]) {
                    $this->c[$i][$j] = $this->c[$i - 1][$j];
                } else {
                    $this->c[$i][$j] = $this->c[$i][$j - 1];
                }
            }
        }
    }
    function printLCS($c, $i, $j) {
        if ($i == 0 || $j == 0) {
            if ($this->str1[$i] == $this->str2[$j]) return $this->str2[$j];
            else return "";
        }
        if ($this->str1[$i] == $this->str2[$j]) {
            return $this->printLCS($this->c, $i - 1, $j - 1).$this->str2[$j];
        } else if ($this->c[$i - 1][$j] >= $this->c[$i][$j - 1]) {
            return $this->printLCS($this->c, $i - 1, $j);
        } else {
            return $this->printLCS($this->c, $i, $j - 1);
        }
    }
}

$lcs = new LCS();
//返回最长公共子序列
$lcs->getLCS("hello word","hello china");
//返回相似度
echo $lcs->getSimilar("吉林禽业公司火灾已致112人遇难","吉林宝源丰禽业公司火灾已致112人遇难");同样输出结果为:0.90322580645161,明显准确的多。


还有一种办法就是利用分词系统我们把标题分词,然后再进行会更准确一些哦。

本文章来介绍php获取http状态码程序代码,有需要了解的同学可参考。

经常需要判断文件是否可以访问,可以通过http状态码判别,200为正常访问,404为找不到该页面,代码如下

 代码如下 复制代码

<?php
// 设置url
$url = 'http://www.111cn.net';
function get_http_status_code($url) {
 if(empty($url)) return false;
 $url = parse_url($url);
 $host = isset($url['host']) ? $url['host'] : '';
 $port = isset($url['port']) ? $url['port'] : '80';
 $path = isset($url['path']) ? $url['path'] : '';
 $query = isset($url['query']) ? $url['query'] : '';


 $request = "HEAD $path?$query HTTP/1.1rn"
           ."Host: $hostrn"
           ."Connection: closern"
           ."rn";

 $address = gethostbyname($host);
 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 socket_connect($socket, $address, $port);

 socket_write($socket, $request, strlen($request));

 $response = split(' ', socket_read($socket, 1024));
 socket_close($socket);
 return  trim($response[1]);
}
echo get_http_status_code($url);

另一种获取http状态码的办法

使用curl需要在php.ini中设置启用才行 >< Windows的服务器中,打开php.ini,找到:
extension=php_curl.dll
去掉前面的注释既可 。

 

 代码如下 复制代码
$curl = curl_init();
$url=’http://www.111cn.net’;
curl_setopt($curl, CURLOPT_URL, $url); //设置URL
curl_setopt($curl, CURLOPT_HEADER, 1); //获取Header
curl_setopt($curl,CURLOPT_NOBODY,true); //Body就不要了吧,我们只是需要Head
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //数据存到成字符串吧,别给我直接输出到屏幕了
$data = curl_exec($curl); //开始执行啦~
echo curl_getinfo($curl,CURLINFO_HTTP_CODE); //我知道HTTPSTAT码哦~
curl_close($curl); //用完记得关掉他

一些状态代码

1xx:请求收到,继续处理 
2xx:操作成功收到,分析、接受 
3xx:完成此请求必须进一步处理 
4xx:请求包含一个错误语法或不能完成 
5xx:服务器执行一个完全有效请求失败 

100——客户必须继续发出请求 
101——客户要求服务器根据请求转换HTTP协议版本 

200——交易成功 
201——提示知道新文件的URL 
202——接受和处理、但处理未完成 
203——返回信息不确定或不完整 
204——请求收到,但返回信息为空 
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件 
206——服务器已经完成了部分用户的GET请求 

300——请求的资源可在多处得到 
301——删除请求数据 
302——在其他地址发现了请求数据 
303——建议客户访问其他URL或访问方式 
304——客户端已经执行了GET,但文件未变化 
305——请求的资源必须从服务器指定的地址得到 
306——前一版本HTTP中使用的代码,现行版本中不再使用 
307——申明请求的资源临时性删除 

400——错误请求,如语法错误 
401——请求授权失败 
402——保留有效ChargeTo头响应 
403——请求不允许 
404——没有发现文件、查询或URl 
405——用户在Request-Line字段定义的方法不允许 
406——根据用户发送的Accept拖,请求资源不可访问 
407——类似401,用户必须首先在代理服务器上得到授权 
408——客户端没有在用户指定的饿时间内完成请求 
409——对当前资源状态,请求不能完成 
410——服务器上不再有此资源且无进一步的参考地址 
411——服务器拒绝用户定义的Content-Length属性请求 
412——一个或多个请求头字段在当前请求中错误 
413——请求的资源大于服务器允许的大小 
414——请求的资源URL长于服务器允许的长度 
415——请求资源不支持请求项目格式 
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求 
也不包含If-Range请求头字段 
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求 

500——服务器产生内部错误 
501——服务器不支持请求的函数 
502——服务器暂时不可用,有时是为了防止发生系统过载 
503——服务器过载或暂停维修 
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长 
505——服务器不支持或拒绝支请求头中指定的HTTP版本 

本文章来给各位同学介绍PHP file_get_contents采集程序开发教程详解,有需要了解的朋友可参考。


file_get_contents() 远程文件获取函数,用来获取远程页面内容
preg_match_all()进行全局正则表达式匹配,匹配多次,用于匹配列表
preg_match   ()进行正则表达式匹配,匹配一次,用于匹配终端
preg_replace ()进行正则表达式替换,用于过滤终端

具体步骤

Step 1 获取单页列表 和 单篇文章内容
在批量采集列表和内容之前,我们先将网站的单页列表和单篇文章的内容采集作为测试正则表达式对错。

列表页采集文章的链接地址:

 代码如下 复制代码

<?php
 //获取列表
 $url = '/s2005/shishi.shtml';
 $con=file_get_contents($url);
 //写正则获取列表中的文章链接
 /*范例 : <a test=a href='/20130418/n373177942.shtml'
          target='_blank'>湖南沅陵输电工程沉船事故共致6人死亡</a>*/
 $preg = "|<a test=a href='(.*)' target='_blank'>(.*)</a>|iUs";
 // 正则中的/i表示 大小写不敏感 /U 非贪婪匹配 /s 点号可以匹配换行符
 preg_match_all($preg,$con,$arr);
 //var_dump($arr);
    /*
    array(3) {
  [0]=>
  array(40) {
    [0]=>
    string(126) "<a test=a href='/20130418/n373180618.shtml'
target='_blank'>甘肃河西走廊遭大风沙尘侵袭 瞬时最大风力9级</a>"
    [1]=>
    string(112) "<a test=a href='/20130418/n373180612.shtml'
target='_blank'>一线城市住宅地价全部环比上涨</a>"
    ... ...
    [39]=>
    string(124) "<a test=a href='/20130418/n373161633.shtml'
target='_blank'>湖南衡阳发生一起枪击案致1人死 警方正缉凶</a>"
  }
  [1]=>
  array(40) {
    [0]=>
    string(46) "/20130418/n373180618.shtml"
    [1]=>
    string(46) "/20130418/n373180612.shtml"
    ... ...
    [39]=>
    string(46) "/20130418/n373161633.shtml"
  }
  [2]=>
  array(40) {
    [0]=>
    string(42) "甘肃河西走廊遭大风沙尘侵袭 瞬时最大风力9级"
    [1]=>
    string(28) "一线城市住宅地价全部环比上涨"
    ... ...
    [39]=>
    string(40) "湖南衡阳发生一起枪击案致1人死 警方正缉凶"
  }
}
    */
?>

单篇文章的采集:

 代码如下 复制代码

<?php
$url = 'http://www.111cn.net';
$con = file_get_contents($url);
//正则表达式分为标题和内容
$title_preg = "|<h1>(.*)</h1>|iUs";
$content_preg = "|<!-- 正文 -->(.*)<!-- 分享 -->|iUs";
preg_match($title_preg,$con,$title_arr);
preg_match($content_preg,$con,$content_arr);
?>

本文章来给各位同学介绍php 二维数组的分组排序实现代码,有需要了解的朋友可参考。

分组排序

 代码如下 复制代码

<?php
$new2['group']['key']='time';
$new['aa']['b']=44;
$new['aa']['c']=33;
$new['aa']['d']=34;
$new['bb']['b']=55;
$new['bb']['c']=32;
$new['cc']['4']=77;
$new['dd']['g']=55;
$new['dd']['c']=54;

function arr_group_sort($new){
     foreach($new as $key=>$val){
          asort($new[$key]);//分别对每一组的数据进行排序;
          $tmp=$new[$key];//将排序后的数据赋值给一个临时数组;
          $tmp[]=$key;//将原来数组的键值加入到临时数组的末尾,为后期的修改键值的步骤做准备;
          $a=array_shift($new[$key]);//将每一组的第一项(最小项)数据取出来,以aa组为例子,$a此时的值就为33;
          $aa[$a]=$tmp;//新建一个数组,以$aa(比如33)为键值;
          ksort($aa);//按照键值排序
     }
     foreach($aa as $key=>$val){//按照键值排序的数组,已经失去了原来的键值,比如aa/bb/cc/dd之类的,好在我们之前已经将键值存入了临时数组的末尾;
          $b=array_pop($aa[$key]);//将键值取出来;
          $bb[$b]=$aa[$key];//从新建立一个数组,使用之前的键值(aa/bb/cc)
     }
     return $bb;//返回
}

$c=arr_group_sort($new);
print_r($new);//原数组;
print_r($c);//分组排序后的数组;
?>

其它的二维数组排序的方法

 

 代码如下 复制代码
function array_sort($arr,$keys,$type='asc'){
 $keysvalue = $new_array = array();
 foreach ($arr as $k=>$v){
  $keysvalue[$k] = $v[$keys];
 }
 if($type == 'asc'){
  asort($keysvalue);
 }else{
  arsort($keysvalue);
 }
 reset($keysvalue);
 foreach ($keysvalue as $k=>$v){
  $new_array[$k] = $arr[$k];
 }
 return $new_array;
}

它可以对二维数组按照指定的键值进行排序,也可以指定升序或降序排序法(默认为升序),用法示例:

 代码如下 复制代码

$array = array(
 array('name'=>'手机','brand'=>'诺基亚','price'=>1050),
 array('name'=>'笔记本电脑','brand'=>'lenovo','price'=>4300),
 array('name'=>'剃须刀','brand'=>'飞利浦','price'=>3100),
 array('name'=>'跑步机','brand'=>'三和松石','price'=>4900),
 array('name'=>'手表','brand'=>'卡西欧','price'=>960),
 array('name'=>'液晶电视','brand'=>'索尼','price'=>6299),
 array('name'=>'激光打印机','brand'=>'惠普','price'=>1200)
);

$ShoppingList = array_sort($array,'price');
print_r($ShoppingList);

本文章晋级人大家介绍Zend OPCache加速PHP使用说明,有需要了解的朋友可参考参考。

Zend Opcache配置方法

Zend Opcache 已经集成在了PHP 5.5里面,编译安装PHP5.5的时候加上--enable-opcache就行了。但也支持低版本的 PHP 5.2.*, 5.3.*, 5.4.*,未来会取消对5.2的支持,下面是我在PHP 5.4下的安装方法:

依次执行下面的命令

 代码如下 复制代码

wget http://pecl.php.net/get/zendopcache-7.0.2.tgz
tar xzf zendopcache-7.0.2.tgz
cd zendopcache-7.0.2
phpize

如果找不到phpize 的话自己找PHP路径,我的在/usr/local/php/bin/phpize,下面这行也要按你的php.ini路径自行修改

 代码如下 复制代码

./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

如果显示Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/

表示安装完成,下面要修改php的配置文件让它生效

在 php.ini 的最后面加入下面几行

 代码如下 复制代码

zend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20100525/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

128意思是给它分配128M内存,然后重启apache,用phpinfo查看是否生效,显示下面的信息就说明生效了

Zend Opcache是否生效

可以通过phpinfo查看是否生效,下图是我的配置PHP扩展:


Zend Opcache

Zend Opcache已经生效了,如果不行可参考正同方法来解决

配置OPC还是比较简单的,eAccelerator被我干掉了,重复的功能。配置如下:

 代码如下 复制代码

wget http://pecl.php.net/get/zendopcache-7.0.2.tgz
tar xzf zendopcache-7.0.2.tgz
cd zendopcache-7.0.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make

make install接着呢,配置下php.ini,在最后加上:

[opcache]

 代码如下 复制代码

zend_extension=opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.enable=1

一般来说,按照以往的经验,如果加在ZendGuardLoader之前会稳定多

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25
  • PHP编码转换函数mb_convert_encoding与iconv用法

    文章来实现一个PHP编码转换函数mb_convert_encoding与iconv用法,希望例子能帮助到各位。 将一个短信接口代码从apache迁移到nginx+php-fpm后,发现无法发出短信了,查...2016-11-25