In: 搜索引擎
11 十一 2006作者: Maco hehe, 用PHP去做中文分词并不是一个太明智的举动, :p 下面是我根据网上找的一个字典档, 简易实现的一个分词程序. (注: 字典档是gdbm格式, key是词 value是词频, 约4万个常用词) 完整的程序演示及下载请参见: http://root.twomice.net/my_php4/dict/chinese_segment.php <?php //中文分词系统简易实现办法 //切句单位:凡是ascii值<128的字符 //常见双字节符号:《》,。、?“”;:!¥…… %$#@^&*()[]{}|\/"' //可以考虑加入超常见中文字: 的 和 是 不 了 啊 (不过有特殊字比如 “打的” “郑和” .. :p) //计算时间 function getmicrotime(){ list($usec, $sec) = explode(” “,microtime()); return ((float)$usec + (float)$sec); } $time_start = getmicrotime(); //词典类 class ch_dictionary { var [...]
In: 搜索引擎
5 十一 2006源地址:http://www.xd-tech.com.cn/blog/article.asp?id=14 将查询的响应时间降低到0.5秒以内 Nutch 的索引文档数量在100W以下的时候,怎么处理查询响应都比较的快速,基本上不会超过0.5秒。但是超过200W索引文档 的时候如果不处理,查询的响应时间就会超过这个数字。如果内存足够,甚至可以把200W的索引文档全部加载到内存,这时查询响应时间会小于0.1秒,但内存占用会超过1.5G,这种方式适合数据量比较小的查询系统,例如文献检索等。 当数据量超过200W的时候如果全部加载到内存则不太适合了,因为受JVM最大内存的限制(1.2G到3.6G Linux下),加载超过200W索引页面的时候,JVM会溢出。 以下介绍通过几种方式实现超过1000W的索引页面查询响应时间降低到0.5秒以内。 1、让索引尽可能的简单,非必要的索引字段尽可能的删除掉,索引的字段需要正确的区分那些Index ;那些Tokenize、那些Store。 2、将 indexer.minMergeDocs 和 indexer.mergeFactor 调整到尽可能的大。如果索引的页面大小平均在10K,JVM可用的内存是2.6G,则可以将indexer.minMergeDocs 设置为30000(根据页面尺寸定),这对查询的效率影响巨大。 3、将尽可能多的 segemts合并到一起,可以让 一个 segment 包含100W个document 并根据实际情况调整一个segment 包含的 document的数量 。 4、将所有的 index 合并到一起,如果创建索引的时候 indexer.minMergeDocs 是 足够大,则合并以后的index目录下的文件会很少,这将非常的有利于查询性能的提高(我在我的系统里面把大约400W个document合并到一个segments目录下,然后分成5个segment,最后把400W个索引文档合并到一个index目录下,最后产生的index目录下的文件只有10多个,但文件尺寸非常大)。 5、将索引分布在多个JVM。如果单台服务器的内存很大(超过6G),那么可以在一台计算机上开启多个查询服务器,每个查询服务器启动的JVM内存占用会从400M逐渐增加到2G左右,所以如果单个的查询服务器使用的索引文档超过200W,则需要增加足够的内存以应付查询缓存(查询服务器启动时间越长,缓存的内容越多,内存占用越大)。 6、一般的垂直搜索引擎都需要在Nutch 上再做开发,索引的及时更新都会面临一些问题。 索引超过3000W个页面的查询效率调整暂时不能公开,按照以上方式处理会超过1秒,但小于5秒。
In: 搜索引擎
2 十一 2006出处地址:http://www.5ai7.net/viewtopic.php?t=93 compass compass是开源的java搜索引擎框架,建立在Lucene搜索引擎的基础之上的。是对Lucene搜索引擎在企业应用(数据库应用)中的增强。 在全文检索(lucene)开发和关于jforum2.1.6的检索问题(采用lucene实现)两篇文章中都是讨论关于全文检索的。这里想描述一下如何利用compass框架来实现这一功能。 在实际的项目中,一般都会涉及到数据库,如何保证数据库的增删改变实时的映射到索引文件中去,compass就是最佳的选择。 如果你采用了Hibernate等ORM方案,你只须在POJO中进行annotation注释,或者采用AOP的方式,自动变更索引。 如果你采用了JDBC,也可以在XML文件中加以配置,Compasss定时进行更新。Compasss还支持事务处理。 没有Compasss的话,一般会采用比如深夜重建一次索引,或是采用一个线程类来定时建立或重建索引,在关于jforum2.1.6的检索问题(采用lucene实现)中就是这样实现的,可以去参考一下。 当然从效率、实时性、安全性来说,Compasss是一个好的选择,而且开发起来也比较方便。 Compasss和Spring很好的结合了起来,在Compasss的包内专门设置了Spring的相关操作,比如和Spring MVC的操作:org.compass.spring.web.mvc.CompassIndexController来建立索引,如果换成Struts来开发的话,需要作些调整,当然动作不会很大,模仿CompassIndexController就可以了。 这里给出一个小例子,以作参考,是采用了Hibernate-ORM方案实现,同时采用了Spring、Struts: 首先是POJO类: @Searchable(alias = “customer”) public class Customer { @SearchableId private String guid; @SearchableProperty(name = “customerName”) private String customerName; …… } 然后是Compass的具体实现,由于采用了Struts,所以改造相应的建立索引和检索的类。 /** * 仿照 {@link org.compass.spring.web.mvc.CompassIndexController} * 中的代码,构建了一个Service(建立索引),方便不使用Spring MVC的实现 * * @author Schweigen * @see org.compass.spring.web.mvc.CompassIndexController * @see org.compass.spring.web.mvc.AbstractCompassGpsCommandController */ public [...]
In: 搜索引擎
2 十一 2006作者:周 登朋 (zhoudengpeng@yahoo.com.cn), 软件工程师, 上海交通大学 2006 年 9 月 06 日 在本篇文章中,你会学习到如何利用 Lucene 实现高级搜索功能以及如何利用 Lucene 来创建 Web 搜索应用程序。通过这些学习,你就可以利用 Lucene 来创建自己的搜索应用程序。 架构概览 通常一个 Web 搜索引擎的架构分为前端和后端两部分,就像图一中所示。在前端流程中,用户在搜索引擎提供的界面中输入要搜索的关键词,这里提到的用户界面一般是一个带有输入框的 Web 页面,然后应用程序将搜索的关键词解析成搜索引擎可以理解的形式,并在索引文件上进行搜索操作。在排序后,搜索引擎返回搜索结果给用户。在后端流程中,网络爬虫或者机器人从因特网上获取 Web 页面,然后索引子系统解析这些 Web 页面并存入索引文件中。如果你想利用 Lucene 来创建一个 Web 搜索应用程序,那么它的架构也和上面所描述的类似,就如图一中所示。 Figure 1. Web 搜索引擎架构 利用 Lucene 实现高级搜索 Lucene 支持多种形式的高级搜索,我们在这一部分中会进行探讨,然后我会使用 Lucene 的 API 来演示如何实现这些高级搜索功能。 布尔操作符 大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 AND, OR, NOT。Lucene 支持 5 种布尔操作符,分别是 [...]
In: 搜索引擎
28 十 2006前几天读到google研究员吴军的数学之美系列篇,颇有感触。而恰好自己前段时间做了个基于统计语言模型的中文切分系统的课程项目,于是乎,帖出来与大家共同学习。 分词技术在搜索引擎,信息提取,机器翻译等领域的重要地位与应用就不敖述了。步入正题:) <!–[if !supportLists]–>一、 <!–[endif]–>项目概述 本切分系统的统计语料是用我们学校自己开放的那部分,大家可以在 这里 下载,中文字符约184万,当然这都是已切分好了的,可以用此建立一个比较小的语料库。本系统我主要分下面四个步骤完成: <!–[if !supportLists]–>1、 <!–[endif]–>语料预处理 <!–[if !supportLists]–>2、 <!–[endif]–>建立 2-gram(统计二元模型) <!–[if !supportLists]–>3、 <!–[endif]–>实现全切分 <!–[if !supportLists]–>4、 <!–[endif]–>评估测试 下面我分别对这四个方面一一道来。 <!–[if !supportLists]–>1、 <!–[endif]–>语料预处理 下载的已切分的语料都是形如“19980131-04-012-001/m 现实/n 的/u 顿悟/vn 却/d 被/p 描/v 出/v 形/Ng 来/v 。/w ” ,有的前面还保留了日期编号,因为这些切分语料的来源是人民日报。预处理主要是按标点符号分句,句子简单定义为( 。?! : ;)这五种标点符号结尾的词串,句子首尾分别添加<BOS>和<EOS>这两个表示句子开始和结束的标记,这在2-gram建模时要用的,后面会提到。处理过程中,忽略词类信息和前面的日期信息,因为我这个切分系统不考虑词类标注。如前面这句预处理后应该为下面形式 “<BOS>现实 的 顿悟 却 被 描 出 形 来 [...]
QK31欢迎你的到来.