UXDB支持全文检索,其内置的缺省的分词解析器采用空格分词。因为一般英语等语言分词比较简单,按照标点、空格切分语句即可获得有含义的词语,UXDB自带的解析器就是按照这个原理来分词的,比较简单。而中文比较复杂,词语之间没有空格分割,长度也不固定,分词有时还跟语句的语义相关,因此自带的解析器不能进行中文分词。
要支持中文的全文检索需要额外的中文分词插件,zhparser是基于简易中文分词系统(SCWS-Simple Chinese Word Segmentation)实现的一个插件。zhparser用C语言实现了UXDB TEXT SEARCH PARSER需要的接口,这些接口会调用SCWS中文分词引擎进行分词。使用zhparser这个插件,便可以使UXDB支持中文分词,继而可以使用UXDB支持中文全文检索。
SCWS是Simple Chinese Word Segmentation的首字母缩写(即:简易中文分词系统)。
这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词。词是中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开,所以如何准确并快速分词一直是中文分词的攻关难点。
SCWS采用纯C语言开发,不依赖任何外部库函数,可直接使用动态链接库嵌入应用程序,支持的中文编码包括GBK、UTF-8。此外还提供了PHP扩展模块,可在PHP中快速而方便地使用分词功能。
分词算法上并无太多创新成分,采用的是自己采集的词频词典,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试准确率在90% ~ 95%之间,基本上能满足一些小型搜索引擎、关键字提取等场合运用。
UXDB默认安装SCWS(安装目录:uxdbinstall/thirdparty/scws/bin)。
可以在命令行中使用scws命令进行测试分词。执行scws -h可以看到详细帮助说明:
Usage: scws
[option
] [[-i
] input
] [[-o
] output
]
-i string|file
要切分的字符串或文件,如不指定则程序自动读取标准输入,每输入一行执行一次分词。
-o file
切分结果输出保存的文件路径,若不指定直接输出到屏幕。
-c charset
指定分词的字符集,默认是gbk,可选utf8。
-r file
指定规则集文件(规则集用于数词、数字、专有名称、人名的识别)。
-d file[:file2[:...]]
指定词典文件路径(XDB格式,请在-c之后使用)。
自1.1.0起,支持多词典同时载入,也支持纯文本词典(必须是.txt结尾),多词典路径之间用冒号(:)隔开,排在越后面的词典优先级越高。
文本词典的数据格式参见scws-gen-dict所用的格式,但更宽松一些,允许用不定量的空格分开,只有<词>是必备项目,其它数据可有可无,当词性标注为“!”(叹号)时表示该词作废,即使在较低优先级的词库中存在该词也将作废。
-M level
复合分词的级别:1~15,按位异或的1|2|4|8 依次表示短词|二元|主要字|全部字,缺省不复合分词。
-I
输出结果忽略跳过所有的标点符号。
-A
显示词性。
-E
将xdb词典读入内存xtree结构(当切分的文件很大需要这样做)。
-N
不显示切分时间和提示。
-D
debug模式。
-U
将闲散单字自动调用二分法结合。
-t num
取得前num个高频词。
-a [~]attr1[,attr2[,...]]
只显示某些词性的词,加~表示过滤该词性的词,多个词性之间用逗号分隔。
-v
查看版本。
执行scws-gen-dict -h可以看到详细帮助说明:
Usage: scws-gen-dict
[option
] [-i
]
[ dict.txt
-o
] dict.xdb
-c charset
指定字符集,默认为gbk,可选utf8。
-i file
文本文件(txt),默认为dict.txt。
-o file
输出xdb文件的路径,默认为dict.xdb。
-p num
指定 XDB 结构HASH质数(通常不需要)。
-v
查看版本。
文本词典格式为每行一条记录,各行由4个字段组成,字段之间用若干个空格或制表符(\t)分隔。#开头视为注释忽略不计:
表?2.1.?文本词典格式
#<词> | <词频(TF)> | <逆文本频率指数(IDF)> | <词性(北大标注)> |
---|---|---|---|
新词条 | 12.0 | 2.2 | n |
除“词”外,其它字段可忽略不写。若忽略,TF和IDF默认值为1.0而词性为"@"。
由于TXT库动态加载(内部监测文件修改时间自动转换成xdb存于系统临时目录),故建议TXT词库不要过大。
删除词做法,请将词性设为“!”,则表示该词设为无效,即使在其它核心库中存在该词也视为无效。
TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
自定义词典的格式可以是文本TXT,也可以是二进制的XDB格式。XDB格式效率更高,适合大辞典使用。可以使用scws自带的工具scws-gen-dict将文本词典转换为XDB格式;
zhparser默认的词典是简体中文,如果需要繁体中文,可以在SCWS中文分词官网下载已经生成好的XDB格式词典。
zhparser是一个UXDB中文分词的插件,通过它,可以使UXDB支持中文的全文检索。
以下配置选项用于控制字典加载行为和分词行为,这些选项都不是必须的,默认都为false(即如果没有在配置文件uxsinodb.conf中设置这些选项,则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 例如认为复合等级为7时分词结果最好,则在uxsinodb.conf添加配置: zhparser.multi_short = true #短词复合: 1 zhparser.multi_duality = true #散字二元复合: 2 zhparser.multi_zmain = true #重要单字复合: 4 zhparser.multi_zall = false #全部单字复合: 8
除了zhparser自带的词典,用户可以增加自定义词典,自定义词典的优先级高于自带的词典。自定义词典的文件必须放在uxdbinstall/dbsql/share/tsearch_data目录中,zhparser根据文件扩展名确定词典的格式类型,.txt扩展名表示词典是文本格式,.xdb扩展名表示这个词典是xdb格式,多个文件使用逗号分隔,词典的分词优先级由低到高,如:
zhparser.extra_dicts = 'dict_extra.txt,mydict.xdb'
zhparser.extra_dicts和zhparser.dict_in_memory两个选项需要在服务器启动前设置(可以在配置文件中修改然后reload,之后新建连接会生效),其他选项可以随时在session中设置生效。
zhparser的选项与scws相关的选项对应,关于这些选项的含义,可以参考scws分词命令行工具。