发布版本:
  httpcws 1.0.0 (最新版本:2009-08-10发布)

  程序网址:http://code.google.com/p/httpcws

  安装使用手册:http://blog.zyan.cc/httpcws_v100/

  下载地址(32位版):http://httpcws.googlecode.com/files/httpcws-1.0.0-i386-bin.tar.gz

  下载地址(64位版):http://httpcws.googlecode.com/files/httpcws-1.0.0-x86_64-bin.tar.gz

  中文分词在线演示:http://blog.zyan.cc/demo/httpcws/

  PHP演示程序下载:http://blog.zyan.cc/demo/httpcws/httpcws-php-demo.zip



  httpcws 中文简介
  1、什么是 httpcws ?
  HTTPCWS 是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。HTTPCWS 将取代本人之前开发的 PHPCWS 中文分词扩展

  ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。ICTCLAS经过五年精心打造,内核升级6次,目前已经升级到了ICTCLAS3.0,分词精度98.45%,各种词典数据压缩后不到3M。ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名,是当前世界上最好的汉语词法分析器。

  ICTCLAS 3.0 商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源,词库是根据人民日报一个月的语料得出的,很多词语不存在。所以本人补充的一个19万条词语的自定义词库,对ICTCLAS分词结果进行合并处理,输出最终分词结果。

  由于 ICTCLAS 3.0 2009 共享版只支持GBK编码,因此,如果是UTF-8编码的字符串,可以先用iconv函数转换成GBK编码,再用httpcws进行分词处理,最后转换回UTF-8编码。

  HTTPCWS 软件自身(包括httpcws.cpp源文件、dict/httpcws_dict.txt自定义词库)采用NewBSD开源协议,可以自由修改。HTTPCWS 使用的 ICTCLAS 共享版 API 及 dict/Data/ 目录内的语料库,版权及著作权归中国科学院计算技术研究所、ictclas.org所有,使用需遵循其相关协议。



  2、httpcws 中文分词在线演示
  演示网址:http://blog.zyan.cc/demo/httpcws/



  3、httpcws 中文分词下载安装
  32位版:
cd /usr/local/
wget http://httpcws.googlecode.com/files/httpcws-1.0.0-i386-bin.tar.gz
tar zxvf httpcws-1.0.0-i386-bin.tar.gz
rm -f httpcws-1.0.0-i386-bin.tar.gz
cd httpcws-1.0.0-i386-bin/
ulimit -SHn 65535
/usr/local/httpcws-1.0.0-i386-bin/httpcws -d -x /usr/local/httpcws-1.0.0-i386-bin/dict/


  64位版:
cd /usr/local/
wget http://httpcws.googlecode.com/files/httpcws-1.0.0-x86_64-bin.tar.gz
tar zxvf httpcws-1.0.0-x86_64-bin.tar.gz
rm -f httpcws-1.0.0-x86_64-bin.tar.gz
cd httpcws-1.0.0-x86_64-bin/
ulimit -SHn 65535
/usr/local/httpcws-1.0.0-x86_64-bin/httpcws -d -x /usr/local/httpcws-1.0.0-x86_64-bin/dict/


  命令行启动参数:

  点击在新窗口中浏览此图片



  4、httpcws 使用方法
  GET方法(文本长度受URL的长度限制,需要分词的文本为GBK编码,最好采用urlencode对文本进行编码):


  POST方法(文本长度无限制,适用于大文本分词,需要分词的文本为GBK编码,最好采用urlencode对文本进行编码):
curl -d "有人的地方就有江湖" http://192.168.8.42:1985
curl -d "%D3%D0%C8%CB%B5%C4%B5%D8%B7%BD%BE%CD%D3%D0%BD%AD%BA%FE" http://192.168.8.42:1985


  PHP 调用 HTTPCWS 示例:

  ①、对GBK编码的字符串进行中文分词处理(HTTP POST方式):
<?php
@header('Content-Type: text/html; charset=gb2312');
$text = "有人的地方就有江湖";
$text = urlencode($text);
$opts = array(
  'http'=>array(
    'method'=>"POST",
    'header'=>"Content-type: application/x-www-form-urlencoded\r\n".
              "Content-length:".strlen($data)."\r\n" .
              "Cookie: foo=bar\r\n" .
              "\r\n",
    'content' => $text,
  )
);
$context = stream_context_create($opts);
$result = file_get_contents("http://127.0.0.1:1985", false, $context);
echo $result;
?>


  ②、对UTF-8编码的字符串进行中文分词处理(HTTP POST方式):
<?php
@header('Content-Type: text/html; charset=utf-8');
$text = "有人的地方就有江湖";
$text = iconv("UTF-8", "GBK//IGNORE", $text);
$text = urlencode($text);
$opts = array(
  'http'=>array(
    'method'=>"POST",
    'header'=>"Content-type: application/x-www-form-urlencoded\r\n".
              "Content-length:".strlen($data)."\r\n" .
              "Cookie: foo=bar\r\n" .
              "\r\n",
    'content' => $text,
  )
);
$context = stream_context_create($opts);
$result = file_get_contents("http://127.0.0.1:1985", false, $context);
$result = iconv("GBK", "UTF-8//IGNORE", $result);
echo $result;
?>


  ③、对GBK编码的字符串进行中文分词处理(HTTP GET方式):
<?php
@header('Content-Type: text/html; charset=gb2312');
$text = "有人的地方就有江湖";
$text = urlencode($text);
$result = file_get_contents("http://127.0.0.1:1985/?w=".$text);
echo $result;
?>


  ④、对UTF-8编码的字符串进行中文分词处理(HTTP GET方式):
<?php
@header('Content-Type: text/html; charset=utf-8');
$text = "有人的地方就有江湖";
$text = iconv("UTF-8", "GBK//IGNORE", $text);
$text = urlencode($text);
$result = file_get_contents("http://127.0.0.1:1985/?w=".$text);
$result = iconv("GBK", "UTF-8//IGNORE", $result);
echo $result;
?>




  5、httpcws 分词速度及用途

  局域网内 HTTPCWS 接口中文分词平均处理速度(Wait时间):0.001秒。HTTPCWS 基于 libevent + epoll 网络IO模型开发,经测试,每秒可处理5000~20000次请求。

  点击在新窗口中浏览此图片

  HTTPCWS 属于《[http://blog.zyan.cc/post/385.htm 亿级数据的高并发通用搜索引擎架构设计]》的一部分,用作“搜索查询接口”的关键字分词处理。在此架构中,Sphinx索引引擎对于CJK(中日韩)语言支持一元切分,假设【反恐行动是国产主视角射击网络游戏】这段文字,Sphinx会将其切成【反 恐 行 动 是 国 产 主 视 角 射 击 网 络 游 戏】,然后对每个字建立反向索引。如果用这句话中包含的字组成一个不存在的词语,例如【恐动】,也会被搜索到,所以搜索时,需要加引号,例如搜索【"反恐行动"】,就能完全匹配连在一起的四个字,不连续的【"恐动"】就不会被搜索到。但是,这样还有一个问题,搜索【"反恐行动游戏"】或【"国产网络游戏"】就会搜索不到。所以,我在搜索层写了个PHP中文分词扩展,搜索“反恐行动游戏”、“国产网络游戏”,会被httpcws中文分词函数分别切分为“反恐行动 游戏”、“国产 网络游戏”,这时候,用PHP函数给以空格分隔的词语加上引号,去搜索【"反恐行动" "游戏"】或【"国产" "网络游戏"】,就能搜索到这条记录了。由于httpcws位于搜索层,中文分词词库发生增、删、改,只需重启httpcws进程即可,无需重建搜索索引。

  根据上述情况,对于那些采用二元交叉切分的搜索引擎,httpcws用在前端搜索层对用户输入的搜索关键字、短语进行分词处理,同样适合。httpcws开发的目的正在于此,对于短句、小文本中文分词切分,速度非常之快。



  6、自定义词库
  修改dict/httpcws_dict.txt文件,可以自由增加自己需要的词语。重启httpcws即可生效。





技术大类 » 搜索引擎技术 | 评论(405) | 引用(1) | 阅读(153013)
crunch Email Homepage
2009-12-25 08:35
httpcws_handler 中的内存分配,逻辑处理实在是混乱。
strncpy(tcsql_input_postbuffer_tmp, tcsql_input_postbuffer, EVBUFFER_LENGTH(req->input_buffer));
            char *decode_uri = urldecode(tcsql_input_postbuffer_tmp);
长度已知,就不要让urldecode再计算长度,传个长度参数
char *tcsql_input_postbuffer_tmp = (char *) malloc(EVBUFFER_LENGTH(req->input_buffer)+1);
            memset (tcsql_input_postbuffer_tmp, '\0', EVBUFFER_LENGTH(req->input_buffer)+1);
            strncpy(tcsql_input_postbuffer_tmp, tcsql_input_postbuffer, EVBUFFER_LENGTH(req->input_buffer));

直接传 EVBUFFER_DATA(req->input_buffer); 就行,不要用tcsql_input_postbuffer_tmp临时变量了。更不要分配内存。

看我做的搜索引擎 http://www.net114.com
crunch Email Homepage
2009-12-25 08:39
libevent 接受post参数时,如header中未写明Content-Length会超时,怎么不写明?
crunch Email Homepage
2009-12-26 13:08
我修改了下,实现了多工作线程处理分词,这样效果较好。现在如待分词字数较大,处理较耗时,不能大规模并发

http://www.net114.com
crunch Email Homepage
2009-12-26 13:09
所有服务程序都要实现平滑启动。
allankliu Email Homepage
2010-1-6 10:23
早上花了一点时间拜读大作。越看越郁闷。我的专业背景不是CS,所以问的问题比较入门,但是却代表了相当一部分开发者的想法。希望得到指点

我有若干个Web + 手机应用,其应用模式想参考”AdWords/AdSense + LBS“的广告方式。

举个最简单的例子:一个手机购物软件,采用Google/Bing/Wikipedia等在线资源。本身免费,但是考虑在界面中根据用户搜索关键字远程调取我自己的广告数据库,后端服务器根据用户所处的位置和检索的词语或者句子进行分析后,根据广告策略算法返回广告结果并显示在用户界面中。

如果用户检索单词,这比较简单,可以直接在数据库中检索,但是如果是一句很长的句子或者文章,则必须使用分词以及关键字检索。

其中类似AdWords的实现让我很头疼,才开始检索这方面的实施方案。我发现这些搜索引擎公司的确有其立身之本。不过百度很有意思,在检索结果中提示:"727" 及其后面的字词均被忽略,因为百度的查询限制在38个汉字以内。这一点和谷歌相比,明显在实现方法上有差别,效果上有差距。

我找了一大堆书目:
http://en.wikipedia.org/wiki/Natural_Language_Processing
http://ask.metafilter.com/28174/Help-me-dig-into-lexical-analysis
......
看得我眼冒金星。不是没有兴趣或者不懂,而是要在较短时间内成为专家,实在非我等所为。

现在看来,我仅仅需要在服务器端加入某种分词系统,然后进行检索而已。我想了解一下,HTTPCWS对于服务器的要求。因为我的服务器是比较老的FreeBSD虚拟服务器,对于PHP和本地可执行档权限还是有限制的。是否要采用VPS来做?

此外,这种算法是否有可能在appspot等Java/Python环境中进行移植?并留出API给第三方开发者。我觉得您也可以考虑将其作为一项收费服务来做。
hermit
2010-1-7 09:51
张宴 你好
我是郑宇的朋友,有个问题想请教你,目前我在使用ictclas,之前已经运行良好,但过了一段时间后(10天左右)再运行,ictclas_init 失败,其log文件显示license 到期,google后查到这个网址http://zhidao.baidu.com/question/53814648.html
请问你使用的ictclas版本遇到过这个问题么。或者是我下的版本的问题(应该也是linux 64 3.0共享版)。
非常感谢 saifengzeng@gmail.com
jonny Email
2010-2-2 16:02
我也是用的一元切分,但速度非常慢,4G 的数据量,平均查询在1s左右了,不知道你环境上的性能如何。
observer Email Homepage
2010-4-7 16:11
不错的东东,看上去用起来挺方便

不过,既然作为后台进程,为什么不用socket呢?用http来做,方便是方便了,但是怎么也做不到“高性能”的吧。

我觉得吧,弄个zycwsd,然后为不同语言写一些接口性能会好上很多。
observer Email Homepage
2010-4-7 16:34
我@#¥%,看了代码之后我实在忍不住要喷你了

你这什么东西啊,我还以为会做一下异步请求优化,内存载入来提高性能之类的,搞了半天你就把人家代码用http封装了一下,不但没有一点点性能上的好处,使用也不见得有方便多少,还平白无故降低了性能,提升了复杂度。就这破玩意你还好意思发那么一篇长篇大论,真会忽悠,I服了U。

算了,开源了也算难得了,而且虽然是一坨,但是至少使用上方便了一点,能忽悠不少小白。

唉,不过我觉得还是低调点好,就这种@#¥@还要申请专利,我都不知道说啥好了。
张宴 回复于 2010-4-7 19:41
难道你看不懂说明中的“HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。”这句话?HTTPCWS本身就是为ICTCLAS提供的HTTP网络访问接口,启动时将词库一次加载到内存,加快调用速度、方便网络访问。

不知道你又是凭空从哪儿看到什么申请专利?
aliang Homepage
2010-4-15 15:23
回:  observer 你要求太高了吧! 你是做研究的还是工程师 是工程师 !  事情解决了 就可以了!不要吹毛求疵好不好!

我不是业内人 只是想解决问题! 如果没有httpcws 我就不知道ICTCLAS 问题是光知道ICTCLAS  也解决不了 我的问题!

顶你 张宴 !

请问一下张宴

httpcws 运行一段时间 就出现  glibc detected *** malloc(): memory corruption : xxxxxxxxxx

这个是ICTCLAS 3.0 本身问题 还是 httpcws ?

出错的时间间隔不一  和传的要分词的内容大小没有关系!

如何解决?  谢谢!
anon
2010-5-6 17:52
非常不错,怎么把它整合进sphinx...张宴写一个吧!!!
一生有你
2010-5-11 15:17
httpcws怎么重启呀,刚加了几个词,没反应。。
leon
2010-5-25 11:41
可惜结果没有词性标记了
guangbinw
2010-7-9 15:00
确认个问题,ICTCLAS 支持 GBK 吗?受它限制,HTTPCWS是否也只支持GB2312?
查看了它的源码,似乎词库部分只支持GB2312,并不是一般认为的GBK
膜拜ge
2010-7-19 10:52
我刚刚装好的ubuntu配置的,但是分词出来的结果是乱码有可能是什么原因呢?
blue0711
2010-7-20 00:02
想请教下,为什么我安装的时候出现: bash: ./httpcws: cannot execute binary file

我的系统
Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux

谢谢了。
weifabing
2010-8-12 11:08
再也不能潜水了,在这里看了好久,字字珠玑啊!
aaron
2010-8-18 12:23
请问怎样添加要过滤的停用词
shwan
2010-12-20 20:07
原来这也是张兄的……我在别处找到,已经安装了http://www.ftphp.com/scws/index.php
冷色
2010-12-20 21:49
请问如何跟ICTCLAS 这种分词库结合,   
不太了解动态编译ICTCLAS 这种技术,谢谢!
分页: 3/21 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]