发明名称 基于SIMD优化的网页去重并行方法
摘要 本发明公开了一种基于SIMD优化的网页去重并行方法,包括以下步骤:步骤1:网页文本信息提取步骤:该过程用于将网页有效信息提取出来;步骤2:Shingle提取步骤:该过程用于提取网页特征,并生成Shingles集合;步骤3:聚类步骤:该过程用于降低比对次数,减小时间和空间复杂度;步骤4:指纹比对步骤:该过程用于寻找出相似网页,将相似的网页剔除。该基于SIMD优化的网页去重并行方法能在保证查准率和查全率的同时,有效地提高网页相似度检测的速率。
申请公布号 CN102024065B 申请公布日期 2013.01.02
申请号 CN201110021002.5 申请日期 2011.01.18
申请人 中南大学 发明人 龙军;张祖平;袁鑫攀;罗跃逸
分类号 G06F17/30(2006.01)I;G06F17/27(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 长沙市融智专利事务所 43114 代理人 黄美成
主权项 1.一种基于SIMD优化的网页去重并行方法,其特征在于,包括以下步骤:步骤1:网页文本信息提取步骤:该步骤用于将网页有效信息提取出来;步骤2:Shingle提取步骤:该步骤用于提取网页特征,并生成Shingle集合;步骤3:聚类步骤:该步骤用于降低比对次数,减小时间和空间复杂度;步骤4:指纹比对步骤:该步骤用于寻找出相似网页,将相似的网页剔除;步骤4的具体步骤为:采用以下两种方法中的任一种方法:方法1:根据聚类结果,将每一个类中的网页ID取出,设该类有n个网页,对于所有的网页的指纹集合为<maths num="0001"><![CDATA[<math><mrow><msub><mi>Matrix</mi><mi>finger</mi></msub><mo>=</mo><mfenced open='[' close=']'><mtable><mtr><mtd><msub><mi>finger</mi><mn>11</mn></msub></mtd><mtd><msub><mi>finger</mi><mn>21</mn></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mn>1</mn></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>12</mn></msub></mtd><mtd><msub><mi>finger</mi><mn>22</mn></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mn>2</mn></mrow></msub></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>1</mn><mi>M</mi></mrow></msub></mtd><mtd><msub><mi>finger</mi><mrow><mn>2</mn><mi>M</mi></mrow></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mi>nM</mi></msub></mtd></mtr></mtable></mfenced><mo>;</mo></mrow></math>]]></maths>定义<img file="FDA00001832260200012.GIF" wi="916" he="145" />定义函数<maths num="0002"><![CDATA[<math><mrow><mi>v</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><mn>1</mn><mo>,</mo></mtd><mtd><mi>x</mi><mo>&GreaterEqual;</mo><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn><mo>,</mo></mtd><mtd><mi>x</mi><mo>&lt;</mo><mn>0</mn></mtd></mtr></mtable></mfenced><mo>;</mo></mrow></math>]]></maths>考虑每一列的指纹,首先生成一个128维的向量V,每一位都初始化为0,考虑该列的每一个指纹中的每一比特,若该位为1,则向量V的相应位加1,若该位为0,则向量V的相应位减1;通过叠加后,对于向量V中为正的元素归为1,为负的元素归为0;<maths num="0003"><![CDATA[<math><mrow><msub><mi>V</mi><mn>1</mn></msub><mo>=</mo><mo>[</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mn>1,1</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>1,2</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>1</mn><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mn>1,1</mn></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>1,2</mn></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>1</mn><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mn>1,1</mn></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>1,2</mn></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>1</mn><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>]</mo></mrow></math>]]></maths><maths num="0004"><![CDATA[<math><mrow><mrow><msub><mi>V</mi><mn>2</mn></msub><mo>=</mo><mo>[</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mn>2,1</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>2,2</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>2</mn><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mn>2,1</mn></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>2,2</mn></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>2</mn><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mn>2,1</mn></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>2,2</mn></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>2</mn><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>]</mo></mrow><mo>;</mo></mrow></math>]]></maths><maths num="0005"><![CDATA[<math><mrow><msub><mi>V</mi><mi>n</mi></msub><mo>=</mo><mo>[</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mn>1</mn></mrow></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mn>2</mn></mrow></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mn>1</mn></mrow></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mn>2</mn></mrow></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>v</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mn>1</mn></mrow></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mn>2</mn></mrow></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><mo>+</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mo>,</mo><mi>M</mi></mrow></msub><mrow><mo>(</mo><mn>128</mn><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>]</mo></mrow></math>]]></maths><maths num="0006"><![CDATA[<math><mrow><msub><mi>Matrix</mi><mi>finger</mi></msub><mo>=</mo><mfenced open='[' close=']'><mtable><mtr><mtd><msub><mi>finger</mi><mn>11</mn></msub></mtd><mtd><msub><mi>finger</mi><mn>21</mn></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mn>1</mn></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>12</mn></msub></mtd><mtd><msub><mi>finger</mi><mn>22</mn></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mn>2</mn></mrow></msub></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>1</mn><mi>M</mi></mrow></msub></mtd><mtd><msub><mi>finger</mi><mrow><mn>2</mn><mi>M</mi></mrow></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mi>nM</mi></msub></mtd></mtr></mtable></mfenced><mo>=</mo><mo>[</mo><msub><mi>V</mi><mn>1</mn></msub><mo>,</mo><msub><mi>V</mi><mn>2</mn></msub><mo>.</mo><mo>.</mo><mo>.</mo><msub><mi>V</mi><mi>n</mi></msub><mo>]</mo><mo>;</mo></mrow></math>]]></maths>向量V<sub>i</sub>用于表示n个文档的指纹,其中i=1,2,...,n;V<sub>i</sub>为128位的长整型数,该长整型数表征该网页的指纹;指纹比对具体流程如下:步骤a:使用x,y,z分别代表三个128位xmm寄存器,使用a代表网页A的128位指纹,使用b代表网页B的128位指纹,将a、b分别加载到寄存器x、y;步骤b:使用_m128i_mm_xor_si128(_m128i a,_m128i b)计算a、b异或值Mask,异或值中1的个数就是a和b的海明距离;步骤c:使用_mm_cvtsd_f64获取Mask的低64位Mask_low,使用mm_unpacklo_epi64、_mm_cvtsd_f64获取Mask的高64位Mask_high;步骤d:分别使用_popcnt64计算Mask_low和Mask_high中1的个数,并相加赋值给Count;步骤e:当Count&gt;Dx时认为网页A和网页B不相似,反之相似,Dx为第一距离阈值;方法2:考虑指纹集合:<maths num="0007"><![CDATA[<math><mrow><msub><mi>Matrix</mi><mi>finger</mi></msub><mo>=</mo><mfenced open='[' close=']'><mtable><mtr><mtd><msub><mi>finger</mi><mn>11</mn></msub></mtd><mtd><msub><mi>finger</mi><mn>21</mn></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mn>1</mn></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mn>12</mn></msub></mtd><mtd><msub><mi>finger</mi><mn>22</mn></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mrow><mi>n</mi><mn>2</mn></mrow></msub></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mn>1</mn><mi>M</mi></mrow></msub></mtd><mtd><msub><mi>finger</mi><mrow><mn>2</mn><mi>M</mi></mrow></msub></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><msub><mi>finger</mi><mi>nM</mi></msub></mtd></mtr></mtable></mfenced><mo>,</mo></mrow></math>]]></maths>对于两个网页:网页i和网页j,它们的指纹集合为:<maths num="0008"><![CDATA[<math><mrow><mfenced open='[' close=']'><mtable><mtr><mtd><msub><mi>finger</mi><mrow><mi>i</mi><mn>1</mn></mrow></msub></mtd><mtd><msub><mi>finger</mi><mrow><mi>j</mi><mn>1</mn></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mrow><mi>i</mi><mn>2</mn></mrow></msub></mtd><mtd><msub><mi>finger</mi><mrow><mi>j</mi><mn>2</mn></mrow></msub></mtd></mtr><mtr><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd><mtd><mo>.</mo><mo>.</mo><mo>.</mo></mtd></mtr><mtr><mtd><msub><mi>finger</mi><mi>iM</mi></msub></mtd><mtd><msub><mi>finger</mi><mi>jM</mi></msub></mtd></mtr></mtable></mfenced><mo>,</mo></mrow></math>]]></maths>采用每一行进行指纹比对,然后计算出指纹之间的距离之和,当距离之和大于第二距离阈值Dy时,认为网页i和网页j不相似,反之相似。
地址 410083 湖南省长沙市岳麓区麓山南路932号