具体实施方式
在此所述的实施例旨在对索引矩阵中的散列值序列进行索引和查询。在一个实施例中,计算机***访问文档以从该文档中提取文本部分。计算机***将散列算法应用于所提取的文本。提取的文本的散列值形成散列值的代表序列。计算机***还将散列值的序列的每个散列值***到索引矩阵中,该索引矩阵被配置为存储多个不同的散列值序列
在另一个实施例中,计算机***访问索引矩阵,在该索引矩阵中存储有多个散列值序列。散列值序列表示来自各种文档中的字构造。计算机***访问选中的散列值序列,该散列值序列对应于查询所要基于的选中的文档。计算机***确定选中的散列值序列的散列值在哪些地方与多个存储的散列值序列的散列值相重叠。计算机***还查询索引矩阵以基于选中的散列值序列中有多少散列值与所述存储的散列值序列的散列值相重叠来确定所述多个散列值序列与选中的散列值有多相似。
以下讨论现涉及可以执行的多种方法以及方法动作。应当注意,虽然这些方法动作可能是按一定次序讨论的,或者是在流程图中被描绘为是按照特定顺序进行的,然而并非必然需要特定的次序,除非特别声明,或者是因为一个动作依赖于另一动作在该动作被执行之前完成而需要的。
本发明的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和***存储器等计算机硬件,如以下更详细讨论的。本发明范围内的各实施例还包括用于携带或存储计算机可执行指令和/或数据结构的物理介质和其他计算机可读介质。这些计算机可读介质可以是通用或专用计算机***能够访问的任何可用介质。存储计算机可执行指令的计算机可读介质是计算机存储介质。携带计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种完全不同类型的计算机可读介质:计算机存储介质和传输介质。
计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。
“网络”被定义为允许在计算机***和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应被包括在计算机可读介质的范围内。
此外,在到达各种计算机***组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(或反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传输到计算机***RAM和/或计算机***处的较不易失性的计算机存储介质。因而,应当理解,计算机存储介质可被包括在还利用(或甚至主要利用)传输介质的计算机***组件中。
计算机可执行指令包括,例如使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。
本领域的技术人员将理解,本发明可在具有许多类型的计算机***配置的网络计算环境中实践,这些计算机***配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器***、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、分布式***(例如云计算、云服务等等)、移动电话、PDA、寻呼机、路由器、交换机等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机***两者都执行任务的分布式***环境中实施。在分布式***环境中,程序模块可以位于本地和远程存储器存储设备中。
图1示出了可在其中采用本发明的原理的计算机体系结构100。计算机体系结构100包括文本提取模块110。可以配置文本提取模块来从文档105提取文本106。所述文本可以是任意类型的格式,并且可以包括任意数目的字符和/或字符类型。文档可以是存储文本或字符序列的任意类型的数据结构。由文本提取模块提取(111)的文本可以被发送给字单元构造模块115。可以配置字单元构造模块来从所提取的文本中构造字单元116。字单元可以是文本的字、短语或其它字符序列。所述字可以是完整的字、部分字或单个字母或数字。该字单元可以被单独发送给或成组发送给散列模块120。
可以配置散列模块120来为从字单元构造模块接收到的每个字单元计算散列值。散列模块可以使用任意类型的散列算法来计算散列值。在一些情况下,散列模块在其接收到字单元时就计算每个字单元的散列值。在这种方式中,形成散列序列121。散列序列可以表示一系列的字,例如短语或句子。在将完整的文档转换为字单元并随后转换为散列值的情况下中,散列值序列121可以表示该完整的文档。散列值序列可以存储在索引矩阵125中,并且可以由矩阵查询模块130来对其查询。
例如,在用户想要确定一个文档与另一个文档有多相似的情况时,可以将这两个文档都转换为字单元和散列值序列,并随后基于散列值序列将它们进行比较。矩阵查询模块130可以将查询131发送给索引矩阵125以确定在选中文档和存储的文档(例如存储的散列值序列126)之间的相似度。索引矩阵(或另一个计算模块)可以确定选中文档和存储的文档之间的差异,并可以发布相似度指示127以指示这两个文档有多相似。下面,分别针对图2和图3的方法200和300,更详细地解释这些概念。
在一些情况中,索引和查询相似的散列序列可以被用于标识复制的、近似复制或基于模板的文档。在这样的情况下,散列值序列可以被用作特定文档的“指纹”。这个指纹可以被用于快速计算文档之间的相似度。下面是非限制性的使用示例:电子邮件消息的检测和过滤(例如反垃圾邮件或定制邮件路由规则)、搜索应用实现(包括在单独的搜索引擎中或产品中的嵌入搜索特征中)、数据挖掘应用实现和敏感信息的数据泄露防护(DLP)。许多其它的使用是可能的,并且上述示例并不是要限制所请求的发明的使用。
如上所述,散列值序列可以被存储在稠密矩阵中。该矩阵可以对散列值序列进行索引,所述散列值序列可被查询以确定复制的、近似复制的或基于模板的文档。在一些情况下,可以通过在大的序列中为每个散列使用值的代表集来改进安全性。例如,可以仅将散列值的一部分存储在索引矩阵125中来取代包括每个字单元的整个散列值。b位Minwise散列算法可以在仅存储散列值的8-12个的同时,提供安全且精确的指纹。通过对索引矩阵中特定单元中的某些试探(heuristics)进行过滤,可以改进性能。
可以通过使用从散列模块120导出的散列值121的序列来实现特定文档(例如105)的固定大小的表示。随后,将该值121的序列用于确定两个文档是否是复制的、近似复制的或从模板导出的。例如,如果文档1和文档2的散列序列有80%近似(即指纹序列在至少80%次数上是相同的),那么,就确定这两个文件是近似复制的。在一些情况下,文档1可以与巨大数目的文档(例如100,000+或1MM+)相比较。在这种情况,可以基于一组散列值序列来索引并查询文档。
在一些实施例中,索引大的散列值序列(即文档指纹)可以包括下述步骤:首先,构造尺寸为1024*212的索引矩阵(该尺寸是可变且可定制的)。每个列对应于12位的散列,因此,1024个散列包括所述指纹。每个行可以对应于12位散列的值。该散列可以是经修改的64位散列(例如Md5导出的)的12个最低有效位。12位散列从MD5中丢弃或过滤了信息,因此,改进了不可逆性。这允许为表示可能敏感信息的散列序列(指纹)创建索引。随后,用将被索引的各种指纹填充索引矩阵。
在一些实施例中,查询索引矩阵可以包括下述步骤:考虑未知的指纹FpQuery并创建名为FpMatchVector的具有等于索引的指纹数目的尺寸的“指纹匹配计数矢量”。FpMatchVector中的每个值可以与索引的指纹相对应。在一些情况下,将该矢量中的所有值初始化为零。对于指纹FpQuery的每个散列Fp(Squery)i,其中(1≤i≤1024):跳到矩阵中对应于(行,列)=Fp(S_query)i,i)的单元。对于该单元中的所有索引的指纹,如果某些探索不匹配散列序列(例如如果例如文件大小的相关联的元数据太大或太小),则忽略下述步骤(否则,则执行步骤):递增FpMatchVector中的对应于那些索引的指纹的计数(例如如果在该单元中是Fp7,则调用FpMatchVector[7]++)。随后,在FpMatchVector中重复步骤并且标识具有在预置阈值(例如80%的相似度)之上的相似度的所有指纹。这可以通过对FpMatchVector中给定位置执行计数并设置散列值的序列的大小(例如在上述示例中为1024)来完成。另外地,相似度可以被用于计算可容度系数,该可容度系数允许基于特定的模板的文档检测。
考虑到以上描述的***和体系结构,参考图2和图3的流程图将更好地理解根据所公开的主题实现的方法。为了解释简明起见,这些方法被示出和描述为一系列框。然而,应该理解和了解,所要求保护的主题不受框的次序的限制,因为一些框可按不同的次序进行和/或与此处所描绘和描述的其他框同时进行。此外,并非全部所示的框都是实现下面所述的方法所必需的。
图2说明了用于对索引矩阵中的散列值的序列进行索引的方法200的流程图。现在将频繁参照图1和图4相应的环境100和400的组件和数据来描述方法200。
方法200包括用于访问文档以从文档中提取至少一部分文本的动作(动作210)。例如,文本提取模块110可以访问文档105以从该文档提取文本106。文本提取模块可以同时(并行)或顺序访问任意数目的文档。每个文档可以来自不同的源或相同的源。例如,可以从一个用户或用户组、从软件应用或从另一实体处接收文档。文本提取模块110可以包括字母、数字和/或其它符号的任意序列或块。
方法200包括从提取的文本部分中构造一个或多个字单元的可选动作(动作220)。例如字单元构造模块115可以从提取的文本111中构造一个或多个字单元116。在一些情况下,构造的字单元可以包括字对。这样,如果提取的文本被读为“Patent Application A1.This is a patent.”(专利申请A1。这是一个专利),则构造的字对将包括下述项:“Patent Application”、“Application A1.”、“A1.This”、“This is”、“is a”、“a patent.”。另外,除了上面列出的这些项之外,还可以使用更加复杂(或更加简单)的字单元。上述示例仅仅说明了一种构造字单元的方式,并不应该被读作是对如何形成字单元的限制。字单元可以包括实质上任意数目的字、字母、数字或其它符号。字单元的构造可以根据需要进行改变或定制。
在一些情况下,可以在没有构造任何字单元的情况下生成散列序列。例如,散列算法可以通过使用各种不涉及字对构造的各种散列技术中的任意技术来创建对应于文档的散列值序列。这样,字对的构造是将文档转换为散列算法可以用于创建散列值序列的事物的一种方式示例。
方法200还包括将散列算法应用于每个构造的字单元的动作,其中,构造的字单元的散列值形成了散列值的代表性序列(动作230)。例如,散列模块120可以将散列算法应用于每个构造的字单元116。可以根据字单元的接收顺序,将构造的单元的散列值放置在序列中。这样,这些散列值序列表示了文档105的提取的文本。这样,继续上述示例,如果接收到这些字对(“PatentApplication”、“Application A1.”、“A1.This”、“This is”、“is a”、“a patent.”),将它们如下转换为散列值:“Patent Application”将被转换为hash.1,“ApplicationA1.”将被转换为hash.2,以此类推,直到所有的字单元都被转换为散列值。
在一些实施例中,由散列模块120应用的散列算法可以将构造的字单元116转换为固定大小的散列数字序列(例如1024个散列数字)。所述固定大小随不同的使用而改变。在一些情况下,散列数字的序列的大小可基于不同的因素,例如处理能力和总的分配的处理时间而改变。可以根据散列值在散列值的序列中的位置将字构造散列值***到索引矩阵的列中。应该注意,至少在一些情况下,可以将对应于选中文档的散列值序列与矩阵中的其它序列的散列值进行比较,而不需要将选中的文档的散列值实际***到矩阵中。
这样,如在图4中所示,根据散列序列位置标识符422将散列序列421***到索引矩阵425中。位置标识符指示字单元出现在文本中的位置。例如,继续上述示例,被转换为hash.1的“Patent Application”将在行1、列1(即位置426A)处出现,而被转换为hash.2的“Application A1”将在行1、列2处出现,以此类推,直到将散列值的整个序列都***到矩阵中。在一些情况下,索引矩阵425可以是1024列宽和4096行长。这样,在单元426A,示出位置1,1(行1、列1)。相应地,单元426B示出位置1,1024(行1、列1024),而单元426C示出位置4096,1(行4096、列1),并且单元426D示出位置4096,1024(行4096,列1024)。
在一些情况下,根据散列值的实际值(423)将散列序列421***到索引矩阵的行中。这样,可以基于其值,将散列值序列的每个散列值***到矩阵中。如上所述,可以截短散列值以便仅将散列值的一部分存储在索引矩阵中。存储的该部分可以随不同的客户机而变化,并且可以依赖于处理能力和安全性问题而改变。这样,存储在矩阵中的实际部分可以依赖于实现而改变。
转回图2,方法200包括将散列值的序列的每个散列值***到索引矩阵中的动作,其中配置所述矩阵来存储多个不同的散列值序列(动作240)。例如,如上所述,散列值421的序列可以被***到索引矩阵425中,索引矩阵存储了多个不同的散列序列(不同的文档的指纹)。在一些情况下,可以在***到索引矩阵时丢弃该散列值的序列。可以将多个不同的散列值的序列***到索引矩阵。
一旦用不同的文档指纹进行填充,可以查询索引矩阵以确定存储的散列值序列和所述查询所基于的选中的散列值序列有多相似。这样,换句话说,用户可以选择一个将要与多个不同的文档进行比较的文档。查询可以包括将选中的散列值序列(用户希望比较的(即查询所基于的文档)文档)***索引序列中以确定选中的散列值序列的散列值在哪些地方与其它存储的散列值序列的散列值相重叠。当用户选择的文档的散列值与其它存储的文档的散列值重叠时,那些重叠的区域指示匹配。每个重叠的散列指示了具有相同(或非常相似)的字单元的可能性。重叠的散列越多,用户选择的文档与另一文档匹配越高。
这样,选中的散列值序列(用户选择的文档)可以被指示为具有与其它存储的散列值序列的某种程度的相似度,这依赖于有多少选中的散列值序列的散列值与其它存储的散列值序列的散列值相重叠。在一些情况下,可以使用探索来过滤已知与选中的散列值序列的散列值序列不重叠的散列值序列。在这种方式中,已知的不匹配的文档的散列序列(指纹)将不被比较,这样,节省了处理能力。
转回图3,图3说明了用于查询索引矩阵以确定散列序列相似度的方法300的流程图。现在将频繁参照环境100的组件和数据来描述方法300。
方法300包括访问其上存储有多个散列值序列的索引矩阵的动作(动作310),散列值序列表示来自一个或多个文档的字构造。例如,可以访问存储了散列值序列126的索引矩阵125。存储的散列值序列对应于形成不同文档的字构造。可以从所有类型和格式的文档中取得所述字构造,所述文档包括具有嵌入到文档中的或以其它方式被包含在文档中的各种媒体类型的文档。这样,如在此所用的,文档可以包括字处理文档、电子表格文档、演示文档、网页、专有应用生成的文档等等。
方法300包括访问选中的散列值序列的动作(动作320),该选中的散列值序列对应于查询所要基于的选中的文档。例如,用户或其它实体(例如软件应用)可以选择一个查询文档,该查询文档将与其它文档进行比较以确定它与其它文档有多相似。可以由矩阵查询模块130将查询文档131发送给索引矩阵125。
方法300包括用于将选中的散列值序列***到索引矩阵以确定选中的散列值序列的散列值在哪些地方与多个存储的散列值序列的散列值相重叠的可选动作(动作330)。例如,索引矩阵125可以将查询文档的散列值序列***到索引矩阵以确定查询散列值序列的散列值在哪些地方与多个存储的散列值序列126的散列值相重叠。可以根据散列值在散列值的序列中的位置将字构造散列值***到索引矩阵的列中。而且,根据散列值的实际值可以将字构造散列值***到索引矩阵的行中。然而,如上注意的,可以直接查询索引矩阵以确定源文档是否与索引矩阵中的存储的文档中的任意一个相匹配。在这种情况下,文档之间的相似度可以被确定而无需将选中文档的散列值序列***到索引矩阵中。
如上所述,无论在哪里查询序列与矩阵中现有散列值重叠(即一单元共享查询文档在该单元处相同的散列值),那些单元可以被称为匹配,并且可以由一单元递增匹配指示符。匹配的单元越多,则查询文档越近似于该文档。因为散列值的总数已知(即在一些情况下所有的文档被转换成1024x4096尺寸),索引矩阵可以输出以百分比(例如“X%”近似)指示查询文档与存储在矩阵中的每个其它文档有多相似的相似度指示。
方法300包括查询索引矩阵以基于选中的散列值序列中有多少散列值与多个存储的散列值序列的散列值相重叠来确定所述多个散列值序列与选中的散列值序列有多相似(动作340)。例如,矩阵查询模块130可以查询索引矩阵125以基于选中的散列值序列中有多少散列值与多个存储的散列值序列的散列值相重叠来确定所述多个散列值序列126与选中的散列值序列有多相似。这样,查询文档可以被指示为具有与其它存储的散列值序列的某个程度的相似度(可能以百分比形式)。
在一些情况下,为了改进输出,可以同时比较多个散列值。就是说,可以同时将多个源文档和存储的散列值序列进行比较。而且,可以使用探索来过滤已知与选中的散列值序列(或选中的散列值序列组)的散列值序列不重叠的散列值序列。
因此,提供了在索引矩阵中索引和存储散列值的序列的方法、***和计算机程序产品。而且,提供了查询索引矩阵以确定散列序列的相似度的方法、***和计算机程序产品。可以将确定的散列序列的相似度作为与源文档相似的某个百分比来输出。
本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变被权利要求书的范围所涵盖。