All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
ASP.NET,2.0,创建母版页引来的麻烦_[Asp.Net教程]
SQL,server,2005安装问题汇总_mssql学习_编程技术
delphi浮动工具栏实例
解决跨站点XMLHttp请求的一个变通方法_[XML教程]
实例:用PHP技术解决网站URL格式过长的问题_php资料_编程技术
构成Delphi工程的文件:工程文件
PHP实例:一个非常全面获取图象信息的PHP函数_php资料_编程技术
ASP.NET,2.0发送电子邮件全面剖析之二_.net资料_编程技术
PHP环境下配置在线编辑器FCKeditor_[PHP教程]
关于PHP字符集的问题_php资料_编程技术
Reading number is top 10 pictures
男人帮杂志里的惹火性感美女2
The money of more than 100 countries and regions4
清纯性感的美眉1
人美胸美腿更美2
A beautiful girl to bud2
如果没有好报,为什么要做好人?
贩卖儿童者必须判死刑
Wild animals melee moment of life and death2
大四女生借债隆胸成功
A man's favorite things15
Download software ranking
圣殿祭司的ASP.NET.2.0.开发详解-使用C#
Eclipse-CALMSANNY (second edition)
JSP+Ajax Web development typical examples
matrix1
linux初级教程
Professional killers2 data package
C++编程教程第三版
Kung fu panda - the secret of the teacher
双旗镇刀客B
Ashlynn Video2
aaa published in(发表于) 2013/12/24 5:56:07 Edit(编辑)
应用技巧:用PHP简易实现中文分词_php资料_编程技术

应用技巧:用PHP简易实现中文分词_php资料_编程技术

应用技巧:用PHP简易实现中文分词_php资料_编程技术-你的首页-uuhomepage.com

PHP去做中文分词并不是一个太明智的举动, :p

下面是我根据网上找的一个字典档, 简易实现的一个分词程序.

(注: 字典档是gdbm格式, key是词 value是词频, 约4万个常用词)

//中文分词系统简易实现办法
//切句单位:凡是ascii值<128的字符
//常见双字节符号:《》,。、?“”;:!¥…… %$#@^&*()[]{}|\/"'
//可以考虑加入超常见中文字: 的 和 是 不 了 啊 (不过有特殊字比如 "打的" "郑和" .. :p)


//计算时间
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();


//词典类
class ch_dictionary {
var $_id;

function ch_dictionary($fname = "") {
if ($fname != "") {
$this->load($fname);
}
}

// 根据文件名载入字典 (gdbm数据档案)
function load($fname) {
$this->_id = dba_popen($fname, "r", "gdbm");
if (!$this->_id) {
echo "failed to open the dictionary.($fname)
\n";
exit;
}
}

// 根据词语返回频率, 不存在返回-1
function find($word) {
$freq = dba_fetch($word, $this->_id);
if (is_bool($freq)) $freq = -1;
return $freq;
}
}

// 分词类: (逆向)
// 先将输入的字串正向切成句子, 然后一句一句的分词, 返回由词组成的数组.
class ch_word_split {
var $_mb_mark_list; // 常见切分句子的全角标点
var $_word_maxlen; // 单个词最大可能长度(汉字字数)
var $_dic; // 词典...
var $_ignore_mark; // true or false

function ch_word_split () {
$this->_mb_mark_list = array(","," ","。","!","?",":","……","、","“","”","《","》","(",")");
$this->_word_maxlen = 12; // 12个汉字
$this->_dic = NULL;
$this->_ignore_mark = true;
}

// 设定字典
function set_dic($fname) {
$this->_dic = new ch_dictionary($fname);
}

function set_ignore_mark($set) {
if (is_bool($set)) $this->_ignore_mark = $set;
}

// 将字串切成句子再加以切分成词
function string_split($str, $func = "") {
$ret = array();

if ($func == "" || !function_exists($func)) $func = "";

$len = strlen($str);
$qtr = "";

for ($i = 0; $i < $len; $i++) {
$char = $str[$i];

if (ord($char) < 0xa1) {
// 读取到一个半角字符
if (!empty($qtr)) {
$tmp = $this->_sen_split($qtr);
$qtr = "";

if ($func != "") call_user_func($func, $tmp);
else $ret = array_merge($ret, $tmp);
}

// 如果是单词或数字. 根据 char 将数据读取到 >= 0xa1为止
if ($this->_is_alnum($char)) {
do {
if (($i+1) >= $len) break;
$char2 = substr($str, $i + 1, 1);
if (!$this->_is_alnum($char2)) break;

$char .= $char2;
$i++;
} while (1);

if ($func != "") call_user_func($func, array($char));
else $ret[] = $char;
}
elseif ($char == ' ' || $char == "\t") {
// nothing.
continue;
}
elseif (!$this->_ignore_mark) {
if ($func != "") call_user_func($func, array($char));
else $ret[] = $char;
}
}
else {
// 双字节字符.
$i++;
$char .= $str[$i];

if (in_array($char, $this->_mb_mark_list)) {
if (!empty($qtr)) {
$tmp = $this->_sen_split($qtr);
$qtr = "";

if ($func != "") call_user_func($func, $tmp);
else $ret = array_merge($ret, $tmp);
}

if (!$this->_ignore_mark) {
if ($func != "") call_user_func($func, array($char));
else $ret[] = $char;
}
}
else {
$qtr .= $char;
}
}
}

if (strlen($qtr) > 0) {
$tmp = $this->_sen_split($qtr);

if ($func != "") call_user_func($func, $tmp);
else $ret = array_merge($ret, $tmp);
}

// return value
if ($func == "") {
return $ret;
}
else {
return true;
}
}

// 将句子切成词, 逆向
function _sen_split($sen) {
$len = strlen($sen) / 2;
$ret = array();

for ($i = $len - 1; $i >= 0; $i--) {
// 如: 这是一个分词程序

// 先取得最后一个字
$w = substr($sen, $i * 2, 2);

// 最终的词长
$wlen = 1;

// 开始逆向匹配到最大长度.
$lf = 0; // last freq
for ($j = 1; $j <= $this->_word_maxlen; $j++) {
$o = $i - $j;
if ($o < 0) break;
$w2 = substr($sen, $o * 2, ($j + 1) * 2);

$tmp_f = $this->_dic->find($w2);
//echo "{$i}.{$j}: $w2 (f: $tmp_f)\n";
if ($tmp_f > $lf) {
$lf = $tmp_f;
$wlen = $j + 1;
$w = $w2;
}
}
// 根据 $wlen 将 $i 偏移了
$i = $i - $wlen + 1;
array_push($ret, $w);
}

$ret = array_reverse($ret);
return $ret;
}

// 判断字符是不是 字母数字_- [0-9a-z_-]
function _is_alnum($char) {
$ord = ord($char);
if ($ord == 45 || $ord == 95 || ($ord >= 48 && $ord <= 57))
return true;
if (($ord >= 97 && $ord <= 122) || ($ord >= 65 && $ord <= 90))
return true;
return false;
}
}


// 分词后的回调函数
function call_back($ar) {
foreach ($ar as $tmp) {
echo $tmp . " ";
//flush();
}
}

// 实例(如果没有输入就从 sample.txt中读取):
$wp = new ch_word_split();
$wp->set_dic("dic.db");

if (!isset($_REQUEST['testdat']) || empty($_REQUEST['testdat'])) {
$data = file_get_contents("sample.txt");
}
else {
$data = & $_REQUEST['testdat'];
}

// output
echo "

简易分词演示

\n";
echo "


\n";
echo "分词结果(" . strlen($data) . " chars):
\n
\n本次分词耗时: $time seconds
\n";
?>






您也可以在下面文本框中输入文字,提交后试验分词效果:











添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.