php实现自动获取生成文章主题关键词功能的深入分析


Posted in PHP onJune 03, 2013

以前写程序一直在逃避这个问题,tag什么的都是要求使用程序的人自行输入,对于某些懒人及为了程序的体验,则是希望可以有自动生成文章关键词,自动获取文章tag的类似功能,这次为了迎接新的项目,所以捣鼓了一晚上,研究了一下这个功能。
要实现自动获取关键词的功能,大概可以分成三步
1,通过分词算法将标题和内容分别进行分割,提取出关键词和频度。
当前主要的两个算法是中科院的ICTCLAS和隐马尔可夫模型。但这两个都太高端,有一定的门槛,且都是只支持C++/JAVA。基于PHP的当前有两个是值得推荐的PSCWS和HTTPCWS。 SCWS于2008-03-08发布1.0.0 正式版,到现在最新版本已经到了1.0.4。PSCWS是它的PHP版。而HTTPCWS是张宴开发的,之前叫PHPCWS。PHPCWS 先使用“ICTCLAS 3.0 共享版中文分词算法”的API进行初次分词处理,再使用自行编写的“逆向最大匹配算法”对分词和进行词语合并处理,并增加标点符号过滤功能,得出分词结果。不过很遗憾目前仅支持Linux系统,尚未移植到win平台上。
2,将提取结果与现有词库进行比较,处理,去除无用的词得到最符合规则的关键词。这里主要就是要看词库了,我们可以自己定义词库,也可以使用现有的成熟词库。比如新浪和网易博客都有这个功能,。他们分词应该有不错的词库,因为他们都是大网站,而我呢,区区一个小程序员,不可能搞到什么权威的词库,所以只能从现有的开源程序上入手,看看他们的词库。
3,在处理后的提取结果中选择适当的作为最终的关键词,得到最符合当前内容的关键词,在这个阶段就是具体情况具体分析了,无论如何也不可能达到人的那种智能化。最多是。当前PHP类CMS都自有自己的提取关键词系统。
目前在网络上流传最广的是DEDECMS的分词源码,我做了测试,发现相当的呆,效果很不好。它先设置一个关键词长度,确定获取关键词的数量,然后取词,它认为标题分好的词就是所需关键词,在加上从正文中读取关键词只到达到这个所设置的长度,就是最终关键词了。另外类似“我们”等无意义的词也没有去除掉提取并被列为关键词的频率太高,甚至有时候还会把空格的HTML提出来做为关键词,亟待改进。不过如果作为辅助功能,它已经很好了。而discuz的稍微好一些,但是discuz并没有提供源码,只是提供了一个在线api。
而dede的分词也有好几个版本,最好的应该是最新版的吧,出现频率什么都有了,下面就以dede5.7的分词和discuz的api的结果对比下
测试例子:
$title="THINKPHP官方即将停止对2.0版本的支持";
$body="了更好地做好ThinkPHP框架的开发、维护和支持工作,官方宣布从2012年5月1日起s对2.0及之前版本的维护和支持,为了节能低碳考虑,同时也取消官网的相应版本和文档下载。
就此缅怀那些年,曾经一起开发的ThinkPHP版本吧!
关于ThinkPHP 2.0版本
ThinkPHP诞生于2006年,致力于WEB应用的快速开发,其2.0版本发布于2009年10月1日 ,在之前的1.*版本上完成新的重构和飞跃,当时是一次划时代的版本,为新版奠定了基础,同时也积累了较多的用户群和网站,随着框架的快速更新,和新版2.1、2.2和3.0版本的陆续发布,预示着ThinkPHP的3.0时代到来了,2.0的生命周期宣告结束。但基本上2.0的很多功能都延续或者完善到2.1版本中了,从2.0版本升级到2.1和2.2版本也相对轻松。2.2版本是2.*版本的最终版本,不再更新功能,仅做BUG修复。";
一、dede分词
将结果排序后如下
    ?祟}Array    (
    [THINKPHP] => 1
    [官方] => 1
    [即将] => 1
    [停止] => 1
    [对] => 1
    [2.0] => 1
    [版本] => 1
    [的] => 1
    [支持] => 1
    )
    内容Array    (
    [版本] => 12
    [的] => 12
    [和] => 8
    [ThinkPHP] => 5
    [2.0] => 5
    [也] => 3
    [2.2] => 3
    [2.1] => 3
    [开发] => 3
    [3.0] => 2
    [是] => 2
    [快速] => 2
    [到] => 2
    [发布] => 2
    [维护] => 2
    [之前] => 2
    [了] => 2
    [新版] => 2
    [支持] => 2
    [框架] => 2
    [同时] => 2
    [从] => 2
对此如何取出最终的需要的关键词呢? 初步思路是先去除“的”,“些”这些词,再按照内容的排序顺序,依次看分到是否出现在标题中出现即为所需的,这样可以取出一定量的词最为最终关键词。如上结果我们可以得到
版本 thinkphp 2.0 支持 停止
五个关键词。看起来结果还是可以接受的。
二、在来看discuz的,利用api得到的是一个xml文档,解析后得到的关键词是
的、快速、版本升级、开发、用户
五个词,第一个是“的”......
对比这两种方式发现第一种dede+后续处理的较为接近文档的内容,应该是稍好一些,而discuz的偏离了文章的主题,但是其取到词有一定的热门性

PHP 相关文章推荐
3
Oct 09 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
Zend Framework校验器Zend_Validate用法详解
Dec 09 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
Laravel实现定时任务的示例代码
Aug 10 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 #PHP
PHP Error与Logging函数的深入理解
Jun 03 #PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 #PHP
基于Discuz security.inc.php代码的深入分析
Jun 03 #PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 #PHP
基于php在各种web服务器的运行模式详解
Jun 03 #PHP
PHP运行模式的深入理解
Jun 03 #PHP
You might like
一个程序下载的管理程序(一)
2006/10/09 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
jQuery遮罩层实例讲解
2017/05/11 jQuery
详解http访问解析流程原理
2017/10/18 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
Python走楼梯问题解决方法示例
2018/07/25 Python
python实现车牌识别的示例代码
2019/08/05 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
事假请假条范文
2014/04/11 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
体育教师个人总结
2015/02/09 职场文书
升学宴来宾致辞
2015/07/27 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书