postgresql 分词_PostgreSQL的全文检索插件zhparser的中文分词效果

本文介绍了如何在PostgreSQL中使用zhparser插件实现中文分词,包括安装zhparser、配置中文全文检索、创建文本搜索配置、调整分词算法以提高召回率,并探讨了分词效果、新词识别和效率问题。通过实例展示了不同分词级别的效果,以及如何通过调整分词选项来适应不同需求。
摘要由CSDN通过智能技术生成

PostgreSQL支持全文检索,其内置的缺省的分词解析器采用空格分词。因为中文的词语之间没有空格分割,所以这种方法并不适用于中文。要支持中文的全文检索需要额外的中文分词插件。网上查了下,可以给PG用的开源中文分词插件有两个:nlpbamboo和zhparser。但是nlpbamboo是托管在googlecode上的,而googlecode被封了,下载不方便。下面尝试采用zhparser进行中文的全文检索。

zhparser是基于Simple Chinese Word Segmentation(SCWS)中文分词库实现的一个PG扩展,作者是 amutu,源码URL为https://github.com/amutu/zhparser。

1. 安装

1.1 下载SCWS

http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2

1.2 编译和安装SCWS

tar xvf scws-1.2.2.tar.bz2

cd scws-1.2.2

./configure

make install

1.3 下载zhparser

https://github.com/amutu/zhparser/archive/master.zip

1.4 编译和安装zhparser

确保PostgreSQL的二进制命令路径在PATH下,然后解压并进入zhparser目录后,编译安装zhparser。

SCWS_HOME=/usr/local make && make install

2 配置中文全文检索

连接到目标数据库进行中文全文检索的配置

2.1 安装zhparser扩展

点击(此处)折叠或打开

-bash-4.1$ psql testdb

psql (9.4.0)

Type "help" for help.

testdb=# create extension zhparser;

CREATE EXTENSION

安装zhparser扩展后多一个叫“zhparser”的解析器

点击(此处)折叠或打开

testdb=# \dFp

List of text search parsers

Schema | Name | Description

------------+----------+---------------------

pg_catalog | default | default word parser

public | zhparser |

(2 rows)

zhparser可以将中文切分成下面26种token

点击(此处)折叠或打开

testdb=# select ts_token_type('zhparser');

ts_token_type

-----------------------------------------

(97,a,adjective)

(98,b,"differentiation (qu bie)")

(99,c,conjunction)

(100,d,adverb)

(101,e,exclamation)

(102,f,"position (fang wei)")

(103,g,"root (ci gen)")

(104,h,head)

(105,i,idiom)

(106,j,"abbreviation (jian lue)")

(107,k,head)

(108,l,"tmp (lin shi)")

(109,m,numeral)

(110,n,noun)

(111,o,onomatopoeia)

(112,p,prepositional)

(113,q,quantity)

(114,r,pronoun)

(115,s,space)

(116,t,time)

(117,u,auxiliary)

(118,v,verb)

(119,w,"punctuation (qi ta biao dian)")

(120,x,unknown)

(121,y,"modal (yu qi)")

(122,z,"status (zhuang tai)")

(26 rows)

2.2 创建使用zhparser作为解析器的全文搜索的配置

点击(此处)折叠或打开

testdb=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);

CREATE TEXT SEARCH CONFIGURATION

2.3 往全文搜索配置中增加token映射

点击(此处)折叠或打开

testdb=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;

ALTER TEXT SEARCH CONFIGURATION

上面的token映射只映射了名词(n),动词(v),形容词(a),成语(i),叹词(e)和习用语(l)6种,这6种以外的token全部被屏蔽。词典使用的是内置的simple词典,即仅做小写转换。根据需要可以灵活定义词典和token映射,以实现屏蔽词和同义词归并等功能。

3.中文分词测试

点击(此处)折叠或打开

testdb=# select to_tsvector('testzhcfg','南京市长江大桥');

to_tsvector

-------------------------

'南京市':1 '长江大桥':2

(1 row)

中文分词有最大匹配,最细粒度等各种常用算法。上面的分词结果没有把'长江大桥'拆成'长江'和'大桥'两个词,所以SCWS估计是采取的最大匹配的分词算法。

分词算法的优劣一般通过3个指标衡量。

效率:

索引和查询的效率

召回率&#x

使用方法:打开scws-1.2.3\win32里的解决方案文件,里面包括了scws和zhparser,另外一个是scws的php扩展不用编译 zhparserPostgresql中进行中文分词的常用扩展,网上的相关资料很多,安装的教程也不少,但大多数是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、付费专栏及课程。

余额充值