PHPAnalysis:一款纯PHP实现的中文切分工具,助力php建站标签自由

2023-12-15 22:27:14

在采集过程中,想对文章进行标签提取,龙哥找了七七四十九天终于找到

对于这个问题,我进行了大量的资料搜索,但很可惜,网上没有现成的好文档来解释如何解决。只能自己动手了。

经过漫长的搜索和筛选,黄天终于眷顾了我。找到了一款纯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、主要成员函数列表

  1. 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 方法设置要操作的文本。

  2. public function SetSource($source, $source_charset='utf-8', $target_charset='utf-8')

    函数说明: 设置源字符串

    参数列表:

    • $source:源字符串
    • $source_charset:源字符串编码
    • $target_charset:目标字符串编码

    返回值: bool

  3. public function StartAnalysis($optimize=true)

    函数说明: 开始执行分词操作

    参数列表:

    • $optimize:分词后是否尝试优化结果

    返回值: void

    一个基本的分词过程:

    $pa = new PhpAnalysis();
    
    $pa->SetSource('需要进行分词的字符串');
    
    // 设置分词属性
    $pa->resultType = 2;
    $pa->differMax  = true;
    
    $pa->StartAnalysis();
    
    // 获取你想要的结果
    $pa->GetFinallyIndex();
    
  4. public function SetResultType($rstype)

    函数说明: 设置返回结果的类型,实际上是对成员变量 $resultType 的操作

    参数 $rstype 值为:

    • 1:为全部
    • 2:为词典词汇及单个中日韩简繁字符及英文
    • 3:为词典词汇及英文

    返回值: void

  5. public function GetFinallyKeywords($num = 10)

    函数说明: 获取出现频率最高的指定词条数(通常用于提取文档关键字)

    参数列表:

    • $num:返回词条个数

    返回值: 用逗号分隔的关键字列表

  6. public function GetFinallyResult($spword=' ')

    函数说明: 获得最终分词结果

    参数列表:

    • $spword:词条之间的分隔符

    返回值: string

  7. public function GetSimpleResult()

    函数说明: 获得粗分结果

    返回值: array

  8. public function GetSimpleResultAll()

    函数说明: 获得包含属性信息的粗分结果

    属性:

    • 1:中文词句
    • 2:ANSI词汇(包括全角)
    • 3:ANSI标点符号(包括全角)
    • 4:数字(包括全角)
    • 5:中文标点或无法识别字符

    返回值: array

  9. public function GetFinallyIndex()

    函数说明: 获取 hash 索引数组

    返回值: array(‘word’ => count, …),按出现频率排序

  10. public function MakeDict($source_file, $target_file='')

    函数说明: 将文本文件词库编译成词典

    参数列表:

    • $target_file:目标文件(如果不指定,则为当前词典)

返回值: void

  1. 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}: &nbsp;{$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>&nbsp; <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="提交进行分词" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <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();
}
?> 

三、自动标签添加思路:分词、数据库查询和关联表操作

在上述官方代码示例中,只讲述了分词的部分,并未详细说明如何将分词结果添加到数据库中。在这里,我将简要描述一下自动标签添加的思路,并与大家分享。

自动标签添加包括两个方面:添加和编辑。

添加自动标签的思路如下:

  1. 将分词结果存入一个数组。
  2. 对这个数组进行数据库查询。在高并发情况下,建议使用数据缓存机制。
  3. 如果查询结果为空,则将该标签添加到标签表中,并返回对应的标签ID。
  4. 如果查询结果不为空,则返回已存在的标签ID。
  5. 收集所有返回的标签ID。同时,你需要准备两张数据表:标签表和关联表。
  6. 将获取到的标签ID与文章ID对应存入关联表中,完成标签的添加过程。

编辑自动标签的思路如下:

  1. 首先,按照上述思路进行分词和数据库查询。
  2. 在将标签添加到关联表之前,需要先删除原先的数据。
  3. 然后,将新的标签数据添加到关联表中,完成编辑的自动标签添加过程。

以上是自动标签添加的基本思路,希望能对你有所帮助。

文章来源:https://blog.csdn.net/weixin_38912950/article/details/132748406
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。