Algorithm 使用bloom筛选器查找文档中出现单词的可能性

Algorithm 使用bloom筛选器查找文档中出现单词的可能性,algorithm,data-structures,bloom-filter,Algorithm,Data Structures,Bloom Filter,我有一个单词列表,比如-list1=[boy,apple,mango,car],我有两个文档,内容如下: document1= The boy driving a car ate apple and mango. document2= The boy ate an apple. 我只需要找出文档中是否存在给定的单词列表 为了检查list1中的单词是否存在于文档中,我可以为list1创建一个BloomFilter(比如bloomlist1)和为document1创建一个BloomFilter(比

我有一个单词列表,比如-list1=[boy,apple,mango,car],我有两个文档,内容如下:

document1= The boy driving a car ate apple and mango.
document2= The boy ate an apple.
我只需要找出文档中是否存在给定的单词列表

为了检查list1中的单词是否存在于文档中,我可以为list1创建一个BloomFilter(比如bloomlist1)和为document1创建一个BloomFilter(比如bloomdocument1)。然后我可以执行逐位和运算,并检查结果是否与bloomlist1相同。如果相同,我可以说列表1中的所有单词都存在于文档1中。因此,它将返回真值

如果我对document2执行相同的方法,即按位求和,那么结果将为False。但是我需要得到真实的结果,即使列表中的一个单词包含在文档中


这是否可能与布鲁姆过滤器或我需要任何其他数据结构。如果没有,满足这两个标准的最佳数据结构是什么

检查列表中的任何单词是否存在于文档中:

  • 创建一个bloom过滤器
  • 将列表中的所有单词插入其中
  • 然后检查文档中的每个单词是否包含在bloom筛选器中。一旦你找到一个,你就可以返回true。如果找不到,则返回false

布卢姆过滤器当然有可能出现误报——即使单词不存在,它也可能返回true。为了避免这种情况,您可以使用哈希表(与上述方式相同)-这将占用更多的内存。

要检查列表中的任何单词是否存在于文档中,请执行以下操作:

  • 创建一个bloom过滤器
  • 将列表中的所有单词插入其中
  • 然后检查文档中的每个单词是否包含在bloom筛选器中。一旦你找到一个,你就可以返回true。如果找不到,则返回false

布卢姆过滤器当然有可能出现误报——即使单词不存在,它也可能返回true。为了避免这种情况,您可以使用哈希表(与上面描述的方式相同)-这将占用更多的内存。

如果您要在数百万文档中搜索一组已知单词的出现情况,则Bloom筛选器不是最佳选择。最后,您将为每个文档中的每个单词向Bloom筛选器中插入,并且对于每个文档,您必须检查每个单词的Bloom筛选器,以确定它是否存在于文档中

如果您只需要知道文档中是否存在任何一个单词,那么您可以为要检查的单词建立一个哈希表,并测试文档中的每个单词。例如:

hashTable = {"boy", "mango", "car", "apple"}
for each document
{
    found = false
    for each word in document
    {
        if word in hash table
        {
            found = true
            break  // found a word. Skip the rest of the document.
        }
        if found then output success else output failure
    }
}
这将优于布卢姆过滤器方法,原因如下:

  • 哈希表查找通常比在Bloom筛选器中设置多个位要快
  • 使用哈希表,如果发现文档中包含一个单词,则可以跳过大部分文档
  • 您只需初始化哈希表一次。您必须清除每个文档的Bloom筛选器
  • 所需Bloom过滤器的大小取决于文档中唯一单词的数量。如果您的Bloom过滤器太小,则误报率可能过高

如果您要在数百万文档中搜索已知单词集的出现情况,那么Bloom过滤器不是最佳选择。最后,您将为每个文档中的每个单词向Bloom筛选器中插入,并且对于每个文档,您必须检查每个单词的Bloom筛选器,以确定它是否存在于文档中

如果您只需要知道文档中是否存在任何一个单词,那么您可以为要检查的单词建立一个哈希表,并测试文档中的每个单词。例如:

hashTable = {"boy", "mango", "car", "apple"}
for each document
{
    found = false
    for each word in document
    {
        if word in hash table
        {
            found = true
            break  // found a word. Skip the rest of the document.
        }
        if found then output success else output failure
    }
}
这将优于布卢姆过滤器方法,原因如下:

  • 哈希表查找通常比在Bloom筛选器中设置多个位要快
  • 使用哈希表,如果发现文档中包含一个单词,则可以跳过大部分文档
  • 您只需初始化哈希表一次。您必须清除每个文档的Bloom筛选器
  • 所需Bloom过滤器的大小取决于文档中唯一单词的数量。如果您的Bloom过滤器太小,则误报率可能过高

    • 我认为您使用布卢姆过滤器不合适

      您声明需要使用两个筛选器 一个用于单词列表,另一个用于正在搜索的文档。那你呢 按位和过滤器。如果结果与原始单词列表相同,则过滤 文档被接受,否则您将拒绝它

      如果这是对流程的正确理解,那么很明显文档只能通过 如果它包含列表中的所有单词(或通过哈希冲突),则会添加一些额外的位 在文档Bloom筛选器中设置,这可能导致其被接受(可能导致误报)

      如果要在列表中的一个单词匹配后立即选择文档,则只需为单词列表设置一个Bloom过滤器(对于正在测试的文档,无过滤器)。使用bloomfilter散列函数逐个散列文档中的每个单词。一旦得到的哈希值与单词列表Bloom筛选器中的所有对应位匹配,就接受文档(这是一个命中)。然后,您需要验证命中未到期 假阳性

      布卢姆过滤器的“美”在于它不会遭受假阴性。也就是说,如果 您文档中的单词在Bloom filter中有一个“命中率”,您可以100%确定 文档中的单词出现在关联单词列表中

      您面临的一个问题是Bloom过滤器容易出错 肯定的。假阳性是指存在h