免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hightman

[下载] php版简易中文分词代码及词典(新加cscwsd) [复制链接]

论坛徽章:
0
发表于 2005-12-03 22:33 |显示全部楼层
楼主,你的词库有法增加没?
另外,可否搞成c的模块或其他守护进程.如果每个页面要调用,那开销太大

论坛徽章:
0
发表于 2005-12-07 23:21 |显示全部楼层

$p>=66是什么意思?

下面这个函数里面一名$p>=66,我是怎么也弄不明白,不知有哪位看懂了?能否指点一下?
        /** 中文数字年代/时间描述 (如 九点二分) */
        function _fetch_zhnum($off)
        {
                $ret = 0;

                do
                {
                        if ($off >= $this->_cur_sen_len)
                                break;
                       
                        $zh = substr($this->_cur_sen_buf, $off, 2);
                       
                        if (($p = strpos($this->_mb_num2_chars, $zh)) === false
                                || ($p & 0x01))
                                break;

                        if ($ret === 0)
                        {
                                // 严格起始: 第/一二三 ...
                                if ($p >= 66)
                                        break;

                        }
                        else
                        {
                                // 注意保护词典词的完整性
                                $chk = $this->_fetch_long($off, 4, 0);
                                if ($chk[0] > 0)
                                        break;
                        }

                        $off += 2;
                        $ret += 2;
                }
                while (1);
               
                if ($ret <= 2)
                        $ret = 0;

                return $ret;
        }

论坛徽章:
0
发表于 2005-12-08 09:46 |显示全部楼层
中文分词能不能用于新闻发表时候系统自动缩句?

比如我想在我的新闻发布系统里,实现像163等门户的新闻列表块,他们的形式是这样的:
·温家宝总理会见斯洛伐克总统 愿从3个方面加强合作
·天价医疗费:主治医生称二院掩盖真相 暴露监管漏洞
·伊朗军机居民区撞楼坠毁128人死亡 伊朗将展开调查
·死刑第二审明年开庭审理 保证死刑判决公正和慎重
·中美战略对话经济话题占重头 中美握手日本"犯酸"
·卫生部调查广西禽流感病例疫源 亚洲16国防控共识

他们正好能把新闻拼成一个块,把列表填得满满的。比如:
·死刑第二审明年开庭审理 保证死刑判决公正和慎重
·中美战略对话经济话题占重头 中美握手日本"犯酸"
其实这里面包含了四条新闻,只不过可能是他的系统或者是新闻更新人员手工缩句,实现这样的效果。
那如果借用这个中文分词技术,是否就可以我先统计这一列的第一条新闻的字数,然后用这列允许的总字数-第一条新闻的字数,得到第二条新闻允许的字数,然后再用分词技术把第二条新闻进行缩句呢?然后系统缩完后,我们再人工进行校正。
楼主觉得这样可行吗?

论坛徽章:
0
发表于 2005-12-08 10:41 |显示全部楼层
原帖由 wildlily980 于 2005-12-7 23:21 发表
                        if (($p = strpos($this->_mb_num2_chars, $zh)) === false
                                || ($p & 0x01))
                                break;

                        if ($ret === 0)
                        {
                                // 严格起始: 第/一二三 ...
                                if ($p >= 66)
                                        break;
                        }


因为 p 是前面 strpos() 的值, 而 _mb_num2_chars 是一长串字符, 偏移 66 即第 33字起是一些修饰词, 如: 点, 年, 分 ...

智能识别数字时间时要求完全从 第,一,二,三 开始, 所以这样判断一下

论坛徽章:
0
发表于 2005-12-08 14:35 |显示全部楼层
原帖由 diychen 于 2005-12-8 09:46 发表
中文分词能不能用于新闻发表时候系统自动缩句?

比如我想在我的新闻发布系统里,实现像163等门户的新闻列表块,他们的形式是这样的:
·温家宝总理会见斯洛伐克总统 愿从3个方面加强合作
·天价医疗费:主治医 ...



hightman,能帮帮我吗?

论坛徽章:
0
发表于 2005-12-08 21:52 |显示全部楼层
谢谢hightman。
另外程序里好像有个小bug:那个复姓的字符串我下载的是每个姓之间有空格的“东郭 司空 ……”,但是从程序上看应该是“东郭司空……”才对。
因为用(……$p&0x03)来判断$p是否是0,4,8,12,如果有空格的话,那么$p是0,5,10
不知是我下载的有错误,还是您没留心。

论坛徽章:
0
发表于 2005-12-12 17:12 |显示全部楼层
今天字典数据导入mysql,小小改动就可以用了,在class db_dictionary{}下面几行加入:

  1. class db_dict extends db_dictionary {

  2.         var $_table = 'dict';
  3.        
  4.         /** 加载词典 (参数: 词典路径) */
  5.         function load($fname) {
  6.                 include_once('DB.php');
  7.                 $this->_dbh = DB::connect($fname);
  8.                 if (DB::isError($this->_dbh))
  9.                 {
  10.                         echo "fail to open the dictionary: $fname <br />" . CRLF;
  11.                         die;
  12.                 }
  13.                 $res = $this->_dbh->query("SET NAMES 'gbk'"); //mysql 4.1以上要这行,否则注释掉
  14.         }

  15.         /** 查词 */
  16.         function find($word)
  17.         {
  18.                 if (!DB::isError($this->_dbh))
  19.                 {
  20.                         $this->query_times++;

  21.                         // check the cache
  22.                         if ($this->has_cache && isset($this->_cache[$word]))
  23.                                 return $this->_cache[$word];                       

  24.                         // query from db
  25.                         $val = (int)$this->_dbh->getOne("SELECT `value`
  26.                         FROM {$this->_table} WHERE `key`=?", array($word) );

  27.                         // save to cache
  28.                         if ($this->has_cache)
  29.                                 $this->_cache[$word] = $val;

  30.                         return $val;
  31.                 } else {
  32.                         echo "you should load the dictionary file first! <br />" . CRLF;
  33.                         die;
  34.                 }
  35.         }
  36. }
复制代码


然后修改:

/** 分词类: 逆向最大 (2级复查词频比较) */
  1. class cword_segment {
  2. .................................

  3.         /** 设定词典 (根据后缀名确定类型) */
  4.         function set_dict($fname)
  5.         {
  6.                 $this->_dict = new db_dict($fname);
  7.         }


  8. .................................
  9. }
复制代码



调用的时候:

$wp->set_dict('mysql://root@localhost/test');

在win下php5.1.1 +apache 2.0.53测试通过,其中的include_once('DB.php');是调用的Pear::DB

[ 本帖最后由 titan3 于 2005-12-12 17:17 编辑 ]

论坛徽章:
0
发表于 2005-12-17 10:19 |显示全部楼层
有一个问题
在2.1版里判断用了
define ("_WORD_ALONE_",                0x4000000);        // 成词标记
define ("_WORD_PART_",                0x8000000);        // 词段标记
我搞不明白这个是什么?
楼主可以说说吗?

论坛徽章:
0
发表于 2005-12-26 16:02 |显示全部楼层
能提供MySQL版本的分词程序下载么?
谢谢

论坛徽章:
0
发表于 2005-12-26 16:08 |显示全部楼层
楼主,如何增加分词,甚至让程序自己识别增加分词???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP