Zhparser
Zhparser 是一个用于中文(普通话)全文检索的 PostgreSQL 扩展。它基于 Simple Chinese Word Segmentation(SCWS) 实现了一个中文语言解析器。
项目主页:http://blog.amutu.com/zhparser/
注意:对于分词结果不满意或需要调试分词结果的用户,可以在此页面进行调试:http://www.xunsearch.com/scws/demo/v48.php
Docker快速体验
运行容器:
docker run --name pgzhparser -d -e POSTGRES_PASSWORD=somepassword zhparser/zhparser:bookworm-16
以 postgres 用户身份登录 postgres 数据库:
docker exec -it pgzhparser psql postgres postgres
创建扩展并使用:
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动');
您将得到以下结果:
tokid | token
-------+-------
101 | hello
101 | world
117 | !
101 | 2010
113 | 年
118 | 保障
110 | 房建
118 | 设在
110 | 全国
110 | 范围
102 | 内
118 | 获
97 | 全面
118 | 启动
(14 行记录)
更多 docker 镜像信息,请访问:zhparser 的 Docker Hub
zhparser 的 docker 镜像基于 PostgreSQL 的官方 docker 镜像构建,更多用法请参见:https://hub.docker.com/_/postgres
安装
0.前置条件
zhparser 支持 PostgreSQL 9.2 及以上版本,请确保您的 PG 版本符合要求。 对于 REDHAT/CentOS Linux 系统,请确保安装了相关的库和头文件,它们通常包含在 postgresql-devel 软件包中。
1.安装 SCWS
wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar xf -
cd scws-1.2.3 ; ./configure ; make install
注意:在 FreeBSD release 10 及以上版本上运行 configure 时,需要添加 --with-pic 选项。
如果是从 GitHub 上下载的 scws 源码,需要先运行以下命令生成 configure 文件:
touch README;aclocal;autoconf;autoheader;libtoolize;automake --add-missing
2.下载 zhparser 源码
git clone https://github.com/amutu/zhparser.git
3.编译和安装 zhparser
make && make install
如果 scws 的路径不在默认的 /usr/local 下,可以设置 SCWS_HOME,例如:SCWS_HOME=/usr make && make install
如果您同时安装了多个版本的 PostgreSQL,可以通过指定 PG_CONFIG 来为特定版本编译扩展:
PG_CONFIG=/usr/lib/postgresql/9.5/bin/pg_config make && make install
注意:在 *BSD 系统上编译安装时,使用 gmake 代替 make
4.创建扩展
psql dbname superuser -c 'CREATE EXTENSION zhparser'
配置
以下配置适用于 PG9.2 及以上版本,这些选项用于控制字典加载行为和分词行为。所有选项都是可选的,默认值均为 false(即如果未在配置文件中设置这些选项,zhparser 的行为与将以下选项设置为 false 一致)。
忽略所有标点等特殊符号: zhparser.punctuation_ignore = f
闲散文字自动以二字分词法聚合: zhparser.seg_with_duality = f
将词典全部加载到内存中: zhparser.dict_in_memory = f
短词复合: zhparser.multi_short = f
散字二元复合: zhparser.multi_duality = f
重要单字复合: zhparser.multi_zmain = f
全部单字复合: zhparser.multi_zall = f
除了 zhparser 自带的词典,用户可以添加自定义词典,自定义词典的优先级高于自带词典。自定义词典文件必须放在 share/tsearch_data 目录中,zhparser 根据文件扩展名确定词典的格式类型,.txt 扩展名表示词典是文本格式,.xdb 扩展名表示词典是 xdb 格式,多个文件使用逗号分隔,词典的分词优先级由低到高,如:
zhparser.extra_dicts = 'dict_extra.txt,mydict.xdb'
注意:zhparser.extra_dicts 和 zhparser.dict_in_memory 这两个选项需要在 backend 启动前设置(可以在配置文件中修改然后 reload,之后新建连接会生效),其他选项可以随时在 session 中设置生效。zhparser 的选项与 scws 相关的选项对应,关于这些选项的含义,可以参考 scws 的文档:http://www.xunsearch.com/scws/docs.php#libscws
示例
-- 创建扩展
CREATE EXTENSION zhparser;
-- 使用解析器创建测试配置
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
-- 添加词条映射
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
-- ts_parse
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了保障房的建设和投入力度 。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。');
-- 测试 to_tsvector
SELECT to_tsvector('testzhcfg','"今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。"陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。');
-- 测试 to_tsquery
SELECT to_tsquery('testzhcfg', '保障房资金压力');
自定义词库
** TXT 词库的详细写法说明(TXT 词库目前已兼容 cli/scws_gen_dict 所用的文本词库)**
-
每行一条记录,以 # 或分号开头的行视为注释,将被忽略跳过
-
每行由 4 个字段组成,依次为"词语"(由中文字或 3 个以下的字母组成)、"TF"、"IDF"、"词性",字段之间使用空格或制表符分隔,数量不限,可自行对齐以美化
-
除"词语"外,其他字段可省略不写。若省略,TF 和 IDF 默认值为 1.0,词性默认为 "@"
-
由于 TXT 库是动态加载的(内部监测文件修改时间自动转换成 xdb 存储于系统临时目录),因此建议 TXT 词库不要过大
-
删除词的方法是将词性设为"!",这表示该词无效,即使在其他核心库中存在该词也视为无效 注意:1.自定义词典的格式可以是文本TXT,也可以是二进制的XDB格式。XDB格式效率更高,适合大辞典使用。可以使用scws自带的工具scws-gen-dict将文本词典转换为XDB格式;2.zhparser默认的词典是简体中文,如果需要繁体中文,可以在这里下载已经生成好的XDB格式词典。3.自定义词典的例子可以参考dict_extra.txt。更多信息请参见SCWS官方文档。
自定义词库 2.1
自定义词库2.1增加了自定义词库的易用性,并兼容1.0提供的功能
自定义词库需要超级用户权限,自定义库是数据库级别的(不是实例级),每个数据库拥有自己的自定义分词,并存储在data目录下base/数据库ID下(2.0版本存储在share/tsearch_data下)
生产环境版本升级(新环境直接安装即可): alter extension zhparser update ;
test=# SELECT * FROM ts_parse('zhparser', '保障房资金压力');
tokid | token
-------+-------
118 | 保障
110 | 房
110 | 资金
110 | 压力
test=# insert into zhparser.zhprs_custom_word values('资金压力');
--删除词insert into zhprs_custom_word(word, attr) values('word', '!');
--\d zhprs_custom_word 查看其表结构,支持TD, IDF
test=# select sync_zhprs_custom_word();
sync_zhprs_custom_word
------------------------
(1 row)
test=# \q --同步后重新建立连接
[lzzhang@lzzhang-pc bin]$ ./psql -U lzzhang -d test -p 1600
test=# SELECT * FROM ts_parse('zhparser', '保障房资金压力');
tokid | token
-------+----------
118 | 保障
110 | 房
120 | 资金压力
版权
zhparser
部分版权所有 (c) 2012-2017,Jov(amutu@amutu.com)
特此授予免费使用、复制、修改和分发本软件及其文档的权限,无需付费,也无需书面协议,前提是上述版权声明和本段以及以下两段出现在所有副本中。
在任何情况下,加利福尼亚大学均不对任何一方因使用本软件及其文档而造成的直接、间接、特殊、偶然或后果性损害(包括利润损失)承担责任,即使加利福尼亚大学已被告知可能发生此类损害。
加利福尼亚大学特别声明不提供任何担保,包括但不限于对适销性和特定用途适用性的暗示担保。此处提供的软件是"按原样"提供的,加利福尼亚大学没有义务提供维护、支持、更新、增强或修改。