PHPAnalysis:一款纯PHP实现的中文切分工具,助力php建站标签自由
在采集过程中,想对文章进行标签提取,龙哥找了七七四十九天终于找到
对于这个问题,我进行了大量的资料搜索,但很可惜,网上没有现成的好文档来解释如何解决。只能自己动手了。
经过漫长的搜索和筛选,黄天终于眷顾了我。找到了一款纯PHP实现的中文切分工具。
名称:PHPAnalysis
官方网址已经打不开了,据说下载也有点不给力;
我将它上传到了csdn资源,你可以在这里快速下载,希望对你有帮助。
废话不多说,我们来看看如何使用吧。
首先,解压下载的程序,将它放在自己工程中的某个目录下。不需要修改其中的任何文件。
目录
一、PHPAnalysis类目录结构
二、PHPAnalysis类API文档
1、比较重要的成员变量
$resultType = 1 #生成的分词结果数据类型(1 为全部, 2为 词典词汇及单个中日韩简繁字符及英文, 3 为词典词汇及英文)
# 这个变量一般用 SetResultType( $rstype ) 这方法进行设置。
$notSplitLen = 5 # 切分句子最短长度
$toLower = false # 把英文单词全部转小写
$differMax = false # 使用最大切分模式对二元词进行消岐
$unitWord = true # 尝试合并单字(即是新词识别)
$differFreq = false # 使用热门词优先模式进行消岐
2、主要成员函数列表
-
public function __construct($source_charset='utf-8', $target_charset='utf-8', $load_all=true, $source='')
函数说明: 构造函数
参数列表:
$source_charset
:源字符串编码$target_charset
:目标字符串编码$load_all
:是否完全加载词典(此参数已废弃)$source
:源字符串
如果输入输出都是 UTF-8 编码,实际上可以不需要使用任何参数进行初始化,而是通过
SetSource
方法设置要操作的文本。 -
public function SetSource($source, $source_charset='utf-8', $target_charset='utf-8')
函数说明: 设置源字符串
参数列表:
$source
:源字符串$source_charset
:源字符串编码$target_charset
:目标字符串编码
返回值: bool
-
public function StartAnalysis($optimize=true)
函数说明: 开始执行分词操作
参数列表:
$optimize
:分词后是否尝试优化结果
返回值: void
一个基本的分词过程:
$pa = new PhpAnalysis(); $pa->SetSource('需要进行分词的字符串'); // 设置分词属性 $pa->resultType = 2; $pa->differMax = true; $pa->StartAnalysis(); // 获取你想要的结果 $pa->GetFinallyIndex();
-
public function SetResultType($rstype)
函数说明: 设置返回结果的类型,实际上是对成员变量
$resultType
的操作参数
$rstype
值为:- 1:为全部
- 2:为词典词汇及单个中日韩简繁字符及英文
- 3:为词典词汇及英文
返回值: void
-
public function GetFinallyKeywords($num = 10)
函数说明: 获取出现频率最高的指定词条数(通常用于提取文档关键字)
参数列表:
$num
:返回词条个数
返回值: 用逗号分隔的关键字列表
-
public function GetFinallyResult($spword=' ')
函数说明: 获得最终分词结果
参数列表:
$spword
:词条之间的分隔符
返回值: string
-
public function GetSimpleResult()
函数说明: 获得粗分结果
返回值: array
-
public function GetSimpleResultAll()
函数说明: 获得包含属性信息的粗分结果
属性:
- 1:中文词句
- 2:ANSI词汇(包括全角)
- 3:ANSI标点符号(包括全角)
- 4:数字(包括全角)
- 5:中文标点或无法识别字符
返回值: array
-
public function GetFinallyIndex()
函数说明: 获取 hash 索引数组
返回值: array(‘word’ => count, …),按出现频率排序
-
public function MakeDict($source_file, $target_file='')
函数说明: 将文本文件词库编译成词典
参数列表:
$target_file
:目标文件(如果不指定,则为当前词典)
返回值: void
-
public function ExportDict($targetfile)
函数说明: 导出当前词典全部词条为文本文件
参数列表:
$targetfile
:目标文件
返回值: void
二、创建了一个工具方法来提取关键字:
/**
* 关键字提取方法
*
* @param $title string 进行分词的标题
* @param $content string 进行分词的内容
* @return array 得到的关键词数组
*/
public static function getKeywords($title = "", $content = "") {
if (empty($title)) {
return array();
}
if (empty($content)) {
return array();
}
$data = $title . $title . $title . $content; // 为了增加title的权重,这里连接3次
// 这个地方写上phpanalysis对应放置路径
require_once dirname(dirname(__FILE__)) . '/phpanalysis.class.php';
PhpAnalysis::$loadInit = false;
$pa = new PhpAnalysis('utf-8', 'utf-8', false);
$pa->LoadDict();
$pa->SetSource($data);
$pa->StartAnalysis(true);
$tags = $pa->GetFinallyKeywords(5); // 获取文章中的五个关键字
$tagsArr = explode(",", $tags);
return $tagsArr; // 返回关键字数组
}
实际上,我们只使用了其中一小部分的功能。如果你想了解更详细的描述,可以去他们的官网查看。
步骤2 :将分词类引用,同时命名,这里按你使用的框架结构来做,没有标准。
demo中的演示代码:
<?php
// 严格开发模式
ini_set('display_errors', 'On');
ini_set('memory_limit', '64M');
error_reporting(E_ALL);
$t1 = $ntime = microtime(true);
$endtime = '未执行任何操作,不统计!';
function print_memory($rc, &$infostr)
{
global $ntime;
$cutime = microtime(true);
$etime = sprintf('%0.4f', $cutime - $ntime);
$m = sprintf('%0.2f', memory_get_usage()/1024/1024);
$infostr .= "{$rc}: {$m} MB 用时:{$etime} 秒<br />\n";
$ntime = $cutime;
}
header('Content-Type: text/html; charset=utf-8');
$memory_info = '';
print_memory('没任何操作', $memory_info);
require_once 'phpanalysis.class.php';
$str = (isset($_POST['source']) ? $_POST['source'] : '');
$loadtime = $endtime1 = $endtime2 = $slen = 0;
$do_fork = $do_unit = true;
$do_multi = $do_prop = $pri_dict = false;
if($str != '')
{
//岐义处理
$do_fork = empty($_POST['do_fork']) ? false : true;
//新词识别
$do_unit = empty($_POST['do_unit']) ? false : true;
//多元切分
$do_multi = empty($_POST['do_multi']) ? false : true;
//词性标注
$do_prop = empty($_POST['do_prop']) ? false : true;
//是否预载全部词条
$pri_dict = empty($_POST['pri_dict']) ? false : true;
$tall = microtime(true);
//初始化类
PhpAnalysis::$loadInit = false;
$pa = new PhpAnalysis('utf-8', 'utf-8', $pri_dict);
print_memory('初始化对象', $memory_info);
//载入词典
$pa->LoadDict();
print_memory('载入基本词典', $memory_info);
//执行分词
$pa->SetSource($str);
$pa->differMax = $do_multi;
$pa->unitWord = $do_unit;
$pa->StartAnalysis( $do_fork );
print_memory('执行分词', $memory_info);
$okresult = $pa->GetFinallyResult(' ', $do_prop);
print_memory('输出分词结果', $memory_info);
$pa_foundWordStr = $pa->foundWordStr;
$t2 = microtime(true);
$endtime = sprintf('%0.4f', $t2 - $t1);
$slen = strlen($str);
$slen = sprintf('%0.2f', $slen/1024);
$pa = '';
}
$teststr = "2010年1月,美国国际消费电子展 (CES)上,联想将展出一款基于ARM架构的新产品,这有可能是传统四大PC厂商首次推出的基于ARM架构的消费电子产品,也意味着在移动互联网和产业融合趋势下,传统的PC芯片霸主英特尔正在遭遇挑战。
11月12日,联想集团副总裁兼中国区总裁夏立向本报证实,联想基于ARM架构的新产品正在筹备中。
英特尔新闻发言人孟轶嘉表示,对第三方合作伙伴信息不便评论。
正面交锋
ARM内部人士透露,11月5日,ARM高级副总裁lanDrew参观了联想研究院,拜访了联想负责消费产品的负责人,进一步商讨基于ARM架构的新产品。ARM是英国芯片设计厂商,全球几乎95%的手机都采用ARM设计的芯片。
据悉,这是一款采用高通芯片(基于ARM架构)的新产品,高通产品市场总监钱志军表示,联想对此次项目很谨慎,对于产品细节不方便透露。
夏立告诉记者,联想研究院正在考虑多种方案,此款基于ARM架构的新产品应用邻域多样化,并不是替代传统的PC,而是更丰富的满足用户的需求。目前,客户调研还没有完成,“设计、研发更前瞻一些,最终还要看市场、用户接受程度。”";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>分词测试</title>
</head>
<body>
<table width='90%' align='center'>
<tr>
<td>
<hr size='1' />
<form id="form1" name="form1" method="post" action="?ac=done" style="margin:0px;padding:0px;line-height:24px;">
<b>源文本:</b> <a href="dict_build_new.php" target="_blank">[更新词典]</a> <br/>
<textarea name="source" style="width:98%;height:150px;font-size:14px;"><?php echo (isset($_POST['source']) ? $_POST['source'] : $teststr); ?></textarea>
<br/>
<input type='checkbox' name='do_fork' value='1' <?php echo ($do_fork ? "checked='1'" : ''); ?>/>岐义处理
<input type='checkbox' name='do_unit' value='1' <?php echo ($do_unit ? "checked='1'" : ''); ?>/>新词识别
<input type='checkbox' name='do_multi' value='1' <?php echo ($do_multi ? "checked='1'" : ''); ?>/>多元切分
<input type='checkbox' name='do_prop' value='1' <?php echo ($do_prop ? "checked='1'" : ''); ?>/>词性标注
<input type='checkbox' name='pri_dict' value='1' <?php echo ($pri_dict ? "checked='1'" : ''); ?>/>预载全部词条
<br/>
<input type="submit" name="Submit" value="提交进行分词" />
<input type="reset" name="Submit2" value="重设表单数据" />
</form>
<br />
<textarea name="result" id="result" style="width:98%;height:120px;font-size:14px;color:#555"><?php echo (isset($okresult) ? $okresult : ''); ?></textarea>
<br /><br />
<b>调试信息:</b>
<hr />
<font color='blue'>字串长度:</font><?php echo $slen; ?>K <font color='blue'>自动识别词:</font><?php echo (isset($pa_foundWordStr)) ? $pa_foundWordStr : ''; ?><br />
<hr />
<font color='blue'>内存占用及执行时间:</font>(表示完成某个动作后正在占用的内存)<hr />
<?php echo $memory_info; ?>
总用时:<?php echo $endtime; ?> 秒
</td>
</tr>
</table>
</body>
</html>
dict_build中的演示代码:
<?php
//编译词库
ini_set('memory_limit', '128M');
error_reporting(E_ALL);
header('Content-Type: text/html; charset=utf-8');
require_once('phpanalysis.class.php');
$dicAddon = dirname(__FILE__).'/dict/not-build/base_dic_full.txt';
if( empty($_GET['ac']) )
{
echo "<div style='line-height:28px;'>请选择要进行的操作:<br />";
echo "1、<a href='?ac=make'>用原始文件(dict/not-build/base_dic_full.txt)生成一个标准词典;</a><br />";
echo "2、<a href='?ac=revert'>从默认词典(dict/base_dic_full.dic),反编译出原始文件。</a></div>";
exit();
}
if( $_GET['ac']=='make' )
{
PhpAnalysis::$loadInit = false;
$pa = new PhpAnalysis('utf-8', 'utf-8', false);
$pa->MakeDict( $dicAddon );
echo "完成词典创建!";
exit();
}
else
{
$pa = new PhpAnalysis('utf-8', 'utf-8', true);
$pa->ExportDict('base_dic_source.txt');
echo "完成反编译词典文件,生成的文件为:base_dic_source.txt !";
exit();
}
?>
三、自动标签添加思路:分词、数据库查询和关联表操作
在上述官方代码示例中,只讲述了分词的部分,并未详细说明如何将分词结果添加到数据库中。在这里,我将简要描述一下自动标签添加的思路,并与大家分享。
自动标签添加包括两个方面:添加和编辑。
添加自动标签的思路如下:
- 将分词结果存入一个数组。
- 对这个数组进行数据库查询。在高并发情况下,建议使用数据缓存机制。
- 如果查询结果为空,则将该标签添加到标签表中,并返回对应的标签ID。
- 如果查询结果不为空,则返回已存在的标签ID。
- 收集所有返回的标签ID。同时,你需要准备两张数据表:标签表和关联表。
- 将获取到的标签ID与文章ID对应存入关联表中,完成标签的添加过程。
编辑自动标签的思路如下:
- 首先,按照上述思路进行分词和数据库查询。
- 在将标签添加到关联表之前,需要先删除原先的数据。
- 然后,将新的标签数据添加到关联表中,完成编辑的自动标签添加过程。
以上是自动标签添加的基本思路,希望能对你有所帮助。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!