PostgreSQL的全文检索中文分词(2)-NlpBamboo

PostgreSQL 从 8.3 开始内建了全文检索功能,对于我们来说,只需要再找一个中文分词组件即可利用 PostgreSQL 打造完善的全文检索应用。我选择的是 NlpBamboo 这个分词库。

以下是在 FreeBSD 7.2 + PostgreSQL 8.3 环境下的配置过程(FreeBSD 和 PostgreSQL 相关的安装和设置请自行找资料)。

1、安装 CMake:

1 cd /usr/ports/devel/cmake/
2 make install clean

2、安装 crf++:

1 cd /usr/ports/science/crf++/
2 make install clean

3、NlpBamboo 路径比较特殊,建立以下符号链接(其实不是全部需要;或者你偷懒一点,直接拷贝拉倒):

1 ln -s /usr/local/lib/libcrfpp.a /usr/lib/libcrfpp.a
2 ln -s /usr/local/lib/libcrfpp.so /usr/lib/libcrfpp.so
3 ln -s /usr/local/lib/libcrfpp.so.0 /usr/lib/libcrfpp.so.0

4、获取 NlpBamboo:

Google Code 取出 NlpBamboo 代码;或者从 NlpBamboo 下载打包文件。  

5、进行 FreeBSD 下的补丁修改:

这里需要注意,由于 NlpBamboo 中的 bamboo 工具用到了 getline 这个函数,但 FreeBSD 默认没有提供,你可以找一个替代品。我比较偷懒,直接把相关代码注释掉了,因为我实际上根本不会在服务器上用这个工具。我都是在本地进行相关训练统计。

这个 nlpbamboo-freebsd.patch(2.0 KB) 是我当前在用的一个 Patch 文件,你可以参考。

6、编译并安装 NlpBamboo:

1 cd nlpbamboo-read-only # 这里应该是你自己解压或者代码取出后的目录
2 mkdir build
3 cd build
4 cmake .. -DCMAKE_BUILD_TYPE=release
5 make all
6 make install

NlpBamboo 默认会安装到 /opt/bamboo/ 目录,有特殊要求,自己修改。

NlpBamboo 安装后的目录结构:

  • /opt/bamboo/bin/ : 可执行程序和训练脚本文件
  • /opt/bamboo/etc/ : 配置文件
  • /opt/bamboo/template/ : CRF训练模板文件 (.tmpl)
  • /opt/bamboo/processor/ : processor库
  • /opt/bamboo/exts/ : 扩展接口
  • /usr/lib/ : 动态链接库
  • /usr/include/bamboo/ : C/C++的头文件

7、下载分词库数据文件:

请到 NlpBamboo 下载 index.tar.bz2 或类似文件,解压到 /opt/bamboo/index 目录:

1 cd /opt/bamboo/
2 wget http://nlpbamboo.googlecode.com/files/index.tar.bz2
3 tar -jxvf index.tar.bz2

8、安装中文分词扩展到 PostgreSQL:

1 cd /opt/bamboo/exts/postgres/pg_tokenize/
2 gmake install
3 cd /opt/bamboo/exts/postgres/chinese_parser/
4 gmake install
5 touch /usr/local/share/postgresql/tsearch_data/chinese_utf8.stop

9、在需要的数据库中导入分词:

1 psql -Uddlog
2 ddlog=> \i /usr/local/share/postgresql/contrib/pg_tokenize.sql
3 ddlog=> \i /usr/local/share/postgresql/contrib/chinese_parser.sql

10、如果没有错误,你现在可以用以下命令测试了:  

1 psql -Uddlog
2 ddlog=> SELECT to_tsvector('chinesecfg', '我爱北京天安门');
3 to_tsvector
4 -----------------------------------
5 '':1 '':2 '北京':3 '天安门':4
6 (1 row)

更多关于 NlpBamboo 的资料,可以到 NlpBamboo Wiki 里好好研究一下。

恩,最后,怎么使用,可以参看 PostgreSQL 的帮助文档。或者等有空我写个在 Django 中的使用方法。

动物凶猛,路过注意:

  • 使用 PostgreSQL 8.3 更早版本的同学需要安装 tsearch2 才能使用;
  • 使用 FreeBSD 7.2 更早版本的同学请先升级,NlpBamboo 用到了 7.2 才新增 strndup(3) 函数;
  • 请更新 Ports 到最新版本,某些东西会有一定版本依赖,比如 NlpBamboo 需要 CMake 2.6 以上版本;

转自:http://www.dirk.sh/diary/setup-nlpbamboo-postgresql-freebsd/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用方法:打开scws-1.2.3\win32里的解决方案文件,里面包括了scws和zhparser,另外一个是scws的php扩展不用编译 zhparser是Postgresql中进行中文分词的常用扩展,网上的相关资料很多,安装的教程也不少,但大多数是linux的,并没有windows的安装介绍。原因有两个方面,一个是本身像这种数据库服务器一般都是linux系统的,另外一个比较致命,zhparser本身并没提供windows环境下的编译工程,连依赖库scws的readme里也建议在linux环境下使用,或者用cygwin或mingw一类工具。对于博主这种只使用windows环境(其实Postgresql也是刚接触),连makefile也搞不明白的真是头大。好在万变不离其中,编译环境只是工具,只要搞清楚个中原理(看代码),移植到windows+VS的环境应该也不是难事(当然这个也只是在轻量级的库下面适用)。下面进入正题: 干货在这里 ① 编译scws:由于 zhparser是基于scws(scws是简易中文分词系统的缩写,它的原理其实很简单,基于词典,将文本中的内容按照词典进行分词,提取关键字等。)做的分词,因此先要编译scws,网上下载下来的源码有vs2008的版本,因此,直接编译,后来出现头文件无法加入的错误,将相关文件编码方式修改成unicode解决(利用notepad++ 编码->转换为UTF-8编码)。 ② 编译zhparser:由于zhparser只提供了linux下面的makefile文件,想着用Mingw去编译,后来因为postgresql所在目录有空格,导致编译过程也失败。只好到vs2008里自建一个工程,建好工程后,首先把scws的头文件和库文件加进去,然后把postgresql的头文件和库文件加进去,设置项目属性为生成dll文件。 ③ 扩展安装:编译成功以后,在postgresql下面运行:create extension zhparser; 提示找不到control文件,在下载的源码文件夹里找到该文件,放到指定目录,再次运行sql,提示找不到dll文件,将dll文件放到指定目录,再运行,提示找不到zhprs_start函数,看来是dll没有正常explort出函数,修改源代码中的相关函数声明,再次运行后,显示成功。但zhparser源文件下其实还有很多文件,包括一个词典文件和ini配制文件,还不知道应该放在何处。 ④ zhparser运行环境配制:运行测试sql语句,发现并没有实现分词,想起来应该是词典位置不正确,到zhparser源码中去搜寻,发现如下代码,看来是放到tsearch_data目录下面,用同样的方法找到ini文件的目录,将它们都放进去,再次运行测试代码,得到正确结果。 测试代码: REATE EXTENSION zhparser; -- make test configuration using parser CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser); ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple; select to_tsvector('testzhcfg','南京市长江大桥');

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值