PHP分词

<?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($optarg2
);
            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;?>> 智能识别人名
        &nbsp;
        <input type=checkbox name=ignore value="yes"<?php echo $checked_ignore;?>> 清除标点符号
        &nbsp;
        <input type=checkbox name=debug value="yes"<?php echo $checked_debug;?>> debug(v2)
        &nbsp;
        <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>
        &nbsp;
        尝试采用第
        <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>
        版分词算法
        &nbsp;&nbsp;
      </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 ?>
含有3种切分方法 getWord 长度优先切分 。最快 getShortWord 细粒度切分。比最快慢一点点 getAutoWord 自动切分 (在相邻词做了递归) 。效果最好 可自定义词典,自己添加词语到词库,词库支持文本格式json和二级制格式igb 二进制格式词典小,加载快 dict.igb含有175662个词,欢迎大家补充词语到 dict.txt ,格式(词语 \t idf \t 词性) idf 获取方法 百度搜索这个词语 Math.log(100000001/结果数量),如果你有更好的方法欢迎补充。 词性 [标点符号,名词,动词,形容词,区别词,代词,数词,量词,副词,介词,连词,助词,语气词,拟声词,叹词] 取index ;标点符号取0 三种分词结果对比 $fc = new VicWord('igb'); $arr = $fc->getWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒'); //北京大学|生喝|进口|红酒|,|在|北京大学|生活区|喝|进口|红酒 //$arr 是一个数组 每个单元的结构[词语,词语位置,词性,这个词语是否包含在词典中] 这里只值列出了词语 $arr = $fc->getShortWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒'); //北京|大学|生喝|进口|红酒|,|在|北京|大学|生活|区喝|进口|红酒 $arr = $fc->getAutoWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒'); //北京|大学生|喝|进口|红酒|,|在|北京大学|生活区|喝|进口|红酒 //对比 //qq的分词和百度的分词 http://nlp.qq.com/semantic.cgi#page2 http://ai.baidu.com/tech/nlp/lexical 分词速度 机器阿里云 Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz getWord 每秒140w字 getShortWord 每秒138w字 getAutoWord 每秒40w字 测试文本在百度百科拷贝的一段5000字的文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值