PHP开源中文分词 pscws4

SCWS 是 Simple Chinese Words Segmentation 的缩写,即简易中文分词系统。

这是一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。词是汉语的基本语素单位,而书写的时候不像英语会在词 之间用空格分开,所以如何准确而又快速的分词一直是中文分词的攻关难点。

SCWS 在概念上并无创新成分,采用的是自行采集的词频词典,并辅以一定程度上的专有名称、人名、地名、数字年代等规则集,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些中小型搜索引擎、关键字提取等场合运用。 SCWS 采用纯 C 代码开发,以 Unix-Like OS 为主要平台环境,提供共享函数库,方便植入各种现有软件系统。此外它支持 GBK,UTF-8,BIG5 等汉字编码,切词效率高。

[推荐]首个搭载 SCWS 分词系统的中小型站内全文检索解决方案 - FTPHP!

以下为本人在win03平台下,php5.2.5+apache2.2.11平台下推荐的方法,特别的简单,用的是gbk的字库的

1.首先从http://www.ftphp.com/scws/download.php下载相关压缩包 .

php_scws.dll (1.1.1)

php_scws.dll 是由 ben 移植用于 Windows 平台下的 PHP 动态扩展库,请根据您使用的 php 版本下载,编译环境均为:VC6 x86 Thread Safe。

[For PHP-4.4.x (20KB)]  [For PHP-5.2.x (20KB)]  [For PHP-5.3.x (20KB)]  [详细安装说明]  [PHP扩展-API 文档]

XDB 词典文件

XDB 格式的词典文件,可用于 SCWS-1.x.x 和 PSCWS4,不可用于 PSCWS23。
此为通用词典文件,定制词典或其它服务请查看服务支持页面。

[简体中文 (GBK) (3.84MB, 28万词, 2010/03/19更新)]
[简体中文 (UTF-8) (3.9MB, 28万词, 2010/03/19更新)]
[繁 体中文(UTF-8) (1.21MB, 10万词)]

PSCWS23

纯 PHP 开发的 SCWS 第二版和第三版,仅支持 GBK 字符集,速度较快,推荐在全 PHP 环境中使用,已含专用 xdb 词典一部。

[立即下载: pscws23-20081221.tar.bz2 (2.79MB)] [说明文档]

规则集文件

SCWS 及 PSCWS4 通用的规则集文件,用于识别人名、地名、数字年代等。内含简体GBK、繁体UTF8、简体UTF8三个文件。
一般不需要单独下载,随 scws 一起发布的源码包中已经包含这些文件。

[立即下载: scws-rules-all.zip (6.67KB)]

2.将下面下载的几个压缩文件解压,将scws_1.1.1_win32_php-5.2.x.zip包里的php_scws.dll文件放在d:/php/ext目录里,注意这个地方需要根据你自己的php的环境来存放.

3.在d:/php目录里新建 scws/etc文件夹,将规则集文件cws-rules-all.zip里的ini文件放在这里,我用的时候有三个的,再将解压后的词典件dict.xdb也放在这里.

4.修改c:/windows/php.ini文件,在配置文件的最后面添加:

[scws]
extension = php_scws.dll
scws.default.charset = gbk
scws.default.fpath = "d:/php/scws/etc"

这三行,重启apache即可.可以通过查看phpino信息,来查看是否启用了scws扩展.

以上配置基本完成了,特别的简单的吧,呵呵!

如果需要查看演示的话只需要将从网站上下载的演示包放在一个站点的根目录里就可以了.如http://www.ftphp.com/scws/demo/v4.php,我下的v4版本里的演示和官方网站上的演示有些出入的,你要以通过http://www.ftphp.com/scws/demo/v4.php?source来复制一下php代码,保存到本地文件即可了.

以下为本人的用的配置信息,点击下载scws配置,记得将最后的的_.txt去掉,实际上是一个rar的压缩包的.

 

配置文件如下:

 

<?php
// hightman, SCWS v4 (built as php_extension)
// 2007/06/02
//
// view the source code
if (isset($_SERVER['QUERY_STRING']) 
    && !strncasecmp($_SERVER['QUERY_STRING'], 'source', 6))
{
    highlight_file(__FILE__);
    exit(0);
}

// try to count the time
function get_microtime()
{
    list($usec, $sec) = explode(' ', microtime()); 
    return ((float)$usec + (float)$sec); 
}
$time_start = get_microtime();

// demo data
if (!isset($_REQUEST['mydata']) || empty($_REQUEST['mydata']))
    $mydata = file_get_contents('sample.txt');    
else
{
    $mydata = & $_REQUEST['mydata'];
    if (get_magic_quotes_gpc())
        $mydata = stripslashes($mydata);
}

// other options
$ignore = $showa = $stats = $duality = false;

// 是否清除标点符号
if (isset($_REQUEST['ignore']) && !strcmp($_REQUEST['ignore'], 'yes'))
{
    $ignore = true;
    $checked_ignore = ' checked';
}

// 是否散字自动二元
if (isset($_REQUEST['duality']) && !strcmp($_REQUEST['duality'], 'yes'))
{
    $duality = true;
    $checked_duality = ' checked';
}

// 是否标注词性
if (isset($_REQUEST['showa']) && !strcmp($_REQUEST['showa'], 'yes'))
{
    $showa = true;
    $checked_showa = ' checked';
}

// 是转看统计表
if (isset($_REQUEST['stats']) && !strcmp($_REQUEST['stats'], 'yes'))
{
    $stats = true;
    $checked_stats = ' checked';
}

// 是否复合分词?
$multi = 0;
if (isset($_REQUEST['multi']) && is_array($_REQUEST['multi'])){
    foreach ($_REQUEST['multi'] as $mval) $multi |= intval($mval);
}
$mtags = array('最短词' => 1, '二元' => 2, '重要单字' => 4, '全部单字' => 8);

$xattr = &$_REQUEST['xattr'];
if (!isset($xattr)) $xattr = '~v';
$limit = &$_REQUEST['limit'];
if (!isset($limit)) $limit = 10;

// do the segment
$cws = scws_new();
$cws->set_charset('gbk');
$cws->set_rule(ini_get('scws.default.fpath') . '/rules.ini');
$cws->set_dict(ini_get('scws.default.fpath') . '/dict.xdb');

//
// use default dictionary & rules
//
$cws->set_duality($duality);
$cws->set_ignore($ignore);
$cws->set_multi($multi);
$cws->send_text($mydata);
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=gbk">
<title>PHP简易中文分词(SCWS) 第4版在线演示 (by hightman)</title>
<style type="text/css">
<!--
td, body    { background-color: #efefef; font-family: tahoma; font-size: 14px; word-break: break-all; }
.demotx        { font-size: 12px; width: 100%; height: 140px; }
small        { font-size: 12px; }
//-->
</style>
</head>
<body>
<h3>
  <font color=red>PHP简易中文分词(SCWS)</font>
  <font color=blue>第4版(GBK)</font> - 在线演示 (by hightman)
</h3>  
基本功能: 根据词频词典较为智能的中文分词,支持规则识别人名、地区等。(<a href="v48.php">UTF-8点这里</a> <a href="v48.cht.php">繁体版</a>)<br />
<a href="http://www.xunsearch.com" target="_blank">推荐看看,结合 scws + xapian 构建的开源全文搜索引擎 xunsearch !!</a> <hr />

<table width=100% border=0>
  <tr>
    <form method=post>
    <td width=100%>
      <strong>请输入文字点击提交尝试分词: </strong> <br />
      <textarea name=mydata cols=60 rows=14 class=demotx><?php echo $mydata; ?></textarea>
      <small>
        <span style="color:#666666;">        
        <strong>[复合分词选项]</strong>
<?php foreach ($mtags as $mtag => $mval) { ?>
        <input type=checkbox name="multi[]" value=<?php echo $mval . " " . (($multi & $mval) ? " checked" : "");?>><?php echo $mtag;?>&nbsp;
<?php } ?>
        </span>
        <br />
        <input type=checkbox name=ignore value="yes"<?php echo $checked_ignore;?>> 清除标点符号
        &nbsp;
        <input type=checkbox name=duality value="yes"<?php echo $checked_duality;?>> 散字二元
        &nbsp;
        <input type=checkbox name=showa value="yes"<?php echo $checked_showa;?>> <font color=green>标注词性</font>
        &nbsp;
        <input type=checkbox name=stats value="yes"<?php echo $checked_stats;?>> <font color=red>只看统计</font>
        <input type=text name=limit size=2 value="<?php echo intval($limit);?>">个
        &nbsp;
        统计词性: 
        <input type=text name=xattr size=8 value="<?php echo htmlspecialchars($xattr);?>">(多个用,分开 以~开头表示不包含)
      </small>
      <input type=submit>
      </td>
      </form>
    </tr>
    <tr>
      <td><hr /></td>
    </tr>
    <tr>
      <td width=100%>
        <strong>分词结果(原文总长度 <?php echo strlen($mydata); ?> 字符) </strong>
        (<a href="http://bbs.xunsearch.com/forumdisplay.php?fid=8" target="_blank">这次分词结果不对,点击汇报</a>)
        <br />
        <textarea cols=60 rows=14 class=demotx readonly style="color:#888;">
<?php
if ($stats == true)
{
    // stats
    printf("No. WordString               Attr  Weight(times)\n");
    printf("-------------------------------------------------\n");
    $list = $cws->get_tops($limit, $xattr);
    $cnt = 1;
    settype($list, 'array');
    foreach ($list as $tmp)
    {
        printf("%02d. %-24.24s %-4.2s  %.2f(%d)\n",
            $cnt, $tmp['word'], $tmp['attr'], $tmp['weight'], $tmp['times']);
        $cnt++;
    }
}
else
{
    // segment
    while ($res = $cws->get_result())
    {
        foreach ($res as $tmp)
        {
            if ($tmp['len'] == 1 && $tmp['word'] == "\r")
                continue;
            if ($tmp['len'] == 1 && $tmp['word'] == "\n")
                echo $tmp['word'];
            else if ($showa)
                printf("%s/%s ", $tmp['word'], $tmp['attr']);
            else
                printf("%s ", $tmp['word']);
        }
        flush();
    }
}

$cws->close();
$time_end = get_microtime();
$time = $time_end - $time_start;
?>
        </textarea>
        <small>
          分词耗时: <?php echo $time; ?>秒
          <a href="../">返回scws主页</a>或直接<a href="?source" target="_blank">查看源码</a> Powered by <?php echo scws_version();?>
        </small>
    </td>
  </tr>
</table>
</body>
</html>

 

你可能感兴趣的:(中文分词)