• 1
预览模式: 普通 | 列表

Windows 下运行Nutch批处理脚本

将以下文本内容存放入NUTCH_HOME\bin 目录下 , 命名为nutch.bat,设置以下JAVA_HOME 和 NUTCH_HOME,然后在命令行运行 %NUTCH_HOME%\bin\nutch

 @echo off
set JAVA_HEAP_MAX="-Xmx512M"
if not "%1"=="" goto INIT else goto echoMSG
:echoMSG
  echo Title:欢迎使用北京线点科技 Nutch 运行脚本
  echo Author:jaddy0302 mail:jaddy0302@126.com QQ:5622928
  echo Site:http://www.xd-tech.com.cn 线点科技 专业垂直搜索引擎产品
  echo Nutch Version: 0.7.2
  echo Usage: nutch COMMAND
  echo where COMMAND is one of:
  echo   crawl             one-step crawler for intranets
  echo   admin             database administration, including creation
  echo   inject            inject new urls into the database
  echo   generate          generate new segments to fetch
  echo   fetchlist         print the fetchlist of a segment
  echo   fetch             fetch a segment's pages
  echo   parse             parse a segment's pages
  echo   index             run the indexer on a segment's fetcher output
  echo   merge             merge several segment indexes
  echo   dedup             remove duplicates from a set of segment indexes
  echo   updatedb          update db from segments after fetching
  echo   updatesegs        update segments with link data from the db
  echo   mergesegs         merge multiple segments into a single segment
  echo   readdb            examine arbitrary fields of the database
  echo   analyze           adjust database link-analysis scoring
  echo   prune             prune segment index(es) of unwanted content
  echo   segread           read, fix and dump segment data
  echo   segslice          append, join and slice segment data
  echo   server            run a search server
  echo   namenode          run the NDFS namenode
  echo   datanode          run an NDFS datanode
  echo   ndfs              run an NDFS admin client
  echo   jobtracker        run the MapReduce job Tracker node
  echo   tasktracker       run a MapReduce task Tracker node
  echo  or
  echo   CLASSNAME         run the class named CLASSNAME
  echo Most commands print help when invoked w/o parameters.
  goto end;
:INIT 
  set NUTCH_HOME=C:\work\nutch-0.7.2
  if "%NUTCH_HOME%"=="" set NUTCH_HOME=.. 
  set CLASSPATH=%NUTCH_HOME%;%NUTCH_HOME%\conf;%NUTCH_HOME%\plugin
  @echo @echo off>setclasspath.bat
  for %%i in (%NUTCH_HOME%\nutch-*.jar) do @echo set CLASSPATH=%%CLASSPATH%%;%%i>>setclasspath.bat;& for %%i in (%NUTCH_HOME%\lib\*.jar) do @echo set CLASSPATH=%%CLASSPATH%%;%%i>>setclasspath.bat;
  goto EXEC
:EXEC
  call setclasspath
  if  "%1" == "crawl" set CLASS=org.apache.nutch.tools.CrawlTool
  if  "%1" == "admin" set CLASS=org.apache.nutch.tools.WebDBAdminTool
  if  "%1" == "inject" set CLASS=org.apache.nutch.db.WebDBInjector
  if  "%1" == "generate" set CLASS=org.apache.nutch.tools.FetchListTool
  if  "%1" == "fetchlist" set CLASS=org.apache.nutch.pagedb.FetchListEntry
  if  "%1" == "fetch" set CLASS=org.apache.nutch.fetcher.Fetcher
  if  "%1" == "parse" set CLASS=org.apache.nutch.tools.ParseSegment
  if  "%1" == "index" set CLASS=org.apache.nutch.indexer.IndexSegment
  if  "%1" == "merge" set CLASS=org.apache.nutch.indexer.IndexMerger
  if  "%1" == "dedup" set CLASS=org.apache.nutch.indexer.DeleteDuplicates
  if  "%1" == "updatedb" set CLASS=org.apache.nutch.tools.UpdateDatabaseTool
  if  "%1" == "updatesegs" set CLASS=org.apache.nutch.tools.UpdateSegmentsFromDb
  if  "%1" == "mergesegs" set CLASS=org.apache.nutch.tools.SegmentMergeTool
  if  "%1" == "readdb" set CLASS=org.apache.nutch.db.WebDBReader
  if  "%1" == "prune" set CLASS=org.apache.nutch.tools.PruneIndexTool
  if  "%1" == "segread" set CLASS=org.apache.nutch.segment.SegmentReader
  if  "%1" == "segslice" set CLASS=org.apache.nutch.segment.SegmentSlicer
  if  "%1" == "analyze" set CLASS=org.apache.nutch.tools.LinkAnalysisTool
  if  "%1" == "server" set CLASS=org.apache.nutch.searcher.DistributedSearch$Server
  if  "%1" == "namenode" set CLASS=org.apache.nutch.ndfs.NDFS$NameNode
  if  "%1" == "datanode" set CLASS=org.apache.nutch.ndfs.NDFS$DataNode
  if  "%1" == "ndfs" set CLASS=org.apache.nutch.fs.TestClient
  if  "%1" == "jobtracker" set CLASS=org.apache.nutch.mapReduce.JobTracker
  if  "%1" == "tasktracker" set CLASS=org.apache.nutch.mapReduce.TaskTracker
  call "%JAVA_HOME%\bin\java" %JAVA_HEAP_MAX% -classpath "%CLASSPATH%" %CLASS% %2 %3 %4 %5 %6 %7 %8 %9
:end

 

分类:搜索引擎 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2758

搜索引擎重复网页发现技术分析

一. 介绍

统计结果表明,近似镜像网页数占总网页数的比例高达全部页面的29%,而完全相同的页面大约占全部页面的22%。这些重复网页有的是没有一点改动的拷贝,有的在内容上稍作修改,比如同一文章的不同版本,一个新一点,一个老一点,有的则仅仅是网页的格式不同(如 HTML, Postscript),文献[Models and Algorithms for Duplicate Document Detection 1999年]将内容重复归结为以下四个类型:

1.如果2篇文档内容和格式上毫无差别,则这种重复叫做full-layout duplicate。

2.如果2篇文档内容相同,但是格式不同,则叫做full-content duplicates

3.如果2篇文档有部分重要的内容相同,并且格式相同,则称为partial-layout duplicates

4.如果2篇文档有部分重要的内容相同,但是格式不同,则称为partial-content duplicates

近似重复网页发现技术就是通过技术手段快速全面发现这些重复信息的手段.如何快速准确地发现这些内容上相似的网页已经成为提高搜索引擎服务质量的关键技术之一。发现重复或者近似网页对于搜索引擎有很多好处:

1.       首先,如果我们能够找出这些重复网页并从数据库中去掉,就能够节省一部分存储空间,进而可以利用这部分空间来存放更多的有效网页内容,同时也提高了web检索的质量。

2.       其次,如果我们能够通过对以往搜集信息的分析,预先发现重复网页,在今后的网页搜集过程中就可以避开这些网页,从而提高有效网页的搜集速度。有研究表明重复网页随着时间级别不发生太大变化,所以这种从重复页面集合中选择部分页面进行索引是有效的.

3.       另外,如果某个网页的镜像度较高,也就预示着该网页相对重要,在搜集网页时应赋予它较高的优先级,而当搜索引擎系统在响应用户的检索请求并对输出结果排序时,应该赋予它较高的权值。

4.       从另外一个角度看,如果用户点击了一个死链接,那么可以将用户引导到一个相同页面,这样可以有效的增加用户的检索体验.因而近似镜像网页的及时发现有利于改善搜索引擎系统的服务质量。



二. 基本处理流程

通过分析现有技术,可以归纳出以下几个解决该问题的核心技术点,每个不同的技术基本上是由这几个技术点构成,无非是具体采纳的技术不同而已:



1.   文档对象的特征抽取:将文档内容分解,由若干组成文档的特征集合表示,这一步是为了方面后面的特征比较计算相似度.

2.   特征的压缩编码:通过HASH编码等文本向数字串映射方式以方便后续的特征存储以及特征比较.起到减少存储空间,加快比较速度的作用.

3.   文档相似度计算:根据文档特征重合比例来确定是否重复文档.

4.   聚类算法:通过叠代计算算出哪些文档集合是根据相似度计算是相近的;

5.   工程化问题:出于海量数据计算速度的考虑,提出一些速度优化算法以使得算法实用化.



我们可以从几个不同的角度对于现有的方法进行分类:

l   按照利用的信息,现有方法可以分为以下三类

1.只是利用内容计算相似

2.结合内容和链接关系计算相似

3.结合内容,链接关系以及url文字进行相似计算

评价:现有绝大部分方法还是利用文本内容进行相似识别,其它两种利用链接关系以及URL文字的方法还不是很成熟,而且从效果看引入其它特征收效并不明显,所以从实际出发还是选择利用内容进行相似计算的算法.



l   按照特征提取的粒度现有方法可以分为以下三类

1.   按照单词这个级别的粒度进行特征提取.

2.   按照SHINGLE这个级别的粒度进行特征提取.SHNGLE是若干个连续出现的单词,级别处于文档和单词之间,比文档粒度小,比单词粒度大.

3.   按照整个文档这个级别的粒度进行特征提取

评价:

目前这个领域里面很多工作借鉴类似于信息检索的方法来识别相似文档,其本质和SHINGLE等是相同的,都是比较两个文档的重合程度,但是区别是SHINGLE是将若干单词组成片断,粒度比较大,而信息检索类方法其实是用单词作为比较粒度,粒度比较小,粒度越大计算速度越快,而粒度越小计算速度越慢,所以信息检索类方法是不实用的,而且对SHINGLE的改进以及新提出的方法的发展趋势也是粒度越来越大,这样才能解决实际使用中速度的问题。粒度最大的极端情况是每个文档用一个HASH函数编码(比如MD5),这样只要编码相同就说明文档完全相同,但是粒度太大带来的问题是对于细微的变化文档无法判别,只能判断是否完全相同,至于部分相同以及相同的程度无法判断.

所以,现有方法也可以从以下角度分类:粒度。最小粒度:单词;中等粒度:SHINGLE;最大粒度:整个文档;可见SHINGLE类方法其实是在速度和精确程度上的一种折中方法。可以探讨不同粒度的效果,比如以句子为单位进行编码,以段落为单位编码等不同粒度的编码单位,还可以考虑动态的编码:首先以自然段落编码进行判别,如果发现部分相似,然后针对不同的部分再以细小粒度比如句子甚至单词级别的比较 所谓SUPER SHINGLE就是将粒度放大得到的。粒度越大,好处是计算速度越快(对于MD5整个文档来说,每个文档一个HASH编码,然后排序,将相同的找出,是速度最快的),缺点是会遗漏很多部分相似的文档;粒度越小,好处是招回率比较高,缺点是计算速度减慢。



l   按照去处重复的级别进行分类,去处重复三个级别:

1.   镜像站点:根据站点内相似页面多少进行判断.实现相对简单.

2.   完全相同网页:实现相对简单并且速度比较块,可以根据页面MD5整个文档来说,每个文档一个HASH编码,然后排序,将相同的找出.

3.   部分相同页面:实现相对负责,目前大多工作在这个部分.



评价:

三个级别应该从最高级别到较低级别分别进行,因为有很大比例(22%)的内容是完全相同的,这个部分实现起来相对简单,而且如果这个部分已经识别,那么针对部分相同页面的计算量会大量减少,这样应该可以减少总体的计算时间..



l   按照去重的时机,可以分为以下三类

(1)   抓取页面的时候去重,这样可以减少带宽以及减少存储数量;

(2)   索引之后进行去重;

(3)   用户检索时候进行再次去重;增加准确性,耗费时间;



评价:

可以结合三个时机某个或者所有都结合,对于GOOGLE来说,很可能是结合了2和3两种方法, GOOGLE的很多思路建立在后台计算和实时计算联合,比如相关度计算,后台计算重要性得分,在用户输入查询后得到初始数据集合,然后根据这个数据集合之间文档的关系重新调整顺序;比如去处重复,首先在后台进行重复发现,为了增加精确度,在返回查询结果后,在返回文档集合内,又根据“描述”部分重新计算哪些文档是重复的,这样增加了准确性,估计其它很多相关算法也采取这种联合策略,为了加快速度,实时计算部分可以和CACHE部分结合进行计算。



l   按照不同的特征选择方法,有几种方式:

1.   完全保留特征

2.   特征选择,设置不同的选择策略来保留部分特征,抛弃其它特征

a.   比如对于单词级别的抛弃权重小的单词(I-MATCH)

b.   对于SHINGLE方法,可以保留部分SHINGLE抛弃其它SHINGLE

(1)   一种是保留FINGERPRINT第I个位置为0的SHINGLE,其它抛弃;

(2)   一种是每隔I个SHINGLE进行抽样保留,其它抛弃;这两种得到的文档SHINGLE数目是变长的;

(3)   一种是选择最小的K个SHINGLE,这种得到定长的SHINGLE数目;

(4)   用84个RABIN FINGERPRINT函数对于每个SHINGLE进行计算,保留数值最小的84个FINGERPRINT,这个方法是定长的.



对于SHINGLE类方法来说,还可以区分为:定长的和变长的block切分算法

定长算法:速度快,但是如果内容有稍微变化(比如插入或者删除一个字符或者单词),其影响会比较大。比如Shingle及其改进方法(Super-Shingle),CSC及其改进方法(CSC-SS)。

变长算法:速度相对慢,但是内容变化只是造成局部影响。比如CDC,TTTD等算法。



评价: 为了提高计算速度,一种策略是在特征提取的时候,抛弃部分特征,保留部分特征,通过减少特征数目来加快计算速度.另外一个策略是粒度尽可能加大,比如SUPER-SHINGLE,MEGA-SHINGLE甚至是文档基本;为了提高算法效果,策略是采取变长的内容切割算法比如CSC算法等;这三种策略是方法加快速度和准确性的发展方向.





一些初步的结论:

1.   对于信息检索类型的方法来说,由于其特征选择是基于单词的,所以计算速度是个根本的问题,所以基本上是不实用的;

2.   从利用的信息来看,实用的系统还是应该立足于只是利用文本内容来判别相似性,排除掉利用链接信息等方法;

3.   从算法特征抽取粒度来看,应该立足于SHINLGE类的粒度甚至是文档级别的粒度算法;而SHINGLE类别的算法又应该优先选择抛弃部分特征的算法以及变长的算法;

4.   从去重级别角度考虑,应该将完全相同的文档和部分相同的文档识别分开进行,而且首先进行完全相同文档的识别,这样会有效加快计算速度;

5.   从去重时机考虑,可以考虑结合后台去重以及实时去重,这样增加去重的效果;

6.   从压缩编码方法来看,最有效的方式可能是RABIN FINGERPRINT变体算法;

7.   从聚类方法来看,最有效的方式可能是UNION FIND算法,目前比较快的算法基本上都采用这个方法;

8.   从整体方法选择来看,应该选择改进的SHINLGE方法,在此基础上进行进一步的改进;





三. 方法效率比较

1.   SHINGLING 方法:时间效率O((mn)2) ,其中 m是SHINGLE的大小,n是文档数目.计算时间为:3千万文档,10台机器算一天,或者一台机器算10天;

2.   改进的SHINGLE方法(On the Evolution of Clusters of Near-Duplicate Web Pages.):时间效率接近于线性的O(n),计算时间为:1亿5千万网页计算3个小时;

3.   IMACH方法: 最坏的情况下时间复杂度是(O(d log d)),速度比较快

4.   BLOOM FILTER方法:10k数据花费大约66ms;



从计算效率考虑,速度排序为:

1.   改进的SHINGLE方法;

2.   IMATCH方法;

3.   BLOOM FILTER方法;

4.   SHINGLE方法;





四. 目前代表性解决方法分析

1.   Shingle方法(1997年)

a.   特征抽取

Shingle方法:所谓Shingle类似于自然语言处理中常用的N-GRAM方法,就是将相互连续出现窗口大小为N的单词串作为一个Shingle,两者的不同点在于Shingle是这些串的集合,相同的串会合并为一个,而N-GRAM则由于考虑的是文本线性结构,所以没有相同合并步骤.每个Shingle就是文档的一个特征,一篇文档就是由所有这些Shingle构成的.



b.   压缩编码

40 bit长度 Rabin FingerPrint方法;至于存储方式则类似于传统信息检索领域的倒排文档技术,存储<Shingle,ID>信息以记录某个特征在哪些文档中出现过,然后进一步计算文档的相似性;



c.   文档相似度计算

(1)   相似度:任意两个文档A和B,相似度指的是两者相同的Shingle数目占两者Shingle数目总和的比例;

(2)   包含度:指的是两者相同的Shingle数目占某篇文档Shingle数目的比例;



d.   优化措施:

(1)   分布计算然后合并;

(2)   抛弃超高频出现Shingle,分析发现这些Shingle是无意义的片断;

(3)   完全相同文档保留一份进行聚类;(文档是否完全相同根据压缩编码后数值是否相同判断)

(4)   Super Shingle:关于Shingle的Shingle,从更大结构上计算相似性以节省存储空间;





2.   Google可能采取的方法

a.   特征抽取

类似于Shingle方法,不同点在于:对于每个单词根据HASH函数决定属于哪个LIST,这样每个文档由若干个这样的LIST构成;



b.   压缩编码

FingerPrint方法;对于组成文档的LIST进行FingerPrint方法计算;



c.   文档相似度计算

    编辑距离(Edit Distance):如果两个文档有任何一个FingerPrint相似就判断为内容接近.



d.   聚类方法

首先对<FingerPrint,Doc ID>按照Doc ID进行排序;然后采取Union Find聚类方法,聚类结果就是相似文档集合;



e.   优化措施



3.   HP实验室方法(2005年)

a.   特征抽取

基于内容的Chunk方法:变长而非定长的Chunk算法(TTTD算法);将一篇文档分解为若干个长度不同的Chunk,每个Chunk作为文本的一个特征.与shingle方法相比这种变长Chunk方法能够增加系统招回率;



b.   压缩编码

128bit MD5 HASH方法;每篇文章压缩编码后由若干 <Chunk 长度, 定长HASH编码>二元组构成;



c.   文档相似度计算

(1)   构建所有文档和Chunk构成的二分图;

(2)   找到文档A包含的所有CHUNK,计算这些CHUNK还被哪些其它文档包含;

(3)   计算这些文档和A的相似性;



d.   聚类方法:Union Find 算法

e.   优化措施:Bipartite 划分,本质上是将大规模数据分成小规模数据进行识别然后再合并结果.相当于分布计算;



4.bloom filter(2005年)

(1).特征抽取方法

基于内容的语块(Content-defined chunking CDC):CDC将文档切分为变长的内容片断,切分边界由rabin fringerprint和预先制定的maker数值匹配来进行判断。

(2)编码(构造 bloom filter集合元素)

对于切分的片断进行编码。bloom filter的编码方式如下:整个文档是由片断构成的,文档由长为m的二值数组表示。在将一个元素(内容片断)进行编码插入集合的时候,利用k个不同的hash函数进行编码,每个hash函数设置m个位置的某个位置为1。这种技术以前主要用来进行判断某个元素是否被集合包含。

(3)相似度计算方法

bloom filter方法:对于两个已经编码的文档(两个长度为m的二值数组),通过bit逻辑运算AND计算,如果两者很多位置都同时为1,那么两个文档被认为是近似的。

(4)优势

1.文档编码形式简洁,便于存储。

2.由于计算相似性是BIT逻辑运算,所以速度快。

3.相对Shingling 方式来说便于判断文档包含关系。(某个文档包含另外一个短小的文档)



5.内容+链接关系(2003年)

1.特征抽取方法

  这个方法在抽取特征的时候同时考虑了文档的内容因素以及链接关系因素。

  内容因素:通过Random Projection技术将文档内容从高维空间映射到低维空间,并且由实数表示,如果两个文档映射后的数字越接近则表明两者内容越相似。

  链接因素:通过考虑类似于PAGERANK的连接关系,将某个网页的内容因素计算获得的分值通过链接传播到其他网页(传播关系见下列公式),多次叠代计算后得到每个页面的链接得分。

       






2.相似度计算方法

  每个文档由二元组<RP,HM>构成,RP代表内容部分的数值,HM代表链接关系代表的数值。如果两个文档每个项之间的差值都小于指定值,则判断两个文档是相似的。

3.效果

只采取内容精度达到90%,两者结合精度达到93%。从中看出,链接的作用并不明显。这可能跟这个方法的链接使用方法有关,因为通过链接计算的还是内容的情况。



6.I-Match方法(2002年)

(1)I-Match不依赖于完全的信息分析,而是使用数据集合的统计特征来抽取文档的主要特征,将非主要特征抛弃。输入一篇文档,根据词汇的IDF值过滤出一些关键特征,并且计算出这篇文档的唯一的Hash值,那些Hash值相同的文档就是重复的。

(2)使用SHA1作为Hash函数,因为它的速度很快而且适用于任何长度。SHA-1生成一个20-byte 或者160-bit 的hash值并且使用一个安全的冲突消解算法,使得不同的标志串(token streams)生成相同的hash值的概率非常低。.把<docid, hashvalue>元组插入树结构的时间复杂度是(O(d log d)),其他的如检索数据结构(hash表)需要(O(d))。对重复(duplicate)的识别是在将数据插入hash数组或是树结构中进行的,任何的hash值的冲突就表示检测到一个重复内容。

(3)最坏的情况下时间复杂度是(O(d log d)),速度比较快。
分类:搜索引擎 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1657
  • 1