在采集过程中,想对文章进行标签提取,龙哥找了七七四十九天终于找到
对于这个问题,我进行了大量的资料搜索,但很可惜,网上没有现成的好文档来解释如何解决。只能自己动手了。
经过漫长的搜索和筛选,黄天终于眷顾了我。找到了一款纯PHP实现的中文切分工具。
名称:PHPAnalysis
官方网址已经打不开了,据说下载也有点不给力;
我将它上传到了csdn资源,你可以在这里快速下载,希望对你有帮助。
废话不多说,我们来看看如何使用吧。
首先,解压下载的程序,将它放在自己工程中的某个目录下。不需要修改其中的任何文件。
$resultType = 1 #生成的分词结果数据类型(1 为全部, 2为 词典词汇及单个中日韩简繁字符及英文, 3 为词典词汇及英文)
# 这个变量一般用 SetResultType( $rstype ) 这方法进行设置。
$notSplitLen = 5 # 切分句子最短长度
$toLower = false # 把英文单词全部转小写
$differMax = false # 使用最大切分模式对二元词进行消岐
$unitWord = true # 尝试合并单字(即是新词识别)
$differFreq = false # 使用热门词优先模式进行消岐
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
值为:
返回值: void
public function GetFinallyKeywords($num = 10)
函数说明: 获取出现频率最高的指定词条数(通常用于提取文档关键字)
参数列表:
$num
:返回词条个数返回值: 用逗号分隔的关键字列表
public function GetFinallyResult($spword=' ')
函数说明: 获得最终分词结果
参数列表:
$spword
:词条之间的分隔符返回值: string
public function GetSimpleResult()
函数说明: 获得粗分结果
返回值: array
public function GetSimpleResultAll()
函数说明: 获得包含属性信息的粗分结果
属性:
返回值: 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中的演示代码:
// 严格开发模式
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} 秒
\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中的演示代码:
//编译词库
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 "请选择要进行的操作:
";
echo "1、用原始文件(dict/not-build/base_dic_full.txt)生成一个标准词典;
";
echo "2、从默认词典(dict/base_dic_full.dic),反编译出原始文件。";
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();
}
?>
在上述官方代码示例中,只讲述了分词的部分,并未详细说明如何将分词结果添加到数据库中。在这里,我将简要描述一下自动标签添加的思路,并与大家分享。
自动标签添加包括两个方面:添加和编辑。
添加自动标签的思路如下:
编辑自动标签的思路如下:
以上是自动标签添加的基本思路,希望能对你有所帮助。