Lucene

2024-05-14

Lucene(共7篇)

Lucene 篇1

1 引言(Introduction)

在Lucence中包括了几个基础的概念,分别是索引、段、文档、域和项。其中索引由段构成,段由文档构成,因此索引可以理解为包含了多个文档的序列。文档由域构成,域由项构成,项是索引中最小构成单位,其本质是一个字符串。段是索引数据存储的基本单元,多个段之间彼此独立,当添加新的文档时将生成新的段,且段可以合并。

充分理解Lucence索引的内部结构,对于在当前互联网大数据、云存储应用环境下较好使用Lucence进行具有重要意义。

2 索引文件结构(Index file structure)

2.1 倒排索引

对文本信息进行检查的系统索引可以分为包括正排索引和倒排索引[1]。在实际使用中根据属性值查找记录的过程称为倒排索引。倒排表中存储了文档中包含的单词,文档编号差值、单词出现次数等,这些信息即组成了倒排索引项term。

倒排索引入口为索引项term,通过倒排索引可以找到包含每个term的文档集合称为记录表,记录表中包含文档号及term在该文档中的出现频率。

Lucene为了使得基于term的检索效率更高,索引存储terms的统计数据。Lucene的索引采用了倒排索引。它可以列举,包含一个term的所有文档。这与自然关联规则相反,即由documents列举它所包含的terms。

2.2 域Fields

Lucene在存储域数据时,域中文本被逐字的以非倒转方式进行转换,这些被倒排存储的域数据可以被索引[2]。每个域的文本被拆分为多个索引项以便被高效索引,另一种方式为域中文本作为一个索引项进行索引。

2.3 片断

Lucene索引可以由多个复合的子索引或片段构成。每个段是一个完全独立的索引,它可以分离提取进行检索。检索过程如下:(1)当添加新的文档时创建新的段;(2)对现有段进行合并。在索引检索时,会涉及多个索引或段,因此每一个索引都隐含包括了一组段。段及文档关系如图1所示。

2.4 文档编号

在Lucene的内部对于每个文档使用一个整数编号进行标识。初始情况下,第一个被加进来的文档其文档编号为0,之后加进来的文档其编号自动递增,采用自动递增方式对文档进行编号,编号不会出现重复。但需注意的是,文档编号可以被手动更改。因此在维护时若出现更改情况,需特别考虑此编号是否在更大的范围内被使用。通常的做法是为每个段空间设置文档编号的范围,以保证段之间的文档编号不重复。

综上所述,文档编号若发生修改可能导致错误,因此文档编号应先进行设计,在应用时不轻易、不频繁修改文档编号,只有当出现文档在某段空间是统一的,且需要在整个系统中使用时必须修改情况下才进行修改。

3 索引文件(Index file)

3.1 索引文件

Lucene索引文件包含多种,其使用不同的文件扩展名来进行标识。同时文件名称可以标识不同的版本。常见的文件扩展名有:fnm文件存储域名和域属性、fdt文件存储域数据、fdx文件存储在fdt文件中的偏移位置、frq存储文件中项的位置数据等。对于段文件命名通常为segments_x,其中x即为最新修改版本,文件segments.gen存储当前版本值。以下文件存在于每个索引index中,并且只有一份。

(1)Segments文件

索引中活动的Segments被存储在segment info文件中,segments_N,在索引中可能会包含一个或多个segments_N文件。然而,最大一代的那个文件是活动的片断文件(这时更旧的segments_N文件依然存在是因为它们暂时还不能被删除,或者,一个writer正在处理提交请求,或者一个用户定义的Index Deletion Policy正被使用。这个文件按照名称列举每一个片断,详细描述分离的标准和要删除的文件,并且还包含了每一个片断的大小。

(2)Lock文件

写锁文件名为“write.lock”,存储在默认的索引目录中。如果锁目录和索引目录不一致的,写锁将被命名为“XXXX-write.lock”,其中“XXXX”是一个特殊唯一的前缀,来源于索引目录的路径。

(3)Deletable文件

Lucene的删除机制类似于操作系统回收站,在执行删除操作时,相当于对索引进行了“删除标记”并未真实删除,当索引下次优化或合并时再从索引中真正删除。

(4)Compound文件

Compound文件格式成一个简单的容器,其用来服务所有Segment包含的文件(除了.del文件)。

3.2 Segment

每个段中的文件是由后缀名来区分的。

(1)域集合信息

域的信息以集合形式存储,域集合文件后缀为.fnm。在当前的情况下,fieldbits仅用于低位,索引的域值是1,未索引的域值为0,文件中各域根据次序进行编号,即认为值0是第一个域文件,值1是下一个域文件等。Fields将使用它们在这个文件中的顺序来编号。需要注意的是,就像文档编号一样,field编号与片断是相关的。

(2)域索引和域值

域值存储 表使用两 种文件存 储 , 分别为 : 域索引表 ( . f d x文件 ) 文件 , 这个文件 包含指向 域值的指 针Fieldvalues Position,类型为UInt64类型,此指针指向了某域值在域文件中的位置。因为域值文件包括定长的数据信息,较易随机访问;域值(.fdt文件)文件,每个文档的域值信息包括了字段Field Data、Doc Field Data、Field Count、Field Num、Bits和value。

(3)项字典

项Term字典使用如下两种文件存储,第一种是存储term信息(Term Info File)的文件,即.tis文件,另一种是存储term信息索引的文件,即.tii文件。Term Info File文件按照Term来排序,排序方法首先按照Term的field名称(按照UTF-16字符编码)排序,然后按照Term的Text字符串(UTF-16编码)排序。项的命名上前缀通常上是相同的,然后以字的后缀组成。

(4)项频率数据

Term频率数据文件(.frq文件)存储容纳了每一个term的文档列表,以及该term出现在该文档中的频率(出现次数frequency,如果omit Tf设置为fals时才存储)。

关于skiplevels , 每一个term可以有多 个skiplevels。一个term的s kiplevels的数目等 于Num Skip Levels=Min(Max Skip Levels,floor(log(Doc Freq/log(Skip Interval))))。对一个skip level来说Skip Data记录的数目等于Doc Freq/(Skip Interval^(Level+1))。然而最低的skip level等于Level=0。例如假设Skip Interval=4,Max Skip Levels=2,Doc Freq=35,则skip level 0有8个Skip Data记录,在Term Freqs序列中包含第3、7、11、15、19、23、27和31个文档的编号。Skip level 1则有两个Skip Data记录,在Term Freqs中包含了第15和第31个文档的编号。在所有level>0之上的Skip Data记录中包含一个Skip Child Level Pointer,指向(referencing)level-1中相应)的Skip Data记录。在这个例子中,level 1中的记录15有一个指针指向level 0中的记录15,level 1中的记录31有一个指针指向level 0中的记录31。

(5)项位置

Positions位置信息数据文件(.prx文件)容纳了每一个term出现在所有文档中的位置的列表,可以利用这些信息来参与对索引结果的排序。如果在fields中的omit Tf设置为true时将不会在此文件中存储任何信息,并且如果索引中所有fields中的omit Tf都设置为true,此.prx文件将不会存在。

(6)标准化因子文件

在Lucene 2.1版本之前,每一个索引都有一个norm文件给每一个文档都保存了一个字节。对每一个文档来说,那些.f[0-9]包含了一个字节容纳一个被编码的分数,值为对hits结果集来说在那个field中被相乘得出的分数。每一个分离的norm文件在适当的时候为复合的和非复合的segment片断创建。在Lucene 2.1及以上版本,只有一个norm文件容纳了所有norms数据:一个分离的norm文件在一个存在的segment的norm数据被更改的时候被创建,当field N被修改时,一个分离的norm文件.s N被创建,用来维护该field的norm数据。

(7)项向量文件

Term向量的支持是field基本组成中对一个field来说的可选项,它包含如下三种文件:a.文档索引或.tvx文件:对每个文档来说,它把偏移存储进文档数据(.tvd)文件和域field数据(.tvf)文件。b.文档或.tvd文件:对每个文档来说,它包含fields的数目,有term向量的fields的列表,还有指向term向量域文件(.tvf)中的域信息的指针列表。该文件用于映射出那些存储了term向量的fields,以及这些field信息在.tvf文件中的位置。c.域field或.tvf文件:对每个存储了term向量的field来说,该文件包含了一个term的列表,及它们的频率,还有可选的位置和偏移信息。

(8)删除的文档

删除的文档(.del)文件是可选的,而且仅当一个segment存在有被删除的文档时才存在。即使对每一单个segment,它也是维护复合segment的外部数据。

4 索引创建过程(The index creation process)

为了使用Lucene的索引数据,必须先将其转换为文本标记的数据流,并用它来创建一个文档对象,其中包含的域成员来容纳这些文本数据[3,4]。一旦你准备的文档对象,可以调用Index Writer类的adddocument方法传递对象到Lucene写索引。当这样做时Lucene进行分析数据,以便更适合索引。

文档的索引过程是通过Documents Writer的内部数据处理链完成的,Documents Writer可以实现同时添加多个文档并将它们写入一个临时的segment中,完成后再由Index Writer和Segment Merger合并到统一的segment中去。Documents Writer支持多线程处理,即多个线程同时添加文档,它会为每个请求分配一个Documents Writer Thread State对象来监控此处理过程。处理时通过Documents Writer初始化时建立的Doc Field Processor管理的索引处理链来完成的,依次处理为Doc Field Consumers、Doc Inverter、Terms Hash、Freq Prox Terms Writer、Term Vectors Terms Writer、Norms Writer以及Stored Fields Writer等。

Doc Field Processor Per Thread.process Document()方法是处理一个文档的调度函数,负责整理文档的各个fields数据,并创建相应的Doc Field Processor Per Field对象来依次处理每一个field。该方法首先调用索引链表的start Document()来初始化各项数据,然后依次遍历每一个fields,将它们建立一个以field名字计算的hash值为key的hash表,值为Doc Field Processor Per Field类型。如果hash表中已存在该field,则更新该Field Info(调用Field Info.update()方法),如果不存在则创建一个新的Doc Field Processor Per Field来加入hash表中。该hash表会存储包括当前添加文档的所有文档的fields信息,并根据Field Info.update()来合并相同field名字的域设置信息。

建立hash表的同时,生成针对该文档的fields[]数组(只包含该文档的fields,但会共用相同的fields数组,通过last Gen来控制当前文档),如果field名字相同,则将Field添加到Doc Field Processor Per Field中的fields数组中。建立完fields后再将此fields数组按field名字排序,使得写入的vectors等数据也按此顺序排序。之后开始正式的文档处理,通过遍历fields数组依次调用Doc Field Processor Per Field的process Fields()方法进行,完成后调用finish Document()完成后序工作,如写入Field Infos等。

5 结论(Conclusion)

Lucene自发布至今已有近15年时间,近几年互联网的快速发展更使得产生的数据呈指数级增长,Lucene面对海量数据进行处理,因此在检索时针对索引的优化至关重要。牢固掌握Lucene索引原理对于解决当前大数据环境下数据检索以及提高检索效率打下良好基础。

Lucene文本分析器的改进 篇2

关键词:全文检索,文本分析,抽取,封装

0 引言

Lucene是一个信息检索的函数库,用户可以基于它开发出各种全文搜索的应用。它是一个全文检索引擎的架构,提供了完整的查询引擎、索引引擎及部分文本分析引擎。作为一个开放源代码项目,Lucene从问世以来,引发了开源社群的巨大反响,它不仅能用来构建具体的全文检索应用,而且可被集成到各种系统软件中构建基于Web的各种应用[1]。

同时,Lucene也是一个开放的平台,允许用户扩展其函数和功能。Lucene默认只能分析和索引html和txt文档[2]。本文通过引入其他开源工具实现对Doc、XLS、PPT和PDF等文档的文本抽取,从而使Lucene可以索引Doc、XLS、PPT和PDF等格式的文档,最终提高了Lucene检索的通用性。

1 总体解决思路

本文针对Lucene 默认只能分析并索引HTML和TXT文档的缺点,首先利用POI和PDFBox等开源工具抽取Doc、XLS、PPT和PDF文档中的文本。然后利用Lucene 索引这些提取出来的文本,将提取的文本封装为Lucene的Document对象中一个字段。当然还可以提取文档的其他信息,如文档路径、文件名和最后修改时间等,再将这些信息作为辅助字段添加到Lucene的Document对象。最终不同格式的文档就被封装为通用Document对象,这些Document对象可以写入索引文件供以后全文检索使用。

2 编程实现

本实验的代码用Java编写,程序中采用的其它开源函数包文件如下[3]:

Lucene-core-3.0.2.jar,Lucene的核心API。

PDFBox-0.7.3.jar,用于操作PDF文档的API。

poi3.0.2.jar和tm-extractors.jar,用于操作Excel、Word和PPT文档的API。各功能模块详细实现代码如下。

2.1 Word文本的抽取和Lucene封装

Word文本的抽取和Lucene封装详细代码如下所示[4]。

public static Document getWordDoc(File f){

//提取Doc文档文本

String bodyText = null;

try {

FileInputStream is=new FileInputStream(f);

WordExtractor extractor = null;

extractor = new WordExtractor();

bodyText = extractor.extractText(is);

}

catch (Exception e) {

e.printStackTrace();

}

//创建Lucene 的Document对象,将各字段添加到Document对象。

Document Doc = new Document();

if((bodyText != null) && (bodyText.trim().length() > 0)) {

Doc.add(new Field("contents", bodyText,Field.Store.YES, Field.Index.ANALYZED));

}

……//添加其它字段到Document对象。

return Doc;//返回Document对象

}

2.2 Excel文本的抽取和Lucene 封装

Excel文本的抽取和Lucene封装详细代码如下所示[5]。

public static Document getExcelDoc(File f){

//提取Excel文档文本

String filepath = f.getPath();

String bodyText = getExcelText(filepath);

//创建Lucene 的Document对象,将各字段添加到Document对象。

Document Doc = new Document();

if((bodyText !=null)&&(bodyText.trim().length() > 0)) {

Doc.add(new Field("contents", bodyText,Field.Store.YES, Field.Index.ANALYZED));

}

……//添加其它字段到Document对象。

return Doc;//返回Document对象

}

private static String getExcelText(String filepath){

String bodyText=null;

try{

ExcelReader er=new ExcelReader(filepath);

String line=er.readLine();

while(line!=null){

bodyText+=line+"rn";

line=er.readLine();

}

er.close();

}catch(Exception e){

e.printStackTrace();

}

return bodyText;

}

2.3 PowerPoint文本的抽取和Lucene 封装

PowerPoint文本的抽取和Lucene封装详细代码如下所示[6]。

public static Document getPPTDoc(File f){

//提取PPT文档文本

String filepath = f.getPath();

String bodyText=getPPTText(filepath);

//创建Lucene 的Document对象,将各字段添加到Document对象。

Document Doc = new Document();

if ((bodyText != null) && (bodyText.trim().length() > 0)) {

Doc.add(new Field("contents", bodyText,Field.Store.YES, Field.Index.ANALYZED));

}

……//添加其它字段到Document对象。

return Doc;//返回Document对象

}

private static String getPPTText(String PPTpath){

StringBuilder sb=new StringBuilder();

try {

SlideShow PPT = new SlideShow(new HSLFSlideShow(PPTpath));

Slide[]slides = PPT.getSlides();

for(Slide each : slides) {

TextRun[] textRuns = each.getTextRuns();

for(int i=0 ;i< textRuns.length; i++ ) {

sb.append(textRuns[i].getText());

RichTextRun[] richTextRuns = textRuns[i].getRichTextRuns();

}

}

} catch (IOException e) {

e.printStackTrace();

}

return sb.toString();

}

2.4 PDF文本的抽取和Lucene 封装

PDF文本的抽取和Lucene封装详细代码如下所示[7]。

public static Document getPDFDoc(File f){

//读取PDF文档文本

PDFParser parser = new PDFParser(new FileInputStream(f));

parser.parse();

COSDocument cosDoc = parser.getDocument();

PDFTextStripper stripper = new PDFTextStripper();

String DocText = stripper.getText(new PDDocument(cosDoc));

//创建Lucene 的Document对象,将各字段添加到Document对象。

Document Doc = new Document(); if((DocText!=null)&&(!("").equals(DocText)))

Doc.add(new Field("contents", DocText,Field.Store.YES, Field.Index.ANALYZED));

……//添加其它字段到Document对象。

return Doc; //返回Document对象

}

3 实验分析

3.1 实验环境

本实验程序的运行环境如下:

硬件平台:HP 520笔记本。

处理器:Core Duo T2600(2.16G)。

内存:2G。

软件环境:Eclipse 3.4。

3.2 实验结果

程序运行结果如图1所示,从图1可以看出,通过引入其他开源工具实现对Doc、XLS、PPT和PDF文档中文本抽取,从而实现了Lucene 对多格式文档的索引。这样就提高了Lucene 索引和检索的通用性[8]。

参考文献

[1]何伟,薛素静,孔梦荣,等.基于Lucene的全文检索引擎的设计与实现[J].情报杂志,2006(9):88-90.

[2]王学松.Lucene+nutch开发搜索引擎[M].北京:人民邮电出版社,2008.

[3]邱哲,符滔滔.开发自己的搜索引擎——Lucene 2.0+Heriterx[M].北京:人民邮电出版社,2007.

[4]吴代文,郭军军.基于Lucene站内全文检索系统的设计与实现[J].现代电子技术,2011(3):42-44.

[5]何琳,张振贵,黄水清.基于Lucene的OA资源全文检索系统的设计与实现[J].现代图书情报技术,2009(11):44-46.

[6]朱岸青,黄杰.基于Lucene的全文检索系统模型的研究和开发[J].暨南大学学报:自然科学版,2009(10):504-506.

[7]文永革,胡国芳,彭声泽.基于Lucene的图书全文检索应用研究[J].绵阳师范学院学报,2010,36(9):88-90.

Lucene 篇3

21世纪是网络信息化的时代, 网络信息已经成为人们工作与学习中不可或缺的东西。网络在世界范围内向用户提供信息服务及其所拥有的信息资源, 但随着网络的蓬勃发展, 信息数量的快速增长, 当今网络上的这些海量信息形态各异, 且分散在网络中的各个角落。因此, 如何从网络上的海量信息中检索出用户所需要的信息, 成为了我们关注的一个重要问题。目前, 虽然有了像Google、百度这样的通用搜索引擎, 但是它们并不能适合人们所有的情况和需要, 也没有哪个最大最好的搜索引擎可以覆盖所有的搜索范围, 因为不同的人群范围所需求的信息资源也是不尽相同的。人们习惯在互联网上查找信息, 往往在同一个网站内拥有丰富的信息资源, 如何在网站内部快速查找用户所要的信息, 也成为了人们当前关注的一个焦点。

二、搜索引擎

搜索引擎是一个为用户提供信息检索功能的网络工具。搜索引擎是随着互联网络信息的快速增长, 开始逐步发展起来的技术。在互联网发展的最初阶段, 网站的数量相对较少, 信息查找比较容易。但随着互联网技术爆炸性的发展, 网络上面的信息越来越多, 并且以各种各样的形态存在, 这时用户便很难找到所需要的信息, 一些为满足大众信息检索需求的专业搜索网站就应运而出了。如今, Google的巨大成功让整个世界都把眼光投入到搜索引擎这个领域中, 并且Google在一定程度上起到了引导作用。Google公司在2007年决定向小型网站提供专门的搜索服务。这些都表明小型专用的搜索引擎将在人们获取互联网信息中发挥着想当重要的作用。

三、l ucene

Lucene是Apache软件基金会Jakarta项目组的子项目, 它是一个开放源码的全文检索工具。Lucene在起初是基于Java开发的, 在网站建设中扮演的是一个全文索引工具的角色。与传统的直接从数据库中搜索记录相比较, 使用Lucene可以大大增加搜索引擎的性能。Lucene的搜索机制是基于文件索引的, 所以性能要比从数据库中检索更快, 尤其当数据量大的时候区别更加明显。Lucene可以及时索引所有需要的内容, 并更新和删除它们。

Lucene的系统结构具有良好的二次开发性能。首先它的索引格式与平台无关, 其次它将各个组成部分封装成抽象类, 具体的实现定义为抽象类的实现过程, 并且具有强烈的面向对象的特征。 (图1)

四、校园网的搜索引擎框架

现代网络信息化水平迅速提高, 校园网作为一个信息核心领域, 所涉及到的内容也是形态各异的。本文就如何搭建一个校园网内的搜索引擎, 以方便在校师生快速准确地查找各自所需信息的整体流程, 给出详细的介绍。搜索引擎首先根据网站的需求选择合适的网络爬虫, 对网络上的信息进行爬取, 爬取到信息之后, 对其中的有用信息进行提取, 并利用Lucene对所提取到的有用信息进行索引, 最终输出与用户查询结果匹配度最大的信息。

本文研究的校园网搜索引擎有三个功能模块:信息采集模块、信息处理模块和信息检索模块。信息采集模块, 顾名思义, 就是对网络上的信息进行采集, 这是整个搜索引擎系统一项最初始的准备工作, 也是最基础的工作。该搜索系统针对的目标群体主要是在校师生, 也就是说, 要捕获的信息主要来源于校园网络。信息处理模块, 主要负责对采集到的信息进行提取, 提取到所需的有价值的信息之后并为其建立索引, 为后续的信息检索模块构建好索引数据库。信息检索模块主要负责在已构建好的索引数据库中查找包含用户查询关键字在内的文本内容, 并负责用户从搜索界面接收关键字以及查询结果信息的返回工作。校园网的搜索引擎系统组织结构图如图2所示。 (图2)

(一) 信息采集模块。

信息采集模块是校园网搜索系统最基础的组成部分, 它的作用是对指定网站的页面信息进行采集, 并将采集到的信息保存到数据库中。这一部分主要依靠网络爬虫程序来实现。网络爬虫是一个自动获取网页内容的程序, 它为搜索引擎从Internet网上下载网页, 是搜索引擎的重要组成部分。它从一个或一组初始网页的URL开始, 获取初始网页上的URL, 在抓取网页的过程中, 不断从当前页面上抽取新的URL放入队列, 直到满足系统的一定停止条件。本文利用网络爬虫从校园网上抓取网页URL、网页标题和网页文本内容, 并保存到已构建好的本地页面数据库中。信息处理模块从页面数据库中读取页面信息, 分析信息内容并为其建立索引。

一个好的网页爬虫应该具有很好的灵活性和健壮性, 并且易于管理员操作管理。灵活性旨在爬虫能够尽可能多的适用于各种不同的场合。健壮性则要求爬虫在面对各种奇怪的规则或者链接时具有很好的处理策略, 以保证系统能够正常运作。人性化管理界面是爬虫网络是否受欢迎的一个重要评判标准, 越简单清晰越高效的管理系统会更加受到人们的欢迎。

(二) 信息处理模块。

Lucene开源检索框架是基于文件索引机制的, 只能对文本文件进行索引。信息处理模块主要包含3个步骤:读取页面内容、页面内容解析和构建索引。结构图如3所示。 (图3)

1、读取页面内容。

首先, 该模块从已构建好的页面数据库中提取网页标题和网页文本内容;然后将提取到的信息传递给下一步骤处理。

2、页面内容解析。

读取到从页面数据库传送过来的文本内容之后, 就要对其进行解析处理了。解析就是对文本内容进行解释和分析。分析在Lucene中是指将文本转换为最基本的索引项的一个过程。所谓的分析器就是对分析操作的封装类。对于不同的语言, 分析器所要完成的功能是不一样的。比如, 对英语来说, 要将文档字母从大写转换成小写、过滤忽略词等。校园网搜索引擎面对的语言主要是中文, 分析器需要实现的就是对完整的语句进行分词。分词, 顾名思义, 就是将一段文本拆分成多个词。在建立索引的时候, 写入索引库中并能够被用户检索的是一个个的词条。所谓词条就是通过分析器进行分词和相关处理后的文本单元项, 只有通过分词才可能让搜索系统理解用户的检索请求, 进而为其搜索相关的内容。

对于一个工作性能良好的搜索引擎来说, 分词是必不可少的一个核心模块。分词的质量将直接决定搜索引擎的搜索精度, 分词的速度也将影响搜索的速度。所以, 选择一个合适的分词器对整个系统的性能是至关重要的。JE分词, 这是Lucene中自带的工具之一, 可以很好地完成系统的分词工作。JE分词的下载地址为http://www.jesoft.cn/, 这是一套由java写成的分析软件。

3、构建索引。

事实上, 常用的索引方式有3种, 分别是倒排索引、后缀数组索引和签名文档索引。

Lucene采用的是倒排索引结构。倒排索引非常符合人们的思维习惯, 同时它对关键字检索特别有效。倒排是一种面向单词项的索引机制。通常, 由词项 (关键字) 和出现情况两部分组成。对于索引中的每个词项 (关键字) , 都跟随一个列表 (位置表) , 用来跟踪记录单词在所有文档中出现过的位置。

Lucene中涉及两个非常重要的概念, 分别是Document和Field。Document, 解释为文档, 在Lucene中, 它代表一种逻辑文件。Lucene本身无法对物理文件建立索引, 而只能识别并处理Document类型的文件。Document作为一种数据源的集合, Lucene会从其中取出相关的数据源内容, 并根据属性配置进行相应的处理。Field, 我们可以理解为字段, 在Lucene中, 是用Field来表示一个一个的Document数据源的。在用户构建完Document、并为其添加如合适的Field后, 便可以按照Lucene的索引格式将数据写入索引文件, 构成索引文件库。

(三) 用户检索模块。

在建立好索引库之后, 用户就可以根据索引进行检索了。在Lucene中, 搜索引擎在接收到用户检索关键字后, 首先会对关键字进行分析, 然后在已建立好的索引库中进行搜索, 搜索完毕后, 将与关键字最相关的内容返回给用户。搜索的具体步骤如下:

第一步:初始化检索工具IndexSearcher, 设置索引存放路径。

IndexSearcher searcher=new IndexSearcher (INDEX_STORE_PATH) ;

第二步:构建一个Query对象。

Term t=new Term (”a”, ”b”) ;

Query q=new Query (t) ;

其总a是Document文档, b是用户要检索的关键字。

第三步:检索并返回查询结果。

执行完这三个步骤, 用户将会得到所输入关键字的相关结果。

五、结束语

本文对校园网的搜索引擎框架做了一个整体的介绍。现代网络信息以多样化的形式快速增长, 互联网用户想要得到自己所需要的信息, 搜索引擎起着至关重要的作用。当代社会分工不同, 人们所关注的信息产业范围也不尽相同, 所需要的信息也越发的呈现出模块化, 分属于不同的站。站内搜索将越来越受到人们的关注, 具有很好的研究价值和前景。

摘要:现代网络信息化水平日益提高, 网页信息量急剧增加, 搜索引擎已经成为人们获取所需知识的必要工具之一。本文结合校园网搜索引擎的具体需求, 介绍校园网搜索引擎的整体框架。其中, l ucene作为开源的检索框架, 具有很好的应用性。

关键词:搜索引擎,lucene,网络爬虫,站内搜索

参考文献

[1]车东.Lucene:基于Java的全文检索引擎简介[OL].[2008-11-24].http://www.chedong.com/tech/lucene.html.

[2]薛宇星.基于Heritrix和Lucene的Web站内搜索系统[D].西安:西安电子科技大学, 2008.

[3]Lucene中国[EB/OL].http://www.lucene.com.cn, 2010.5.27.

[4]冯斌.基于Lucene小型搜索引擎的研究与发现[D].武汉:武汉理工大学, 2008.

[5]胡俊, 李星.校园网信息资源搜索引擎的研究与实现[J].计算机工程与设计, 2006.7.

[6]张贤, 周娅.基于Lucene网页排序算法的改进.广西:计算机应用, 2009.

Lucene 篇4

关键词:jsp垂直搜索引擎,多线程

21世纪最最主要的发明是计算机的出现, 而在由计算机组成的庞大的网络中最重要的是信息。有这样一种说法:在这个世纪, 谁掌握的信息量大, 谁就能够有一番作为;由此可见信息的重要性。但信息又是什么?信息是用来消除随机不定性的东西。那又如何在互联网的庞大的信息量中如何精确的找到自己想要的信息是我们迫在眉睫的事情。传统的通用搜索引擎已经不能够满足人们日益增长的需要;使得对于特定的信息用特定的搜索引擎如春日的竹笋般快速成长。基于这样的情况, 结合compass, 开发了基于Lucene的垂直搜索引擎。

对于搜寻特定的信息的搜索引擎的讨论一直是各个研究者的主要话题之一。特定的搜索引擎的出现使得我们解决了常规搜索引擎中出现的一些问题, 提高了人们的查询质量。对于社会的进步有很大的帮助作用。

1 系统设计

1.1 系统构建与业务流程

垂直搜索引擎系统以web应用系统为基础平台。利用Lucene实现的索引库和Heritrix网络爬虫来实现信息的定位与信息的查找, 以及实现对搜索到的信息进行分析和存储;利用前台的web应用来实现信息的展现和分类, 并实现对所得信息的分析显示以及结构化显示与界面的美观化。以多态性为核心, 针对多个进程的查找的快速的、高效的实现信息的查找业务。如图1所示。

1.2 功能模块设计

(1) 信息更新模块。该模型包括了网络爬虫会自动更新索引库中商品的信息内容。

(2) 多线程抓取模块。改模块采取多个线程同时抓取网络中的资源, 使得我们能够更快的更新索引库中的信息, 并且有利于资源的管理。

(3) 使用开源的compass的搜索引擎框架模块。改框架提供了一套开源的、高性能的、可灵活配置的搜索框架, 从而为用户的应用程序提供搜索功能。

(4) 排序、过滤和分页模块。对检索的结果进行排序, 把优先度高的内容首先展现出来等。

(5) Word、excel、pdf的处理模块。网络爬虫通过对抓取的信息进行整理;使得我们的信息更加结构化。

(6) 索引库模块。主要包括是否建立索引、是否存储、是否分词;另外要注意的是在索引的建立和索引的读取是使用的分词方式一定要一致;防止采用不同的分词方式所造成的分词展现不同。

1.3 数据库设计

为了提高搜索引擎的检索效率, 将爬取到的数据格式化后存入数据库中。目前采用的数据库管理系统是My Sql5.0, 设计的实体表格主要有两个, 一个是商品的详细信息列表, 包括商品编号、商品名称、分类、价格、厂家、上市时间、品牌等31个字段。另一个是购买评价记录, 包括系统编号、商品编号、评价信息等字段。

2 基于Lucene的垂直搜索引擎的实现

采用开源lucene组件以及eclipse开发环境对垂直搜索引擎系统进行开发。

2.1 数据基础

21世纪最重要的是信息。信息是用来消除随机不定性的东西。而目前的像百度等这样的大型的通用搜索引擎虽然可以解决一些信息的查询问题;但不能够很精确的查找到特定的商品;故使得社会上对于特定的搜索引擎的需求量急剧增加。为了使得本文有一个更加良好可行的应用环境, 我们需要建立合适的索引库。首先对搜索到的信息是否建立索引、是否存储索引等问题有一个概念模型;并对索引搜索到的信息的存储在一个特定的路径下, 方便下次的查找。其次, 索引库的设计可以实现对jsp页面的查询提供一个可靠的服务。另外, 在建立索引库之前需要做好一系列的准备工作, 如寻找一两个主要的信息来源目标网站作为垂直搜索引擎的入口等。

2.2 系统运行实例

系统界面主要的功能是对特定商品的查询;通过爬取多个电子商务网站的同一类商品或同一种商品, 给用户展示出商品贪信息的对比, 尤其是对用户评价的对比, 为购买者推荐出性价比最高的商品。通过测试10000条商品信息与15000条商品购买评价记录, 基于Lucene的垂直搜索引擎可以很好地为用户推荐出性价比较高的商品。在搜索列表展示时, 主要使用开源的compass的搜索引擎框架模块、排序、过滤和分页模块, 并记录下用户的搜索行为, 分析用户的个性特征, 将用户对商品的浏览次数, 购买情况作为修改化推荐列表 (猜您喜欢) 的排序权重, 将与购买者最相关的商品排在前面, 方面购买者定位, 节约检索的时间。

3 结束语

通过使用开源的Lucene搜索引擎工具和j2ee技术开发的搜索引擎系统稳定易行;能够使人们在此搜索引擎中获得他们想要的精确的信息;可以减少他们的分析信息的时间;帮助他们在这个大数据时代中快速的利用信息。

垂直搜索引擎是基于Lucene的垂直搜索引擎的实现的具体实法, 采用了多线程抓取网页的方法抓取信息, 大大的增强了系统的处理信息的速度, 研发的基于Lucene的垂直搜索引擎可以为购买者推荐出合适的商品。

参考文献

[1]文必龙, 唐苏龙, 张浩.主题搜索引擎中特征模型技术的研究[J].计算机技术与发展, 2013.23 (4) :87-90.

Lucene 篇5

关键词:垂直搜索引擎,Lucene,Spider

1 垂直搜索引擎

1.1 垂直搜索引擎的特点

垂直搜索引擎又称为专题搜索引擎、专业搜索引擎。它们专门采集某一学科、某一主题、某一行业范围的信息资源, 并用更为详细和专业的方法对信息资源进行标引和描述, 且往往在信息组织时设计利用与该专业密切相关的方法技术。这种搜索引擎专注于自己的特长和核心技术, 保证了对该领域信息的完全收录与及时更新, 在提供专业信息方面有着大型通用搜索引擎无法比拟的优势。它的服务对象通常是专业领域的研究人员。众所周知, 每个专业领域都有专有的词汇和用语, 垂直搜索引擎使用与之相应的索引技术和检索语言, 从而使在特定主题范围内的检索效果优于通用搜索引擎。垂直搜索引擎因针对性强、目标明确和查准率高而成为获取专业信息的重要工具。

1.2 垂直搜索引擎的系统结构

垂直搜索引擎主要由主题爬虫模块、索引模块、检索模块、用户接口等4个部分组成, 如图1所示。

2 Lucene技术简介

Lucene作为一个优秀的全文检索引擎, 它的系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式, 其次通过抽象将系统的核心组成部分设计为抽象类, 具体的平台实现部分设计为抽象类的实现, 此外与具体平台相关的部分比如文件存储也封装为类, 经过层层的面向对象式的处理, 最终达成了一个低耦合高效率, 容易二次开发的检索引擎系统。

2.1 Lucene的系统结构组织

Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点, 如图2所示。

Lucene每个包完成的特定功能, 如表1所示:

2.2 Lucene的特点

Lucene作为一个全文检索引擎, 其具有如下突出的优点:

(1) 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式, 使得兼容系统或者不同平台的应用能够共享建立的索引文件。

(2) 在传统全文检索引擎的倒排索引的基础上, 实现了分块索引, 能够针对新的文件建立小文件索引, 提升索引速度。然后通过与原有索引的合并, 达到优化的目的。

(3) 优秀的面向对象的系统架构, 使得对于Lucene扩展的学习难度降低, 方便扩充新功能。

(4) 设计了独立于语言和文件格式的文本分析接口, 索引器通过接受Token流完成索引文件的创立, 用户扩展新的语言和文件格式, 只需要实现文本分析的接口。

(5) 已经默认实现了一套强大的查询引擎, 用户无需自己编写代码即使系统可获得强大的查询能力, Lucene的查询实现中默认实现了布尔操作、模糊查询 (Fuzzy Search[11]) 、分组查询等等。

3 垂直搜索引擎系统的设计与实现

笔者基于Lucene设计了一个垂直搜索引擎, 该系统包括了4个模块:信息采集、信息索引、信息检索种用户接口。

3.1 信息采集

由于Lucene本身没有网络爬虫 (Spider) , 需要我们自己重新设计一个专业网络爬虫 (Spider) , 然后集成到Lucene中。然后利用Spider从所有相关的专业网站库 (HTML库) 中抓取网页, 根据相关度分析算法, 对网页进行主题相关度分析, 根据相关度的不同来抓取相关网页, 最后把有效网页信息传输给索引器。

信息采集模块主要有3个类:

(1) Spider Frame类。Spider Frame类的功能:用户的输入界面。包括起始URL、文件保存目录、最多处理网页个数、启动线程个数, 线程休眠时间。可以停止Spider的运行。

(2) Show Frame类。Show Frame类的功能:Spider运行后, 显示运行的状态信息、可以停止Spider运行。

(3) Spider类。集成到Lucene中的信息采集类, 由Spider Frame类调用。有一个create () 方法, 执行实际的网页爬行工作。

信息采集模块的主要代码如下:

//此处创建Spider对象, initurl是起始URL, pagenum是最大可访问网页数,

3.2 信息索引

一个搜索引擎的有效性在很大程度上取决于索引的质量。索引模块将Spider收集的文档进行处理, 以便于组织查找到的有效数据结构。因此, 必须对索引进行高效组织, 以实现整个搜索引擎的高效率。

索引器主要完成将切词形成的顺排档文档组织成倒排档索引数据。索引的建立即索引器的实现, 主要分两步, 因为只有符合Lucene.Document要求的文档才能使用Lucene对其建立索引, 所以首先构造一个Document的文档对象doc, 其中包括描述数据域和正文数据域。然后对该doc文档建立索引, 对于描述数据, 因其体积小, 占字段多, 被检索率高, 所以直接存入索引库中, 而庞大的正文数据仅将其存放地址和文件名等存入索引库中。

3.3 信息检索

Lucene提供用户的检索接口是Index Searcher类, 由Query类封装查询词、查询字段和语言分析器, 交由Index Searcher查询。搜索结果返回的是Hits对象。

3.4 用户接口

用户接口提供可视化的查询输入和结果输出界面。采用JSP实现。

输入用户查询, 调用检索器, 将检索器返回的查询结果 (Hits) 分页显示在页面上, 同时使用Lucene中的Token信息对用户的查询字符高亮显示, 方便用户查看。

4 结束语

Lucene是一个基于Java的全文检索引擎工具包, 它不是一个完整的搜索引擎, 只提供了完整的查询引擎和索引引擎以及部分文本分析引擎。本系统在Lucene的基础上整合了专业网络爬虫Spider和Web服务器.建立了一个完整的垂直搜索引擎实例, 其组织比较完整, 查询功能强大.检索速度快, 搜索精度较高。在今后的研究中, 将在此系统的基础上.改进Spider, 使得Spider可以抓取由Javascript动态生成的网页内容;对Lucene中的检索结果排序算法进行改进以提高搜索精度。

参考文献

[1]孙西全, 马瑞芳, 李燕灵.基于Lucene的信息检索的研究与应用[J].信息系统, 2006, 29 (1) .

[2]郎小伟, 王申康.基于Lucene的全文检索系统研究与开发[J].计算机工程.2006 (2) .

[3]李晓明, 闫宏飞, 王继民.搜索引擎-原理、技术与系统[M].北京:科学出版社, 2005.

[4]Erik Hatcher, Otis Gospodetic.Lucene In Action[M].Manning Publications Co.2005.

Lucene 篇6

作为搜索引擎的基础构件之一, 网络爬虫 (Crawler) 直接面向互联网, 它是搜索引擎的数据来源, 决定着整个系统的内容是否丰富、信息能否得到及时更新[1,2]。它的性能表现直接影响整个搜索引擎的效果。该文使用Lucene.net平台设计实现了一个准确高效的网络爬虫。

1 Lucene简介

Lucene是一个信息检索的函数库 (Library) , 利用它可以为应用加上索引和搜索的功能。Lucene是一个工具, 可以把它理解为一个将索引, 搜索功能封装的很好的一套简单易用的API, 利用这套API可以做很多有关搜索的事情[3]。

Lucene.net是一个高性能的全文检索引擎, 而且免费开源, 几乎适合于任何需要全文检索的应用, 尤其是跨平台的应用, 它由Java下的Lucene移植而来, 在Java平台已经得到了广泛的应用[4,5]。

大部分的搜索 (数据库) 引擎都是用B树结构来维护索引, 索引的更新会导致大量的IO操作, Lucene在实现中, 对此稍微有所改进:不是维护一个索引文件, 而是在扩展索引的时候不断创建新的索引文件, 然后定期的把这些新的小索引文件合并到原先的大索引中 (针对不同的更新策略, 批次的大小可以调整) , 这样在不影响检索的效率的前提下, 提高了索引的效率[6]。

为了实现快速的搜索, Lucene会首先将需要处理的数据以一种称为倒排索引的数据结构进行存储。Lucene为需要被搜索的数据整理优化出一份索引文件 (Index file) , 而这个过程称之为“索引”。Lucene面向全文检索的优化在于首次索引检索后, 将所有结果中匹配度最高的头100条结果 (Top Docs) 的ID放到结果集缓存中并返回, 即使检索匹配总数很多, Lucene的结果集占用的内存空间也不会很多。如果首批缓存结果数用完后还要读取更后面的结果时Searcher会再次检索并生成一个上次的搜索缓存数大1倍的缓存, 并再重新向后抓取。

2 系统设计

2.1 需求分析

为了提高效率, 本系统应采用多线程抓取网页数据, 索引网页文字, 使用线程同步机制, 抓取数据与索引数据同时进行。本系统需有以下功能:

1) 爬虫系统初始化设置, 用户为爬虫设置开始爬去数据的开始地址, 爬取数据进程数, 索引数据进程数, url规则。

2) 爬虫系统可为特定url添加关键字, 当搜索到该关键字时, 该URL将优先显示出来。

3) 爬虫系统可设置访问深度, 即爬虫的垂直访问深度。

4) 爬虫系统可支持停止或继续抓取数据。

5) 爬虫系统可对已有索引文件进行优化索引, 提高查询速度。

6) 用户可优化索引。

2.2 系统逻辑结构

本系统采用分层设计, 结构清晰, 可扩展性强。系统主要分为:BLL业务逻辑层, DAL数据访问层, Model数据库实体层, Common层。其中BLL业务逻辑层主要实现数据抓取, 接受用户搜索, 页面分析等逻辑功能。DAL数据访问层主要负责处理所有涉及数据库的操作。Model数据库实体层主要为一些数据库实体层, 每个数据库表对应一个实体类。Common层主要包含一些常用类, 如:线程管理, Html页面分析, URL处理等类。

2.3 数据库设计

本系统所有数据按照Lucene.net特有索引文件格式存储到硬盘中。由于计算机存在少量也能够与数据处理, 数据需要长期保留在外村上反复进行查询、修改、插入和删除等操作。因此只将少量数据需要存储到数据库中, 本系统采用Microsoft SQL Server 2005做数据库。Wait For Index等待索引内容表, 该表主要存储爬虫程序停止后, 在内存中未索引数据存进数据库中。

3 系统实现

本系统采用四层结构, 分为界面层 (包括:web界面, Win Form界面) 、BLL业务逻辑层、DAL数据访问层、Common常用类、Model数据库实体层。

BLL业务逻辑层, 主要处理业务逻辑, 其中包括一些逻辑类、爬虫类、索引类、搜索类。DAL数据访问层通过使用.net中的反射机制实现ORM对象关系模型, 底层对数据库访问基类为Base DAL类, 该类使用.net中的泛型, 类似于C++中的模板机制, 从而使得该类可以接受任意类型的数据库实体类。该项目中对应Model层中的实体, 每个实体对应一个数据库访问类, 如Model层中有:Finished URL类, 则DAL层有Finished URLDAL类与之对应, 该类继承Base DAL类。Common层主要为一些常用类, 该系统中主要用到HTMLHelper类和Thread Manager类。HTMLHelper主要用于分析HTML页面信息, 获取URL列表, 页面Title、内容等。Thread Manager类为多线程管理类, 根据系统设置进行线程的启动, 停止操作。

3.1 后台模块设计

后台模块需要设置开始地址, 抓取数据线程数, 索引线程数, 访问深度, 链接规则等。其中:开始地址、抓数据线程数、索引线程数、访问深度为必填项。爬虫程序主界面如图1所示。

抓取数据模块主要是由BLL层中的Crawl类中的Start Crawler () 方法实现, 该类中的核心算法Start Crawler主要是对URLQueue进行出列, Pop出一个URL, 然后抓取该URL的数据, 将抓取的数据Push到content Queue中。

Start Crawler方法主要是对该类进行Pop以及Push操作, 当URLQueue长度大于10000条数据时, 则将其插入至数据库。

索引数据模块主要是由BLL层中的Index Page类中的Start Index () 方法实现, 该方法除了索引网页内容外, 同时还对已抓取网页进行分析, 提取网页中的URL, 标题, 关键字, 描述等信息。该类主要是对URLQueue和Content Queue进行操作, 该类的核心算法Start Index的程序流程图如下图所示, 当content Queue中元素大于5000条时则插入数据库。Start Index程序流程图如图2所示。

3.2 前台搜索设计

首页设计使用DIV+CSS布局方式。页面简单明了, 用户只需输入关键字, 点击“搜索”按钮即可, 程序将自动把搜索关键字POST到Show Result.aspx页面, 由该页面来查询数据并显示结果。搜索结果页面如图3所示。

3.4 初始化爬虫及索引管理

爬虫需要设置的参数主要有:访问开始地址、抓包线程数、索引线程数、访问深度、链接规则。访问开始地址为爬虫开始爬取数据的开始地址。由于该系统爬取数据与索引数据同时进行, 因此用户必须同时设置抓包线程数与索引线程数, 如果未设置则默认为一个线程。访问深度则设置爬虫爬取数据的深度。链接规则是设置爬虫只抓取该域名下的链接。使用Debug View捕捉到的程序运行状态如图4所示。

在本系统中使用多线程进行抓包以及索引数据, 每个索引线程建立一个索引目录, 如线程1则索引目录为:Thread1。多个线程将有多个索引目录, 搜索时候程序必然要读取所有目录, 这对于搜索来说照成了不便, 因此在程序主界面中有“优化索引”按钮, 该功能主要执行合并索引目录并优化索引, 提高搜索效率。

4 结束语

本文主要实现一个网页爬虫程序以及搜索程序。网页爬虫程序从某个网站节点开始, 采用广度遍历的方式, 运用多线程机制, 爬取网页信息, 在爬取网页的同时, 网页爬虫程序同时对已爬取数据进行分析, 提取有用文字信息, 并对这些信息建立索引。用户可为爬虫定义一些规则, 让爬虫只爬取特定的网页。爬虫也可为特定网站添加关键字, 当用户搜索该关键字时, 该网站将会优先显示。

参考文献

[1]NOVAK B.A survey of focused web crawling algorithms[c]//SIKDD2004at multiconference IS2004.Ljubljana, 2004.

[2]Ehng M, Maedche A.Ontology-focused crawling of Web documents[c]//Proc.of the2003ACM symposium on Applied computing.Flori-da, 2003.

[3]赵汀, 孟祥武.基于Lucene API的中文全文数据库的设计与实现[J].计算机工程与应用, 2003, 20:179-183.

[4]李晓明, 刘建国.搜索引擎技术及趋势[EB/OL].2008-04.http://www.xiye.cn/seo/523.html.

[5]张校乾, 金玉玲, 侯玉波.一种基于Lucene检索系统的一种全文数据库的设计与实现[J].现代图书情报技术, 2005 (2) :40-44.

Lucene 篇7

关键词:中文搜索引擎,相关词,概念词,同现率,概念集

1 引言

搜索引擎系统的出现,给人们查找互联网信息带来了很大方便。随着互联网信息的爆炸式增长,搜索引擎已经成为人们检索互联网信息的主要工具。目前主流搜索引擎一般都提供搜索相关词推荐功能,即在用户进行搜索时,提供若干个与搜索关键词相关的推荐词提示给用户,这一定程度上提高了系统的查准率,但在搜索推荐词的生成方法上,一般都是用户搜索关键词上加入前缀、后缀字符串作为搜索推荐词,这种方法没有深入到语义理解层次,是一种机械的匹配,不具有联想功能,智能化程度比较低。虽然Google Baidu采用PageRank[1]技术来提高信息的查准率,但是由于PageRank技术是基于网页间的链接关系,来得到网页的相对权重,并非网页与用户真实检索请求之间的关联程度,因此返回的结果中包含了大量与用户请求无关的结果。基于上述现状,给出一种有效的搜索推荐词生成方式,引导用户搜索,显得十分必要。客观地说,目前主流搜索引擎在提高信息的查全率和网页之间的相关度方面己经达到了较高的水平,但在关键词对网页的相关性,搜索相关词推荐等方面有待新的技术突破,这也是本文研究的重点。

2 检索引擎Lucene

2.1 Lucene简介

Lucene是Apache软件基金会Jakarta项目组的一个子项目,是一个完全开放源代码的全文检索工具包,即它不是一个完整的检索引擎,而是一个用Java写的索引工具包,它为数据访问和管理提供了简单的函数调用接口,可以方便的嵌人到各种实际应用中。

2.2 Lucene框架结构

Lucene作为一个优秀的全文检索引擎[2],其系统结构具有强烈的面向对象特征。经过层层的面向对象式的处理,最终达成了一个低藕合高效率,容易二次开发的检索引擎系统。其系统结构如图1所示。

从图1中我们清楚的看到,Lucene的系统[3]由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。Lucene索引文件由若干段(segment,相当于表)组成,每一段由若干的文档(document,相当于表中记录)组成,每一个文档由若干的域(field,相当于表中字段)组成,每一个域由若干的项(term,相当于表中数据)组成。项是最小的索引概念单位,它直接代表了一个字符串以及其在文件中的位置、出现次数等信息。域(field)是一个关联的元组,由一个域名和一个域值组成,域名是一个字符串,域值是一个项(term)。域值也可以被切分(tokenized),这就意味着一个分析程序会将输入到域里的内容分解成搜索引擎能够使用的标记(token)。索引建立后会产生_.tii文件(“term infos”保存每个单字索引的信息)和_.frq文件(“term frequency”记录了每个单字索引分别在每一个文献中出现的频率)等,这正是提供搜索推荐词所需要的。

3 搜索推荐词的生成

3.1 建立概念词集合

对由网络蜘蛛Spider抓取下来的原始网页,通过现有的较为成熟的中文分词子系统[4]得到了相应的关键词序列,滤去一些高频词和停用词(Stop List)(那些在网页文档中出现频率很高,但实际意义又不大的词。主要指副词、虚词、语气词等,如“被、本、本着、比、比方、比如、彼、彼此、把、别”等关键词),剩下的其它关键词就是有用的概念词,每个概念词代表一种概念。经过上述分析处理后就得到了一个很大的概念词集合。

3.2 概念词同现率计算

有了概念词集合后,考虑概念词之间的语义信息,引入同现率概念。既每两个概念词一起出现的可能概率(Cooccurrence Probability),它可以用一个反映概念词间的语义关联度的自反模糊矩阵来表示。

在计算同现率之前,必须首先计算网页文档di中每个概念词Tj(term)的权重Wij,Wij的计算方法很多,有信息增益方法[5](Information Gain),TF-IDF(Term Frequency-Inverse Document Frequency)[6]等,本文采用TF-IDF方法,该方法综合考虑概念词Tj在网页文档di中的出现频率TFij以及在整个网页文档集合D中的逆文档频率IDFj,认为那些在某个网页文档中出现频率高而在所有网页文档中出现频率低的概念词对该网页文档具有较高的权重值。该方法首先要计算IDFj的值,IDFj的计算如公式1:

其中,N为网页文档集合中总的网页数目,nj为网页文档集合D中包含概念词Tj的总的网页数目。从公式(1)可以看到,IDFj的值跟它在网页集合中出现次数成反比,出现的次数越多,那么它就越不重要。这样可以有效地剔除一些没有意义的高频词,提高计算的准确性。

有了IDFj的计算公式后,得到Wij计算公式如下:

公式(2)中,TFij表示概念词Tj在网页文档di中的词频,假设Tj在网页文档di中总共出现了2次,那么TFij的值就为2。

得到了Wij权值之后,概念词(Tj,Tk)间同现率计算公式如下:

公式(3)和(4)中,n表示网页文档集合D中总的网页数目,IDFk,IDFj(概念词Tk,Tj的逆文档频率)由公式1得到,Wijk(概念词Tk,Tj对网页文档di的权重值)的计算公式如下所示:

公式(5)中:TFijk为概念词Tj,Tk在网页文档i中出现次数少的数目,假设概念词Tj、Tk在网页i中分别出现了2次和4次,那么TFijk=min(2,4)=2。njk为由N个网页构成的网页文档集合D中同时包含Tj,Tk概念词的网页个数。通过上述公式3可以计算出概念词Tj到Tk的同现率,通过上述公式4可以计算出概念词Tk到Tj的同现率。

对于概念词Tj到Tk的同现率与概念词Tk到Tj的同现率是不同的,这符合汉语的习惯,比如说,我们由“杨贵妃”可以想到“丰满”,但是由“丰满”就不一定想到“杨贵妃”。

3.3 概念相关词的生成

得到概念词之间的同现率后,怎么得到概念词对应的相关词呢?文献[7]给出了由连续型Hopfield神经网络算法得到概念词对应相关词的方法,下面讲述具体的实现步骤:

第一步:建立连续型Hopfield神经网络,即以本文3.1节得到的概念词为神经元,以3.2节得到的概念词之间的同现概率作为神经元之间的连接权,建立Hopfield神经网络。

第二步:对于特定用户查询请求Q=,把神经网络中对应的神经元权值赋为1,可用如下公式来表示这一过程。

celli(t)表示神经元i在t时刻的输出值,keyi是取值在[0-1]的值,在0时刻,对用户查询请求中有的关键词对应的神经元都赋值为1,其余的神经元都赋值为0。

第三步:根据如下公式对特定的神经元进行激活操作。

其中cellk(t+1)表示神经元k在t+l时刻的输出值,I(i,k)是由本文3.2节计算得到的概念词Ti,Tj之间的同现概率值。函数fi()的是一个连续的Sigmoid函数,它的定义如下所示:

在公式(8)中,λj表示一个阀值函数,用于控制神经元的状态,即只有当神经元的输出值超过这个值时,该神经元才被激活。λ0用于修正函数fi()的形状。

第四步:上述步骤三———神经元激活过程是一个能量递减过程,最终会趋于收敛。下式给出了迭代终止的条件:

也即当两次迭代的差值<δ时,停止迭代,公式(9)中δ为允许的误差值,最后输出的神经元即为搜索关键词通过Hopfield神经网络得到的语义联想词。

3.4 概念集的建立

有了上述算法的实现步骤以后,我们把每个概念词作为用户查询请求,得到每个概念词对应的相关概念词。控制λj的取值,取每个概念词联想得到的前10个概念词作为它的相关搜索词,放入后台数据库。通过这些步骤,可以建立起系统的概念集[8]。

3.5 概念集的维护

概念集不是一成不变的,而是会随着时间的推移不断变化。因为互联网上信息资源是不断变化的,这就使得搜索引擎系统会出现新的概念词,同时概念之间的相关性也会随着时间的变化而变化,比如说赵本山在没有演“不差钱”之前,他是不可能跟“不差钱”在同一个概念集中,但是当他演了“不差钱”之后,那么赵本山就必须跟“不差钱”在同一个概念集里面,正是这种信息衰减现象的存在,使得我们必须对概念集进行定期更新操作。对概念集的定期更新操作,也就是概念集维护工作。图2给出了概念集的维护流程图。

在图2中,概念集的形成是由计算机统计分析后得到,由于数据噪音的存在,使得概念集中有的关键词对应的相关词不是非常准确,需要人工对概念集进行适当地修正,然后,把修正后的结果存放到本地数据库中。

3.6 搜索推荐词的生成

基于本文3.4节生成的概念集,一种基于语义理解的相关词推荐方法具体处理如下:

1)对于特定用户查询操作Q=

2)若用户输入的关键词不是系统的概念词,那么就不产生搜索推荐词。

3)若用户输入关键词是概念词,那么直接从本文3.4节建立的概念集中把此关键词对应的相关搜索词提取出来,作为搜索推荐词。

4 结论

搜索引擎做为查找信息的主要工具,最快的方式获得最有效的信息是用户所期望的。本文在Lucene搜索引擎开发包的基础上,提出了一种生成搜索推荐词的方法,较目前主流搜索引擎更具智能化,初步具备了语义联想功能。

参考文献

[1]BABA H.Google的秘密:PageRank彻底解说[M].2003:2-6.

[2]邱哲,符滔滔.开发自己的搜索引擎Lucene2.0+Heritrix[M].北京:人民邮电出版社,2007:46-92.

[3]何伟,薛素静.基于Lucene的全文搜索引擎的设计与实现[J].情报杂志,2006(9):88-89.

[4]黄昌宁,赵海.中文分词十年回顾[J].中文信息学报,2007,5(3):9-17.

[5]Quinlan J R.Induction of decision trees[M].Machine Learning,1986:81-106.

[6]Salton G,McGill M J.An Introduction to Modern Information Retrieval[M].McGraw-Hill,1983.

[7]Chen H,Lin C.An Automatic Indexing and Neural Network Approach to Concept Retrieval and Classification of Multilingual(Chinese-English)Documents[M].Communications of the ACM,1994

【Lucene】推荐阅读:

Lucene技术05-19

上一篇:城中村体育下一篇:“预就业”实践

本站热搜

    相关推荐