TextRadar模糊搜索算法。工件(第2部分)

在以前的出版物中,TextRadar模糊搜索算法。主要方法(第1部分)被认为是主要方法。在解决实际问题时,发现了仅使用基本方法无法提供所需搜索质量的情况。结果,创建了附加组件(算法选项),将对此进行讨论。

搜索字符串的一个单词的片段位于数据字符串的几个单词中


假设搜索字符串为ABCD,数据字符串为ABCE DFG。

图片

应用基本算法将得出以下结果:

图片

发生此类冲突时,将删除多余的组。选择要删除的组是一个单独的复杂问题。结果,应该保留最重要的群体。在上述示例中,答案很明显-应该删除最小的组。

图片

搜索字符串词的起始片段位于数据字符串词内部


考虑在字符串XYZAB中找到字符串ABC的示例。

图片

基本算法将产生以下结果:

图片

通常,这种结果没有实际价值,应将其丢弃。

数据行中单词的覆盖范围不足,并且发现了碎片


如果我们在ABCDEF行中搜索单词ABXYZ,则会

图片

得到:

图片

此结果也没有价值,应该丢弃。

超群


给定搜索字符串ABCXEF和数据字符串ABCEF ABCDEF。

图片

从基本算法的角度来看,数据字符串的两个单词都是等效的,但它们中的第一个具有优先权(如果选择ceteris paribus,则遇到的第一个单词被选中),然后搜索结果如下:

图片

如果我们将超群的概念引入为位于相同对角线上的词组的并集(或移位,请参见上一期出版物,其中讨论了算法的基础),并通过参数为每个组计算的超群大小来增加超群中所包括的群的优先级,并假设如果该组不属于超组,则其超组的大小将等于该组本身的大小-在我们的示例中,我们得到以下结果:

图片

高估长词


在搜索包含长词和短词的短语时,发现的长词片段会“模糊”短词片段。这是由于在计算相关系数时使用了二次函数。

图片

而且,从搜索质量的角度来看,更长的单词并不总是更有意义。

考虑一个例子。假设您需要在由两页组成的文本中找到行ABCDEFG XYZ:

1. ABCDEFG ... QWE

图片

图片

2. ABCDEFO ... XYZ

图片

图片

第一页的组组成系数的分子(分母对结果没有定性影响,请参见上面的公式),第二页的分子为49-36 + 9 =45。也就是说,如果忽略对长度因子结果的影响,则第一页的搜索结果将具有更大的相关性,不能满足期望-在某些情况下,第2页上的搜索结果将更有价值。

解决方案之一是对组的最大长度进行限制。在我们的示例中,例如,如果最大组长度限制为6,则第一页为36,第二页为45,这将提供我们期望的结果-第二页的相关性将高于第一页。

解决搜索短语的单词的重要性在其长度的整体结果中不一致的问题的另一种方法是,将搜索短语的相关性作为独立计算的包含在其中的单词的相关性的平均值来计算。但是,这里出现了相反的问题-需要降低短词的重要性,这可以通过类似的方式解决-通过将阈值设置为与一般相关性形成所涉及的词的长度相同,但已经将其设为最小值。

重复所需片段的重复


从声明中可以看出,任务是在一组片段中搜索最相关的搜索字符串,因此文本中所需片段的重复重复不会影响结果-第一个合适的片段将用作搜索结果,其余片段将在处理期间被丢弃。考虑在字符串ABCD ABCE ABCF ABCG中找到字符串ABC的示例。

图片

应用基本算法将得出以下结果:

图片

从搜索最相关页面的角度来看,这是正确的,但是在形成搜索结果的详细表示时,有必要找到并选择所有合适的片段。为此,您可以在显示的页面上多次重复搜索过程,并顺序关闭先前迭代中找到的片段。在我们的示例中,这将使我们能够找到所需字符串的所有合适的出现。

图片

数据处理速度


即时数据处理对速度有一定要求-搜索时间不会太长。

限制已处理组的最小大小,禁用搜索选项

要提高搜索速度,可以限制已处理组的最小长度。

在实践中,采用以下方法-首先进行“粗略”遍历,限制最小组大小,并禁用整个搜索数据数组的某些选项并标识第一个数据部分(最佳数据部分的大小由要解决的问题的上下文确定),然后进行第二次更彻底的遍历仅绕过此部分的页面,已经不限制组的大小并且包括所有必需的选项。

并行数据处理

提高搜索速度的另一种方法是并行数据处理。结果,对于大型搜索数据库,可以通过增加并行处理的数量来获得可接受的总处理时间,这自然将需要增加设备的容量。

结果


所描述方法的应用使我们能够显着提高搜索质量,减少搜索结果对各种类型错字的依赖-多余,丢失的字符,排列等,更重要的是,无论这些错字位于何处-都在搜索栏本身或文本中,正在搜索。

在网站textradar.ru上部署的演示台上可以看到应用上述方法的结果以小说《 L.N. 托尔斯泰的“战争与和平”可以使用该算法的基本版本和高级版本来比较搜索结果。在此处

图片

下载或观看具有高级功能(C#ASP.NET MVC)的演示项目

All Articles