源码地址:http://scws.tguanlim.com/
<?php
/* ----------------------------------------------------------------------- */
PHP-简易中文分词 (SCWS) ver 3.1/2.1 (实例演示)
(*) 基于词频词典逐点搜索最长词, 双向根据词频取较高之分法
-----------------------------------------------------------------------
作者: 马明练(hightman) (MSN: MingL_Mar@msn.com) (php-QQ群: 17708754)
网站: http://php.twomice.net
时间: 2006/03/05
目的: 学习研究交流用, 希望有好的建议及用途希望能进一步交流.
-----------------------------------------------------------------------
运行环境: PHP 4.x.* (x>0) (编译需要 --enable-dba --with-[cdb|gdbm])
/* ----------------------------------------------------------------------- */
/**
* 查看源码的参数 <*.php?source>
*/
if (isset($_SERVER['QUERY_STRING'])
&& !strcasecmp($_SERVER['QUERY_STRING'], 'source'))
{
highlight_file(__FILE__);
exit(0);
}
/**
* 实例进行
*/
// 尝试计算实列运算时间
function get_microtime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
$time_start = get_microtime();
// 分词结果之回调函数 (param: 分好的词组成的数组)
function words_cb($ar)
{
echo implode(' ', $ar);
flush();
}
// 实例化前的参数指定与读取
$dict = 'dict/dict.cdb';
$mydata = NULL; // 待切数据
$version = 3; // 采用版本
$autodis = false; // 是否识别名字
$ignore = false; // 是否忽略标点
$debug = false; // 是否为除错模式
$is_cli = (php_sapi_name() == 'cli'); // 是否为 cli 运行环境
// 根据不同版本的环境读取参数设置
if ($is_cli)
{
$argc = $_SERVER['argc'];
for ($i = 1; $i < $argc; $i++)
{
$optarg = $_SERVER['argv'][$i];
if (!strncmp($optarg, "--", 2))
{
$cmp = substr($optarg, 2);
if (!strcasecmp($cmp, "help"))
{
$mydata = NULL;
break;
}
else if (!strcasecmp($cmp, "autodis"))
$autodis = true;
else if (!strcasecmp($cmp, "ignore"))
$ignore = true;
else if (!strcasecmp($cmp, "v2"))
$version = 2;
else if (!strcasecmp($cmp, "debug"))
$debug = true;
else if (!strcasecmp($cmp, "dict"))
{
$i++;
$dict = $_SERVER['argv'][$i];
}
}
else if (is_null($mydata))
$mydata = trim($optarg);
if (!is_null($mydata) && is_file($mydata))
$mydata = @file_get_contents($mydata);
}
}
else
{
// 部分参数选项
$checked_ignore = $checked_autodis = $checked_v2 = '';
// 是否指定有第 2 版
if (isset($_REQUEST['version']) && $_REQUEST['version'] == 2)
{
$version = 2;
$checked_v2 = ' selected';
}
// 是否指定一个词典格式
$selected_gdbm = $selected_text = $selected_sqlite = '';
if (isset($_REQUEST['dict']))
{
if ($_REQUEST['dict'] == 'gdbm')
{
$dict = 'dict/dict.gdbm';
$selected_gdbm = ' selected';
}
else if ($_REQUEST['dict'] == 'text')
{
$dict = 'dict/cwords.txt';
$selected_text = ' selected';
}
else if ($_REQUEST['dict'] == 'sqlite')
{
$dict = 'dict/dict.sqlite';
$selected_sqlite = ' selected';
}
else
{
$_REQUEST['dict'] = 'cdb';
}
}
// 是否开启人名识别 (缺省关闭)
if (isset($_REQUEST['autodis']) && !strcmp($_REQUEST['autodis'], 'yes'))
{
$autodis = true;
$checked_autodis = ' checked';
}
// 是否清除标点符号
if (isset($_REQUEST['ignore']) && !strcmp($_REQUEST['ignore'], 'yes'))
{
$ignore = true;
$checked_ignore = ' checked';
}
// 是否开启debug
if (isset($_REQUEST['debug']) && !strcmp($_REQUEST['debug'], 'yes'))
{
$debug = true;
$checked_debug = ' checked';
}
// 切分数据
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);
}
}
// 清除最后的 /r/n/t
if (!is_null($mydata))
$mydata = trim($mydata);
// 实例化分词对像(mydata非空)
$object = 'my_SimpledCWS' . $version;
require ($object . '.class.php');
$cws = new $object($dict);
$cws->set_ignore_mark($ignore);
$cws->set_autodis($autodis);
$cws->set_debug($debug);
?>
<?php if (!$is_cli) { ?>
<html>
<head>
<title>PHP简易中文分词(SCWS) 第<?php echo $version; ?>版在线演示 (by hightman)</title>
<meta http-equiv="Content-type" content="text/html; charset=gbk">
<style type="text/css">
<!--
td, body { background-color: #efefef; font-family: tahoma; font-size: 14px; }
.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>第<?php echo $version; ?>版</font> - 在线演示 (by hightman)
</h3>
基本功能: 根据词频词典进行机械分词、中外人名智能辨认 (词典格式: gdbm/cdb等)
<hr />
<table width=100% border=0>
<tr>
<form method=post>
<td width=100%>
<strong>请输入文字点击提交尝试分词: </strong> <br />
<textarea name=mydata cols=60 rows=8 class=demotx><?php echo $mydata; ?></textarea>
<small>
<input type=checkbox name=autodis value="yes"<?php echo $checked_autodis;?>> 智能识别人名
<input type=checkbox name=ignore value="yes"<?php echo $checked_ignore;?>> 清除标点符号
<input type=checkbox name=debug value="yes"<?php echo $checked_debug;?>> debug(v2)
<br />
词典格式:
<select name=dict size=1>
<option value=cdb>CDB</option>
<option value=gdbm<?php echo $selected_gdbm; ?>>GDBM</option>
<option value=text<?php echo $selected_text; ?>>Text</option>
<option value=sqlite<?php echo $selected_sqlite; ?>>SQLite2.x</option>
</select>
尝试采用第
<select name=version size=1 style="color: red; font-weight: bold;">
<option value=3>3</option>
<option value=2<?php echo $checked_v2;?>>2</option>
</select>
版分词算法
</small>
<input type=submit>
</td>
</form>
</tr>
<tr>
<td><hr /></td>
</tr>
<tr>
<td width=100%>
<strong>分词结果(原文总长度 <?php echo strlen($mydata); ?> 字符) </strong>
<br />
<textarea cols=60 rows=8 class=demotx readonly>
<?php } else { ?>
_____________________________________________________________________
PHP简易中文分词程序(SCWS) - 第<?php echo $version; ?>版 - by hightman
_____________________________________________________________________
1.基于词频词典逐点搜索最长词, 双向根据词频取较高之分法
2.用法: <?php echo $_SERVER['argv'][0]; ?> [选项] <string|file>
3.选项: --autodis 打开人名识别
--ignore 清除结果中的标点符号
--v2 使用第2版分词算法(缺省第3版)
--dict <file>直接指定词典文件, 后缀(.cdb|.gdbm|.txt|.sqlite)
--help 显示本页帮助文件
4.结果: 直接输出分词结果, 词之间以空格分隔
_____________________________________________________________________
<?php } ?>
<?php
// 执行切分, 分词结果数组执行 words_cb()
$cws->segment($mydata, 'words_cb');
// 切分时间统计
$time_end = get_microtime();
$time = $time_end - $time_start;
// 以下显示结果
?>
<?php if (!$is_cli) { ?>
</textarea>
<small>
分词耗时: <?php echo $time; ?>秒,
词典查询次数: <?php echo $cws->_dict->query_times; ?>次
</small>
</td>
</tr>
</table>
<hr />
<small>
注: 本程序代码及相关词典免费开放下载, 供研究学习交流.
参见网页 <a href=http://php.twomice.net target=_blank>http://php.twomice.net</a>
或直接 <a href="?source" target="_blank">查看源码</a>
</small>
</body>
</html>
<?php } else if (!empty($mydata)) { ?>
_____________________________________________________________________
总长: <?php echo strlen($mydata); ?>字符, 耗时: <?php echo $time; ?>秒, 查词次数: <?php echo $cws->_dict->query_times; ?>次
<?php } ?>