一个基于MySQL引擎中文文本匹配系统的研究与实现
曹亚辉,成长生,苏厚勤
(东华大学计算机学院,上海2081082)
摘要: 中文文本分词、匹配系统的实现大都调用程序API的方式实现,数据库一般仅作为词典和索引的存储结构,没有充分利用数据库系统优化处理功能实现分词和匹配过程。本文提出充分利用MySQL数据库的开源特性,把分词和匹配过程集成到数据库配置中,直接利用数据库引擎实现一个性能优化的中文文本分词、匹配系统。
关键词: 中文文本分词,中文文本匹配系统,MySQL,数据库引擎
Study and Implementation of a Chinese T ext Matching System
based on MySQL Engines
CAO Y ahui, CHENG Changsheng, SU Houqin
(School of Computer Science & Technology, Donghua University, Shanghai 2081082, China) Abstract:
Word segmentation and matching system of a Chinese text has been implemented most by calling program API mode, database is normally used only as a storage struc ture for word dictionary and index, optimization proc essing function of database system has not been well used to perform the proc ess of word segmentation and matching. A word segmentation and matc hing system w ith optimizing performanc es of Chinese text in whic h some engines of database are directly adopted is implemented in this paper, full use of the advantage of open sorc e of MySQL is proposed, and the proc esses of word segmentation and matc hing are integrated into the database configuration.
Key words: Word segmentation of Chinese text, Chinese text matching system, MySQL, Database engine
0. 引言
随着互联网应用迅速普及,如何在大量纷繁复杂的信息中到需要的信息,成为研究热点。由于w eb页面内容的信息大都是非结构化数据,在许多信息搜索应用中,非结构化文本数据信息的自动匹配始终是一个热门的研究课题。尤其针对中文文本的自动匹配,由于汉字组合和文法的多样性,给计算机自动匹配增加了许多技术难点。
目前,中文分词技术属于自然语言理解技术范畴,是语义理解的首要环节,它是能将语句中的词语正
确切分开的一种技术。中文分词技术是中文文本分类,信息检索,机器翻译,自动标引,文本的语音输入、输出等领域的基础。而由于中文本身的复杂性及其书写习惯,使中文分词技术成为了分词技术中的难点[1-2]。
中文分词技术只能解决中文文本的关键字提取,而中文文本的匹配一般是基于由关键字组成的特征向量(模式)匹配完成。有很多方法可以用来定义关键字的特征模向量,适合特征向量匹配的方法通常基于相似度或距离函数完成。当关键字数量过于膨大,如数万或数十万计,显然根据关键字组成特征向量的匹配效率会不尽如人意。
为提高中文文本分词和匹配效率,本文基于MySQL开源代码和可裁减存储引擎
的技术特点,设计和实现了一个基于MySQL数据库内嵌中文匹配引擎的非结构化中文文本匹配系统,改变调用程序API的传统做法,提高了中文文本分词和匹配效率。
1.中文文本匹配系统的处理流程
本文研究和实现的非结构化中文文本匹配系统的处理流程由图1所示的几个过程组成。
图1 非结构化中文文本匹配系统的处理流程
其中,分词和匹配过程是本文研究的重点,通常也可以将特征提取和权重计算过程归于匹配过程中,关于分词和匹配的进一步论述可参考文献[3-4]。
传统的通过程序API实现分词和匹配方式存在下述问题:
1)系统集成度不高,没有充分发挥数据库索引和存储引擎的作用。
2)编程复杂繁琐,后期维护困难。一旦分词或匹配方法更改,需要重新编程实现。
3)效率有待提高。程序API在执行过程中需反复通过生成和撤销实例的方式运行。
4)迁移困难,如果新系统支持的编程语言改变,就要重新编程,复用性不高。
本文在研究、分析了目前关于中文文本分词、匹配中常用技术现状及其基础后,提出一种直接把分词和匹配过程集成到数据库引擎中的系统实现方案,以提高分词和匹配软件模块的运行效率和复用性。
2.MySQL的技术优点及其匹配引擎技术实现
MySQL是由原MySQL AB公司自主研发的,并被目前IT行业广泛接受和使用的、最为流行的开源代码
数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统,目前基于互联网的应用中有80%使用的都是MySQL数据库[5]。
2.1 MySQL的技术优点
MySQL的技术优点概述如下:
1)开源,这也是MySQL最大的优点。
2)安装简单,使用方便。
3)性能出,在同等测试环境下,进行常用SQL操作,MySQL是速度最快的,可参考第三方评测机构公布的数据[6]。
4)存储引擎可裁剪。
5)可靠性较高。
由于MySQL是开源的,源码可以进行编译安装,并且存储引擎可裁剪,因此可
以考虑把分词和匹配过程集成到MySQL源码中进行重新编译安装,将匹配引擎当作存储引擎来使用,
在定义数据库表时,直接将数据库表的存储引擎定义为对应的匹配引擎,通过匹配引擎执行前台的匹配请求。
2.2 匹配引擎技术方案
基于MySQL开源代码的技术优点,本文研究的中文文本匹配引擎采用MySQL+ Coreseek Fulltext Server+ Coreseek Mmseg的技术方案实现。
Coreseek Fulltext Server是在俄罗斯的开源全文搜索引擎Sphinx的基础上开发的全文检索软件,它是添加了中文补丁的Sphinx[7]。
Coreseek支持MySQL数据库,特别支持MySQL的存储引擎,这也正是本文选用Coreseek的原因,另外其采用了基于最大匹配算法的中文分词模块,并针对中文的特点,对结果的排序进行优化,非常适合用于中文文本的匹配。
Coreseek非常的高效,官方数据显示其在启用了中文分词后,建立索引的速度可达300K/s,在2-4 GB的文本建立的索引上搜索,平均0.1秒内获得结果,这也是本文选择它的原因。当然Coreseek还有许多其它的优点,可以参照相关的说明[8]。
Coreseek Mmseg是Coreseek使用的中文分词器,采用了Chih-Hao Tsai的MMSEG算法[9],其词典可
方便增删,不仅支持二分分词,还支持大多中文分词不支持的多分分词。
适合本文上述研究技术方案实现的系统结构如图2所示。
图2 基于数据库匹配引擎的系统结构示意图mysql下载后为什么不是一个安装包
其中,展示层的载体为Client,支持用户和后台数据信息的交互;后台部署在服务器端,使用PHP(Personal Home Page)编程技术实现,数据库层由MySQL、Coreseek Fulltext Server 和Coreseek Mmseg三部分组成。其中Coreseek Mmseg用于分词,Coreseek Fulltext Server 用于实现特征提取,权重计算和匹配,MySQL作为数据存储框架。
2.3 实现方法
如上述说,本文设计的中文文本分词和匹配系统是基于MySQL的开源代码和存储引擎可裁剪的技术特性实现。实际使用时,实现步骤如下:
1)首先需要安装Coreseek Mmseg中文分词器;
2)然后需要使用MySQl的二进制源码安装包和Coreseek Fulltext Server的安装包,将后者复制到MySQL安装包的存储引擎目录下,进行编译安装,这样Sphinx就可以作为MySQL的一种特定的存储引擎使用了;
3)最后修改生成新的配置文件,让系统能够调用中文分词器。配置文件说明如下:## 索引源##
source article_src {
type = mysql    ## 数据源类型
sql_host = 192.168.1.10    ## mysql主机
sql_user = root  ## mysql用户名
sql_pass = pwd ## mysql密码
sql_db = test ## mysql数据库名
sql_port= 3306 ## mysql端口
sql_query_pre = SET NAMES UTF8 ## mysql检索编码
sql_query = SELECT id,title,cat_id,member_id,content,created FROM sphinx_article ## 获取数据的sql,以下是用来过滤或条件查询的属性##
sql_attr_uint = cat_id ## 无符号整数属性
sql_attr_uint = member_id
sql_attr_timestamp = created ## UNIX时间戳属性
sql_query_info = select * from sphinx_article where id=$id ## 用于命令界面端(CLI)调用的测试}
## 索引##
index article {
source = article_src ## 声明索引源
path = /usr/local/sphinx/var/data/article ## 索引文件存放路径及索引的文件名
docinfo = extern ## 文档信息存储方式
mlock = 0 ## 缓存数据内存锁定
morphology = none ## 形态学(对中文无效)
min_word_len = 1 ## 索引的词最小长度
charset_type = utf-8 ## 数据编码
## 字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,
## 即进行字索引,若要使用中文分词,必须使用其它分词插件如coreseek,sfc charset_table =
min_prefix_len = 0 ## 最小前缀
min_infix_len = 1 ## 最小中缀
ngram_len = 1 ## 对于非字母型数据的长度切割
## 加上这个选项,则会对每个中文,英文字词进行分割,速度会慢
## ngram_chars = ## 相关字符集}
## 索引器配置##
indexer {mem_limit = 256M ## 内存限制}
## sphinx 服务进程##
searchd {
## listen = 9312 ## 监听端口,在此版本开始,官方已在IANA获得正式授权的9312端口,以前版本默认的是3312
log = /usr/local/sphinx/var/log/searchd.log ## 服务进程日志,一旦sphinx出现异常,基本上可以从这里查询有效信息,轮换(rotate)出的问题一般可在此寻到答案
query_log = /usr/local/sphinx/var/log/query.log ## 客户端查询日志,笔者注:若欲对一些关键词进行统计,可以分析此日志文件
read_timeout = 5 ## 请求超时
max_children = 30 ## 同时可执行的最大searchd 进程数
pid_file = /usr/local/sphinx/var/log/searchd.pid ## 进程ID文件
max_matches = 1000 ## 查询结果的最大返回数
seamless_rotate = 1 ## 是否支持无缝切换,做增量索引时通常需要}
当上述3个步骤完成后,一个完全基于MySQL的全文匹配系统就正式成形了。限于篇
幅,这里只简单地概述了具体实现的技术路线,具体细节不再详述。
安装完成后,创建一个计数表和一个Sphinx 存储类型的索引表,分别用来存储记录数和记录对应的索引,索引表的记录通过定期进行全索引和增量索引的方式进行更新。使用时,只需将MyISAM 表的主键ID 和Sphinx 表的ID 作一个JOIN 联合查询。这样,对于MyISAM 表来所,只相当于 一个WHERE id=...的主键查询,MySQL 对这种查询的处理速度高达1秒10000次以上[10],WHERE 后的条件都交给Sphinx 去处理,可以充分发挥两者的优势,实现高速搜索查询。
2.4 实现原理
1) 分词部分
Coreseek Mmseg 分词器采用了Chih-Hao Tsai 的MMSEG 算法,该算法是一种基于词典的机械分词方法,实现了最大匹配算法的简单和复杂形式,并进一步增加了消除歧义的规则,极大地提高了分词的准确率。
2)匹配部分
匹配采用的是基于短语相似度和统计(BM25)的复合Ranking 方法。BM25是一个常用的搜索相关度的评分标准,它的数学表达公式如下:
∑=+-++=n i i i i avgdl D b b k D q f k D q f q IDF Q D score 111|
|1(),()1)(,()
(),( (1)
5
.0)(5.0)(l o g )(++-=i i i q n q n N q I D F (2)  对于公式(1)
score (D,Q ):就是我们所要计算的评分,即为给定搜索内容Q 在给定文档D 中的相关程度,分数越高表示相关度越高。
q :给定搜索内容Q 中的语素,英文的话就是单词,中文的话需要先进行简单的切词操作。
f (q i , D ):在给定文档D 中,某一个语素q i 出现的频率。
|D|:给定文档D 长度。
avgdl:索引中所有文档长度。
另外两个参数K1和b 用来调整精准度,一般情况下我们取K1=2,b=0.75。      公式(2)是用来计算公式(1)中IDF (q i )的值,其中
N :索引中文档的总数目。
n (q i ):索引中包含语素q i 的文档的总数目。
3. 系统优点
本文作者充分利用了数据库自身的优点,实现的中文文本匹配系统具有下述优点:
1)高度集成,所有的处理都通过数据库实现;
2)安装使用简单,无需编写大量的程序代码,维护方便;
3)性能高效可靠;
4)迁移方便,几乎不受编程语言影响,复用性高。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。