文档章节

php自动文章关键字提取

狮子的魂
 狮子的魂
发布于 2013/07/08 17:28
字数 904
阅读 1029
收藏 5


现在, 很多web系统都用到了不少的自然语言处理技术来提高客户体验. 

主要技术:

1. 文章关键字提取.

2. 相关文章(产品)推荐.

最近有不少网友问道, 这里以php为例子讲解下php的"关键字提取"的实现, 同时这个也是实现"相关文章推荐"的前提.

基本分以下几个步骤: 

一. 对文章进行分词: 

    php的中文分词程序还是有不少的, 从前辈的scws, 到用纯php实现的phpAnalysis, phpcws(phpcws)以及本人开发的robbe扩展.

    这里的讲解是使用"robbe分词扩展"来进行分词, robbe兴许不是最好的, 但一定是最快的.

    选择的分词器需要支持停止词过滤.

二. 统计词条词频并且排序: 

    对一篇文章分词后, 统计每个词条出现的次数. 然后按照词频降序排序下, 你想要的结果在前面几个词中.

    前提是去除了出现词频很高的停止词, 要不然得到的都是一些无用的停止词. (类似于TF-IDF算法)

完整的过程代码如下:

<?php
header('content-type:text/html;charset:utf-8');

$__text__ = '';
$__mode__ = 2;
$__timer__ = 0;
$_act = '';
if ( isset($_POST['_act']) ) {
	$_act = $_POST['_act'];
	if ( $_act == 'split'  ) {
		$__text__ = $_POST['text'];
		$__mode__ = intval( $_POST['mode'] );

		$s_time = timer();
		$_result = rb_split($__text__, $__mode__);
		
		$_keywords = array();
		foreach ( $_result as $_value ) {
			if ( is_numeric($_value) ) continue;
			if ( ord($_value) > 127 && strlen($_value) == 3 ) {
				//$w = rb_dic_get(__RB_LEX_CJK_WORDS__, $_value);
				//if ( $w['freq'] > 58023 ) continue;
				continue;
			}
			if ( ! isset($_keywords[$_value]) ) $_keywords[$_value] = 1;
			else $_keywords[$_value] = $_keywords[$_value] + 1;
		}
		//Sort
		arsort($_keywords, SORT_NUMERIC);
		unset($_result);
		$_result = array();
		foreach( $_keywords as $_key => $_value ) {
			//if ( $_value <= 2 ) continue;
			$_result[$_key] = $_value;
		}
		unset($_keywords);
		$__timer__ = timer() - $s_time;
	}
}

function timer() {
	list($msec, $sec) = explode(' ', microtime());	
	return ((float)$msec + (float)$sec);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<title>robbe分词测试程序</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<style type="text/css">
		#box {width: 1000px;}
		.input-text {border: 1px solid #CCC;width: 1000px;height: 200px;background-color: #FFF;
			color: #555;font-size: 14px;}
		.link-box {overflow: hidden;zoom:1;padding-top:10px;}
		#submit-link {float:right;width:150px;height: 26px;line-height: 26px;
			background-color: #A50100;color: #FFF;font-weight: bold;text-align: center;
			text-decoration: none;font-size: 14px;}
		#info-link {float:right;width:300px;height: 26px;line-height: 26px;
			background-color: #A50100;color: #FFF;font-weight: bold;text-align: center;
			text-decoration: none;font-size: 14px;}
		.link-item {float: left;font-size: 14px;font-weight: bold;
			height: 26px;line-height: 26px;width: 100px;color: #A50100;}
		.title-item {height:30px;line-height: 30px;font-size: 14px;font-weight: bold;}
	</style>
</head>

<body>
	<div id="box">
		<div class="title-item">请输入文章内容:</div>
		<form name="robbe" method="post" action="robbe.keywords.php">
			<div class="r-item"><textarea name="text" class="input-text" id="text"><?=$__text__?></textarea></div>
			<input type="hidden" name="_act" value="split"/>
			<div class="link-box">
			<a class="link-item">
				<input type="radio" name="mode" value="1" <?=$__mode__==1?'checked="checked"':''?>/>简易模式</a>
			<a class="link-item">
				<input type="radio" name="mode" value="2" <?=$__mode__==2?'checked="checked"':''?>/>复杂模式</a>
			<a href="javascript:;" onclick="do_submit();return false;" id="submit-link">robbe分词</a>
		</div>
		</form>

		<?php
		if ( $_act == 'split' ) {
		?>
		<div class="title-item">关键字相关排序:</div>
		<div><textarea class="input-text">
			<?php foreach ( $_result as $_key => $_val ) echo $_key.'['.$_val.'] ';?>
		</textarea></div>
		<?php
		}
		?>
	</div>

<script type="text/javascript">
String.prototype.trim = function() {return this.replace(/^\s+|\s+$/g, '');}
function do_submit() {
	var text = document.getElementById('text');
	if ( text.value.trim() == '' ) return; 
	document.robbe.submit();
}
</script>
</body>

安装robbe扩展后, 可以直接运行该php页面了.


测试一下: 

以本人的一篇博客为测试例子: http://my.oschina.net/jcseg/blog/124173,  

统计排序词频超过3的词条如下:

缓存[13] web[9] 静态[6] 服务器[6] 负载[5] 数据库[4] 浏览器[4] 内容[4] 使用[4] 组件[4] js[4] css[4] 均衡[4] 分离[4] 压缩[4] 域名[4] 文件[4] 文案[3] 系统[3] 图片[3] 分布式[3] 方案[3] dns[3]

效果基本还可以吧, 这篇博客确实关注的是"缓存", "数据库", "负载", "浏览器", "web". 主要关键字都提取出来了.

想要达到更好的效果, 可能需要维护停止词库.



© 著作权归作者所有

共有 人打赏支持
狮子的魂

狮子的魂

粉丝 205
博文 11
码字总数 11922
作品 7
深圳
CEO
私信 提问
新闻 标签推荐系统 请问思路是否正确

我现在想做用户标签 或者新闻标签。 比如用户a 阅读一篇文章 文章提取关键字 比如 世界杯 英格兰 足球, 然后把这些标签放在这个用户的表里。 然后以后推荐给这个用户 相似聚合交集标签的新闻...

mingbai123
2018/06/22
0
0
Jcseg-1.9.7 发布 - Restful API+文章自动摘要/关键字/短语/句子提取

Jcseg是基于mmseg算法的一个轻量级开源中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了最新版本的lucene, solr, elasticsearch的分词接口,...

狮子的魂
2015/12/09
2.7K
8
Scrapy+eChart自动爬取生成网络安全词云

因为工作的原因,近期笔者开始持续关注一些安全咨询网站,一来是多了解业界安全咨询提升自身安全知识,二来也是需要从各类安全网站上收集漏洞情报。 作为安全情报领域的新手,面对大量的安全...

半夜菊花茶
2017/12/10
0
0
Jcseg 2.0.0 发布,自定义词库开发支持优化

Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言直接http调用,同...

狮子的魂
2016/11/04
3.1K
8
phpyun 2.4 Beta 版,PHP云人才系统

PHP云人才系统,是专为中文用户设计和开发,程序源代码100%完全开放的一个采用 PHP 和 MySQL 数据库构建的高效的人才与企业求职招、聘解决方案,在尊重版权的前提下能极大的满足站长对于网站...

shyflc
2012/08/02
2.3K
11

没有更多内容

加载失败,请刷新页面

加载更多

《蒙福人生》读后感作文2900字

《蒙福人生》读后感作文2900字: 我们的财富从何来?投胎、勤奋、智慧、机遇?我相信会有很多小伙伴会把上面的选项都否掉,或是一定要加一个前提即我们是基督徒当然是从神而来。如果我们确定...

原创小博客
7分钟前
0
0
使用xtrabackup备份数据库

使用xtrabackup备份数据库 提供一个参考文档:http://xtra.aminglinux.com mysqldump对于导出几个G的数据库或几个表,还是不错的,速度并不慢。一旦数据量达到几十上百G,无论是对原库的压力...

wzb88
14分钟前
0
0
Java 命令行工具使用

待更新 https://lotabout.me/2018/QQA-Understanding-jstat-gc-output/

lemos
40分钟前
2
0
Python自制微信机器人:群发消息、自动接收好友

运营公众号也有半年了,今年5月份开始的,之前一直用一款windows工具来运营自动接受好友请求、群发文章、自动回复等操作,但颇有不便。 举几个场景: 突然在外面看到一篇文章很好,临时写了一...

上海小胖
43分钟前
1
0
C# WPF上位机实现和下位机TCP通讯

下位机使用北京大华程控电源DH1766-1,上位机使用WPF。实现了电压电流实时采集,曲线显示。上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟。昨天写的TCP服务端正好排上用场。 界面...

SEOwhywhy
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部