Drupal 中文分词模块 (for drupal 6.x 强力更新)

zealy 在 周三, 2005-11-09 20:41 提交      Drupal技术

最新更新:

       drupal 6已经推出许久,很长时间没有精力为开源社区做点什么。籍着此次drupal 6.1升级的机会,将中文分词模块按照原来的理想做了有史以来最大的一次改进,相信改进的内容还是能让人振奋一下:

  1. 终于实现了预索引的分词字典文件,使用B+ Tree算法组织,可以快速进行基于文件的查找。获得的好处有:现在字典文件可以不再载入内存,使用B+树字典时基本不消耗内存,这样可以采用巨型字典,也可以避免大家的php内存超限制。
  2. 提供了B+树搜索用的简体中文巨型字典,本人专门生成的,准确性大大提高。
  3. 优化了算法,现在匹配循环比原来至少少三分之一。
  4. 提供了正向最小化和逆向最小化两种新的匹配算法,相对最大化匹配算法,其匹配循环可以减少一半以上,而结果也在可接受的范围。
  5. 提供类搜索的词长度选项,这个对性能有一定的影响,需要大家测试下看多少最为合理,因为目前提供的词库最长只有四个字,因此也只有2,3,4的长度选项才有意义。因为诗词的关系,今后也许会提供最长7个字的词库
  6. 修正了原来程序中的分词错误,现在对中英文数字混合字符串处理的正确率大大提高了。

      结合上面这些改进,性能至少超过原来的十倍,内存消耗从巨大降到很小,CPU占用率也很低(这些都基于我的VPS,我是lighttpd,大家可以提供反馈,看看你们的情况)。使用时请关闭搜索设置里的“简单中日韩处理”。

      目前还没有提交到drupal的cvs,大家先用我自己的下载吧。

      下载:csplitter for 5.x  csplitter for 6.x

以下为旧版内容: 

  Drupal 4.6 版Search模块采用分词预索引方式,不再使用数据库SQL Like查询,在数据量越来越大的时候前者无疑更具性能上的优势。但是,Drupal并没有中文分词功能,在我的主机环境中对中文UTF-8分词是完全错误、不能使用的。没办法,难道又回到SQL Like的老路上去?现在改用了PostgreSql并不熟悉是否能全文检索,MySql倒是有,不过也没用过。权衡再三,还是自己写一个分词模块吧,呵呵。
  没想到写起来并不是很困难就能达到比较实用的程度。有了正确的分词后就有正确的Search_index表数据,然后“相似节点”链接和自动Tags都好做了,你可以参见本站效果。
  如果想测试我们的中文分词模块,点这里。不妨试一下,结果蛮有趣的。

  update:目前已支持Drupal 4.7

   下载:for 4.7  for 4.6

此内容的Trackback地址:

http://blogme.cn/trackback/5323

十年、十年又十年 | 发表评论 | 打印版本 | 已被阅读12548次


zealy | 周日, 2006-03-19 23:47

  此模块已

  此模块已正式提交到drupal.org,地址在http://drupal.org/node/53886。希望大家喜欢,有问题请在drupal.org发起issue或在此留言。


qddavid | 周日, 2006-04-23 13:39

Csplitter的使用问题

──引用“希望大家喜欢,有问题请在drupal.org发起issue或在此留言。”
既然Zealy这样说了,我也不好客套了,那么──

zealy:
感谢你写的csplitter,我喜欢Drupal,只是搜索让人挠头。
我用上你写的中文分词模块,第一次搜索出了个什么权限问题,我没记住,我Chmod -R 777
第二次搜索发现反应时间长,然后什么也没返回,是空白屏幕。我谷歌了两天,到kzeng的drupalchina也去逛了,甚至试了rill的文章“目前还有这样的中文搜索问题吗?”的方法,错误更多,我都处理不了了,赶快恢复了事。
看本站和Drupalchina的搜索搞得这么好,我就纳闷了,都一样是人,咋差距就这么大哩?
zealy,你就好事做到底,教教我(们)吧!


zealy | 周一, 2006-04-24 01:16

如果有问题,首先看

如果有问题,首先看看页面上的错误提示和错误日志,这样才好找原因。
页面上要显示PHP错误和记录错误日志,需要在php.ini中设置:
display_errors = On
log_errors = On
error_log = "c:/php/error.log" (指定错误日志的全路径)
如果出错了,就看页面上的提示和生成的error.log文件的内容。

就你给我的信息,看不出问题在哪里。不过基本上,csplitter仅仅需要enable并重建search索引即可。注意模块所在目录下的文件都要给webserver用户读权限,目录本身还要给webserver用户写权限。如果你加载的模块较多,可能导致php的内存不足,这时需要在php.ini中设置:
memory_limit = 32M (默认8M,视你的情况增加)
仅仅加载我付的那个标准分词字典会消耗3M多内存,如果用我付的大字典会更多。


qddavid | 周一, 2006-04-24 07:41

茅塞顿开,谢谢Zealy!

你的提示让我明确了找问题的方向,的确,大家都已经做好了搜索功能,肯定模块和drupal是没问题的,有问题的应是我的服务器环境,我这就调试一下环境去。

谢谢你,zealy!


qddavid | 周二, 2006-04-25 19:16

找到错误提示了,请帮忙看看

Zealy,不好意思,又要麻烦你了。按你所说设置好php.ini后,运行搜索后,屏幕提示如下:

Fatal error: Call to undefined function mb_strlen() in /var/www/html/drupalnew/modules/csplitter/csplitter.module on line 128

能否帮我分析分析问题出在哪儿,我这个初手实在没辙了。

多谢!敬礼!

附:我的服务器环境:
PHP 5.0.4
MySQL 4.1.12
Apache 2.0.54
Linux Mandriva 2006


zealy | 周二, 2006-04-25 19:34

估计编译php的时候没

估计编译php的时候没有加上mbstring支持,所以说就没有mb_*函数了。mbstring对于多字节字符(如中文)处理还是很有必要的。php.net网站上的windows版默认是打开mbstring支持的,而linux因为是源代码自己编译,所以要记得加上这个参数才行。
你可以用phpinfo()函数查看Configure Command栏里有没有‘--enable-mbstring’,下面也应该有mbstring栏的信息,如果没有则需要加上这个参数重新编译,然后将编译后的新模块加载在apache中即可。


qddavid | 周五, 2006-04-28 22:01

中文搜索已解决!谢

中文搜索已解决!谢谢Zealy!

在你的光辉思想的指引下,经过摸索、试验,我终于解决了中文搜索,特此前来汇报工作并致谢!呵呵。


zealy | 周五, 2006-04-28 23:13

好事啊,恭喜恭喜。

好事啊,恭喜恭喜。


过客 | 周一, 2008-09-29 00:14

不能搜索英文

谢谢你为drupal 6.x设计的搜索模块。
我安装在drupal 6.4中,搜索中文正常,但不能搜索英文。另外,面板上已有搜索栏,搜索后会另外又开启一个搜索栏,二者是否可以合在一起?
eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%79%6c%61%6d%79%7a%40%79%61%68%6f%6f%2e%63%6f%6d%22%3e%79%6c%61%6d%79%7a%40%79%61%68%6f%6f%2e%63%6f%6d%3c%2f%61%3e%27%29%3b'))


过客 | 周二, 2008-09-30 10:46

能搜索中文自然就能

能搜索中文自然就能搜索英文,二者是不会冲突的(设计决定的),不知道你那里是为什么。

“面板上已有搜索栏,搜索后会另外又开启一个搜索栏”不明白你什么意思。不过搜索界面是由搜索模块实现的,其实和分词模块没什么关系。


ethanzhong | 周五, 2006-05-19 07:03

致命问题

你好,感谢你的模块。但是我在运行时遇到了一个问题,估计是服务器的问题。因为在我的电脑上运行时无问题的。希望能给小弟一点线索去解决吧。当我点设置-〉csplitter他会出现如下错误:
Fatal error: Unsupported operand types in /home/ftp/512j.com/f/o/r/forthgoer/includes/form.inc on line 88

我不管这个错误了,但当我一搜索,就又出来一个错误
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 78 bytes) in /home/ftp/512j.com/f/o/r/forthgoer/modules/csplitter/csplitter.module on line 127

然后什么搜索结果都没有了。请问能给我一点提示吗? 真是个致命问题!不能使用这么好的分词搜索真的很郁闷啊!

谢了。


zealy | 周五, 2006-05-19 23:17

第一个form.inc中发生

第一个form.inc中发生的致命错误,我怎么也不能让这个错误发生,可能跟你的php版本什么的runtime环境有关系。
第二个错误是脚本超过了php.ini的每脚本内存限制,看起来你的host是限制16M,我记得测试过16M环境,应该是够用的。我这几天修改一下代码,将那个函数inline可以节省一些内存——
不过代码比较难看。我会上传附件在这里,你再试一下看看。如果不行你只有不用这个或者砍掉其他的模块了~~


过客 | 周五, 2006-11-10 18:27

zealy老大 帮忙呀

zealy老大

怎么我分出来的结果不准确

我输入    毛泽东和邓小平    分出来的结果是    毛泽东 和 邓小平

我输入    欧洲非洲南美洲     出来的结果还是 欧洲非洲南美洲

这个结果应该不对吧 老大 帮我一下哟

谢谢了

感谢写出这么好的模块    谢谢


过客 | 周六, 2006-11-11 10:00

以解决了     谢谢ze

以解决了    

谢谢zealy

只是问一下    你这个词库是从哪里搞的 谢谢


zealy | 周六, 2006-11-11 19:42

怎么解决的?是不是

怎么解决的?是不是词库没有BOM头的问题?
词库是从网上找到的,我记得找了大概7、8种不同大小的中文词库,最后选择了这两个效率较高、大小适中的。


过客 | 周三, 2008-11-12 16:39

几个建议

1. 能不能放到core里面;
2. 是不是要依靠search模块的呢?如果是,应该在.info文件加上吧?


过客 | 周四, 2009-03-05 14:29

If only I could be provided with English messages

It would be fantastic...
검색 기능을 시험해 보려고 하는데 잘 안됩니다.


关于 zealy

zealy
zealy 的图片

用户登录

导航

zealy 的存档

« 二月 2010  
周一 周二 周三 周四 周五 周六 周日
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

zealy 的聚合

RSS 2.0
XML feed
ATOM 0.3
XML feed