一种全文检索技术的思路和实现Word格式.docx
- 文档编号:20086072
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:16
- 大小:131.57KB
一种全文检索技术的思路和实现Word格式.docx
《一种全文检索技术的思路和实现Word格式.docx》由会员分享,可在线阅读,更多相关《一种全文检索技术的思路和实现Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
本文将在后文中一一介绍。
2.1全文检索的概念和现状
一个站点内容积累在万级以上,站内全文检索就会是用户定位最主要的手段,而关键词检索是用户最熟悉的方法。
因此基于数据库的传统WEB应用在全文检索需求还是很大的。
但是可怕的%like%数据库操作可能会吃掉数据库服务器90%以上的CPU。
OracleMSSQL等数据库服务器中数据库内置的全文检索基本上都不太适合WEB应用。
而数据库另外一个的弊端在于对于条件简单的查询返回结果集非常大:
数据库并不知道如何面向用户最关心的的头100条结果进行优化。
根据以前的统计:
头100条结果往往已经可以满足 95%以上用户需求。
全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。
目前主流的RDBMS提供了全文检索的功能,检索的效率成了人们关注的重点,目前关系型数据库的检索一般是应用在进行字段查询的系统中,而非全文检索。
全文检索是当前搜索引擎的核心技术之一,全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先简历的索引进行查找,并将查找的结果反馈给用户的检索方式。
这种思想来源于书目索引。
目前的全文检索尚缺乏对web后台数据库内容查询的支持,用户所需的深层次信息无法获得,这是一个web搜索引擎目前不能做到的,也是小型网站和信息系统正需要的。
本系统在扩展到检索数据库方面留有接口。
目前的全文检索大都是商业化的全文检索,web搜索引擎都是商业化的搜索引擎,因为其运营成本极高。
另外一种越来越受到关注的全文检索是垂直搜索引擎,垂直搜索引擎可以实现行业内主题的精准搜索。
近年来,情报界的学者已经对文献信息检索进行了大量的理论探讨与实践,本系统是在参考了大量的理论文章的基础上进行实践的。
目前主流的全文检索模型有倒排索引、署名文件、位图等,其中以倒排索引模型的综合性能最好,应用也最为成熟。
本系统使用的是倒排索引模型。
2.1.1倒排索引
倒排索引是从数目索引中受到启发而诞生的,文本可以用一系列的关键词来描述。
倒排索引为每个关键词建立一个索引,关键词是文本中的所有词(根据词库切词而得到)。
本系统中使用word表来存储这些关键词,在关键词的属性中存放了本关键词在文章中的位置信息。
基于关键词的的索引过程要借助于“词库”,从文本中分离出有意义的词,也就是去除无意义的词——“停止词”。
这一过程通常被称为“切词”,对于中文来说,分词算法很不简单。
这是索引过程中的关键技术。
笔者将在后文详细介绍系统中的实现方法和存在的问题。
2.1.2按词检索方法
全文检索的方法主要分为按字检索和按词检索两种。
按字检索式指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。
对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。
按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。
英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义词处理也相对容易。
中文等亚洲文字则需要切分词,以达到按词检索的目的,关于这方面的问题,是当前全文检索技术尤其是中文检索技术中的难点,本系统在建立索引时为检索提供了较为便捷的方法,即通过TF-IDF算法排序实现和倒排索引的索引模型实现达到快速、准确查找到所需内容。
2.1.3目前该领域的一些研究成果
目前最活跃的全文检索工具就是lucene,lucene是一个相当优秀的全文检索工具包,封装了大量的主要方法。
在分词领域有中科院ictclas4j中文分词系统、IKAnalyzer、paoding、等开源分词工具包。
这些都是优秀而且成熟的产品。
与之相比本系统在切词性能上比IKAnalyzer快,但是比paoding慢,在检索速度上比lucene快。
2.2系统目标和技术架构
2.2.1系统目标
本全文检索系统是为了降低全文检索的难度,本系统适用于中小型不同架构实现静态化的网站系统和基于文件系统的信息系统,这个本系统的首要目的。
二是达到面向中文的精确切词。
三是保证快速查找到目标数据。
这三方面对系统性能要求很高,就是系统应该在检索效率和质量上达到要求。
系统本地运行一万组数据测试,每组平均长度为56个字符的情况下,分词用时1.17秒。
这是一个比较优秀的成绩。
同样的数据使用Lucene和IK分词器需要4.23秒。
2.2.2技术架构
本系统开发环境为:
操作系统:
windowsxpsp3
开发语言:
Java
Web服务器:
ApacheTomcat6.0.24
数据库:
Mysql5.x
IDE:
MyEclipse7.5
内存:
1G
CPU:
IntelPentiumDual-CoreE53002.6GHZ
系统的软件设计架构为J2EE中的Spring框架。
数据库级别的操作中使用原生的JDBC操作,达到最高效的操作,并且大量的使用了批量化的数据库操作。
3.系统核心算法实现
全文检索系统包含索引子系统和查询子系统。
衡量系统查询质量的标准有查全率和查确率两种。
查全率是衡量某一检索系统从文献集合中检出相关文献成功度的一项指标,即检出的相关文献与全部相关文献的百分比。
在全文检索系统中,查全率是指检出的相关文献与系统中相关文献的百分比。
查确率则用来衡量搜索系统过滤非相关文档的能力。
3.1索引算法及其实现
3.1.1切词算法实现
目前的全文检索技术,对于亚洲文字来说最理想的分词方法就是基于一个词库的按词进行的分词方法。
按词分词是为了进行以词为单位的检索。
这个方法的原理就是使用自己已经建立好的词的集合通过一种算法去匹配目标内容,当词库中的词与目标内容的词匹配的时。
将词切分出来。
这其中词库的建设是一个关键的部分。
词库将在对系统内容进行索引的时候发回十分重要的作用。
这是因为在对系统建立索引的阶段,索引项是基于词库对被索引内容进行分词操作而取得的。
不同行业对词库的要求也是不一样的,因此选择一个适合自己系统的词库是非常重要的环节。
随着网络的高速发展,信息资源也向海量方向不断的发展,崭新的术语层出不穷,同时旧的术语概念也被赋予了新的含义。
本全文检索系统采用的是自己做的词库,其实词库是搜索的关键因素,本文旨在尝试性的讲清楚思路。
本系统词库有大约23万个中文词汇。
这是一个极小的词库,理论上讲,词库越大,检索的查全率就越高。
本词库虽小但是是一个可扩展的词库,包含了基本词库(base.dic)、计量单位、姓氏、公司企业、地名和国际组织等17种不同种类的词库。
在中文里面“的”“在”、“你”、“我”、“他”、“的”等等一些常用词,这些词因为使用频率过高,几乎每个网页上都存在,所以各种检索系统里面都将这一类词语全部忽略掉。
还有一些是特殊符号,或者是标点符号,为了系统的安全性,系统将特殊符号当做停止词来处理。
本系统共有停止词122个。
本系统中切词接口Cutter是文本切割类的根接口,主要有三个方法:
一个事将句子切成词返回集合类,一个是设置编码,另一个是关键词高亮的方法。
图1
中文切词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?
其处理过程就是切词算法。
现有的分词算法可分为三大类:
基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
本系统采用基于字符串匹配的分词方法,这种分词方法简单,易用,对于构建非商业的全文检索来说。
是非常实用的。
但是也应该看到,这只是在一定程度上满足了人们的需要,但还远远不够。
正向最大切词算法来自于最大匹配算法思想,对于文本中的ABC,A∈W,AB∈W,ABC!
∈WW为词典,那么切词的结果是ABC。
正向最大匹配方法是把一个句子中最长的词给切分出来,下面举例说明这个过程:
本文将反复使用下面这句话进行测试:
“河南农业大学是一所学风很好的本科院校”。
这是本系统中切词算法的执行过程。
每次去掉一个汉字字符,直到找到一个在词库中最大的词。
下面这段代码完成了正向匹配算法。
@Override
publicCollection<
String>
cutSentenceToWord(Strings){
ArrayList<
words=newArrayList<
();
while(s!
=null&
&
s.length()>
0){
booleanisChanged=false;
for(intj=s.length();
j>
0;
j--){
StringsubS=s.substring(0,j);
if(dict.isExist(subS)){
words.add(subS);
s=s.substring(j-1,s.length());
isChanged=true;
break;
}
}
if(s.length()<
1){
s=null;
}else{
if(!
isChanged)
words.add(s.substring(0,1));
s=s.substring(1,s.length());
}
returnwords;
}
测试(JUnit)方法:
@Test
publicvoidtestCutSentenceToWord(){
StringtString="
河南农业大学是一所学风很好的本科院校"
;
SimpleCJKCuttercjkCutter=newSimpleCJKCutter();
cjkCutter.cutSentenceToWord(tString);
}
河南农业大学是一所学风很好的本科院校
……(省略部分结果)
河南农业大学是
得到“河南农业大学”一词以后就把河南农业大学这个词放入到存放本语句词汇里面去,切掉“河南农业大学”继续上面的过程直到字符串长度为0为止。
这个算法即是正向最大匹配算法。
切词技术是信息检索中一个技术非常深的领域。
但是这种基于规则的字符串匹配算法的准确率直接与词典相关(即歧义性问题),并且不能识别各种未登录词。
所以分词准确度受到很大限制。
“相关性”主要是指检索系统针对用户的信息需求从文档集合中检出的文档与用户需求之间的一种匹配关系。
这是对“相关性”概念的一种粗泛的描述,切词的效果可以反映出检索程序提供信息相关性的水平。
下面是本系统切词结果和商业搜索引擎切词结果的对比:
本切词算法的切词结果:
河南农业大学一所学风很好本科院校
微软Bing的切词结果:
河南农业大学是一所学风很好本科院校
XX的切词结果:
河南农业大学
是
一
的本科
这里只是列出了一个例子,并不能说明检索系统的功能的问题。
这个例子达到了笔者的设计要求:
能够把句子切分为日常需要的词。
由于语言的不断变化,新的词语词汇不断的出现,词库的动态维护也是建立检索系统的重要之处。
在实际的操作中很难动态的维护词库,而且动态维护词库后对于新增词和已经建立的索引又有不一致的地方。
这种机械的切词方法很难做到把语言中的各种意思表达出来。
3.1.2建立索引
索引操作是所有检索系统的核心概念:
为了进行快速查找,就需要把数据处理成一种高效的,可交叉的查找表格式。
大部分信息系统希望对自己的文章内容进行检索,这样会更加准确的检索到所需要的信息。
另一种方式是写程序遍历文件系统或者数据库,来匹配所需要的信息。
这种做法在数据非常大的情况下效率很低。
在图书管管理中对整个图书馆的书籍建立索引可以快速准确的找到每一本图书。
同样的,对一个拥有庞大数据的信息系统建立索引页可以快速的找到包含某一个词语或者某一句话的那篇文章。
建立索引的过程,在系统中只要调用ISearchIndexService.createIndex();
方法就可以建立索引,事实上这是一个比较复杂的过程,这个方法完成的功能是将数据转换为文本,分析文本并将分析后的文本存入索引数据库中。
系统中提供了Html转化为文本的方式。
对于其他形式的文档,没有提供。
Html文本解析使用了htmlparser工具包,通过这个开源工具包,可以得到过滤掉Html标签的文本。
把文本封装到Page类里,即可实现进行切词建索引的操作,下面的流程图可以明确的说明这些过程。
图2
系统主要通过以下三个接口来完成建立索引的操作。
在一个比较完善的信息检索系统中应该实现定时的去更新自己的索引。
本系统在定时任务方面做了尝试,但是并没有完成。
笔者在这方面的尝试源自于更加开放式的想法,对于一个信息系统文件系统本系统可以检索,对于另一个也是可以检索的。
如果实现同时执行不同的任务或者是可以管理不同的任务。
这就意味着本系统可以对外提供服务,对不同的信息系统进行服务。
这将是一个功能强大的信息检索系统。
出于可扩展性的考虑,笔者在索引的过程中增加了一个job的标识,这意味着每一个job都是一个单独的任务。
这个标识的添加使本系统变的庞杂而不易控制。
3.1.3排序算法
系统使用了TF-IDF(termfrequency–inversedocumentfrequency)统计方法对结果进行排序,TF-IDF是一种用于资讯检索与资讯探勘的常用加权技术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
字词的重要性随著它在文件中出现的次数成正比增加,但同时会随著它在语料库中出现的频率成反比下降。
TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。
除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
本系统实现了一种得到TF-IDF值的方法。
系统中采用对文件频率取对数的公式实现了该统计方法。
改方法在Searchservice.calculateTFIDF(double,double)中实现。
其getAllPageNum()方法是得到系统中所有文章的数目。
protecteddoublecalculateTFIDF(doubletf,doublepageNum){
doubleidf=Math.log(this.getAllPageNum()/pageNum);
doubletfidf=tf*idf;
returntfidf;
3.2索引数据结构和索引数据存储算法
本小节介绍了倒排索引在系统中的实现方法和数据库操作时的原则。
3.2.1索引数据表结构及表之间关联关系
建立索引是完成本系统的首要任务也是最关键的任务。
本系统提供了page和word两个类,来支持这个索引的过程。
下面是这两个类的在数据库中的结构。
图3
这两给表是系统中索引实体存在的数据表。
Page存放了文件的url、内容、标题、拥有词的数量和任务Id(系统扩展)。
Word表是保存了系统中所有可以被检索的词的表。
其中wordindex最重要,这个字段存放了一个词出现在哪篇文章的哪个位置,以及他的重要性(TF-IDF值)。
这两张表反映本系统中采用了倒排索引。
Word表中的每一个词都包含了该词语在page表中所有的位置信息,这是一个一对多的关系。
倒排索引时信息检索系统中比较通用的做法。
3.2.2索引数据插入方法
笔者尝试了单条数据插入和批量插入两种方法,得到的结论是,批量插入可能会导致内存紧张,尤其是在进行大量文本批量插入的时候。
现在系统采用的策略是每个文本插入一次。
对word表进行批量的插入。
纵然是单文件插入,也可能导致内存紧张。
这与JVM的设置有关。
在此不赘述。
在插入的时候系统采用了缓存表的方式对数据进行插入。
这种插入方式在更新的时候安全性高。
3.2.3索引数据更新方法
在对索引库进行插入的时候,如果库中已经存在某个词语,那么应该更新这个单词所在的那条记录。
在笔者的实践中直接把所有的词语项插入word表,可能会导致数据库崩溃。
而且这是一个非常复杂的sql语句。
笔者选择了使用缓存表的策略。
这样会更加安全。
索引数据更新的过程:
将词语项存入缓存表wordtmp,从缓存表将word表中不存在的数据插入到word表,从wortmp表中删除已经插入到word表的数据,得到临时表中所有在word表中存在的数据,将数据更新到word表中。
3.3索引模式实现方法
本系统索引模式有两种,一种是完全模式,一种是增量的模式,两种模式通过实现接口:
createIndex(Stringjob,String[]urls,StringindexModel,StringindexType,StringfileTypes,StringjobDir);
来完成两种不同方式的任务。
参数:
Job任务标识
Urls索引地址数组:
例如{d:
/project/jobx,d:
/project/jobx/channel}使用绝对路径
indexModel索引模式
indexType索引文件模式:
最大化索引:
Constans.INDEX_TYPE_MAX最小化索引
Constans.INDEX_TYPE_MIN
fileTypes文件类型以;
分割
jobDir:
针对该job的附加索引文件目录
说明:
Constans:
全局常量类,系统用到的常量都定义在该类中。
3.3.1完全索引模式实现
完全模式是完全的删除本任务下的所有page和word记录重新建立新的索引库。
系统中使用Constants.INDEX_MODEL_FULL来代表该索引模式。
这个功能是一个全文检索系统所应该具备的基本功能,根据本系统的特点,完全模式实现中不仅仅是删除了索引库中的索引,也删除了相应的索引问标志文件,就是以“.index”结尾的文件。
下面流程图清晰的说明了这一完全索引模式任务执行的流程。
图4
3.3.2增量索引模式实现
增量索引模式是指在对索引库进行更新的时候采取的一种索引模式,该模式以增量的模式索引用户文件系统,两种文件可以被本模式索引到,一种是经过修改的,一种是用户系统中新增的文件。
另外,被删除的文件应该同步的删除其在索引库中的索引。
对于用户每一个修改过的文件系统都应该对其重新建立索引,在系统的设计中,每一个被索引过的数据源文件A都有一个在服务器项目根目录下的一个对应的索引文件B,在索引过后,A的修改时间一定小于B的创建时间。
如果在索引过后A文件被修改,那么系统应该对其进行重新索引。
对于每一个被索引的文件都是如此。
被删除的文件应该删除掉其在数据库中的索引,遍历jobDir中的.index文件,查询与该文件相对应的目标文件是否存在,如果不存在则删除目标文件的索引。
图5
4.检索方法实现
信息检索在全文检索中是面向用户的环节,也是全文检索的目的所在。
无论系统如何设计,最终都是为了信息检索。
为用户提供服务,因此,信息检索是在系统架构基础上,一个全文检索的关键部分,全文检索的好坏对用户来说,取决于检索系统,包括信息检索的界面,功能,响应速度,方便程度,信息更速度等。
4.1检索过程
本系统信息检索过程可以用下面的流程图来描述。
图6
如前文所述,分不同任务的索引是设计本系统时的一个目标,未完全完成。
不过带有任务标识的检索方法已经实现。
在检索的过程中根据不同的任务进行区分是十分简单的,而且对程序的执行效率没有任何影响。
各个任务之间是彼此隔离的。
4.2关键词高亮
因为系统使用的是同一个切词方法,所以对同一段文字来说系统切词得到的结果是相同的。
根据这个原理可以得到如下的关键词高亮方法。
text:
命中结果
query:
用户输入文字
c:
颜色
返回值:
加高亮后的命中结果
publicStringhighlight(Stringtext,StringBufferquery,Colorc){
for(Cuttercutter:
cutterBox){
String[]sentences=cutArticleToSentence(text);
Collection<
keywords=cutter.cutSentenceToWord(query);
StringBuffertempText=newStringBuffer(text.length()
+text.length());
for(Stringsentence:
sentences){
tempText.append(cutter.highlight(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一种 全文 检索 技术 思路 实现