【问题标题】:How to detect the similar text on big data?如何检测大数据上的相似文本?
【发布时间】:2015-11-18 16:05:36
【问题描述】:

据我所知,simhash 和 minhash 可用于此任务。但是所有这些算法都必须遍历整个文本数据库,这将是非常可怕的。 是否有任何优化或其他算法可以加速任务? 我想出的只是将文本数据库分成几个部分并并行获得成对相似度。 我的文本数据库有大约 10 亿条记录。

【问题讨论】:

  • 我使用 mongodb 来存储文本。 mongodb有什么东西可以帮助减少遍历整个数据库的负载,比如预存文本的hashcode,这在我的试用后没有多大帮助。
  • 您必须至少遍历数据库一次才能做任何有用的事情。
  • @Juan Lopes,谢谢,我已将程序迁移到 spark 进行分布式计算,效果很好。
  • 但是所有这些算法都必须遍历整个文本数据库,这将是非常糟糕的。 实际上,使用 minhash 您首先只需与文档的某个部分进行比较,然后就可以了它使用哈希,因此您实际上是与每个文档的部分进行比较,而不是与数据库中所有文档的整个文档进行比较。
  • 对文档中的前 100-2000 个单词进行标记,并将标记编号存储到数据库中。使用令牌,您可以快速计算文档的 simhash,但令牌化还提供了其他不错的工具,例如快速关键字或短语搜索。

标签: text similarity minhash simhash


【解决方案1】:

您必须遍历整个数据库一次(10 亿条记录)。

minhash 和 simhash 的好处是您不必单独比较每个可能的配对来查看它们是否相似(大约 500 万亿个可能配对)。

将数据库分成多个部分并没有帮助;你只会错过一些相似之处。仅当记录自然地分成您知道它们之间没有任何相似性的组时,拆分才有意义(例如,如果您有两种非常不同类型的记录彼此从不相似,则可以将它们分开处理以进行相似性检测) .

simhash 和 minhash 都可以从分布式计算中受益。生成散列可以随心所欲地分发。如果您愿意,可以使用 map/reduce 拆分哈希的存储,但对于 simhash,您可能不需要它,因为它足够紧凑,可以放入相当标准的机器的主内存中。

Simhash 只能找到非常相似的相似对,并且它通常需要进行一些调整才能真正正常工作。如果您想找到更松散的相似性,请使用一种更宽容的 minhash 变体。我建议结合 LSH 查看 superminhash。 Superminhash 可以快速生成哈希,但可能更重要的是它可以实现更好的精度,因此需要存储的哈希更少。 LSH 将散列分组为带,这样您就不会比较单个散列;您一次比较整个乐队。这两种技术都意味着需要更少的查询来找到单独的共享哈希(或带,在后一种情况下),特别是 LSH 意味着需要为每个单独的查询处理更少的结果。这应该会给您带来显着的加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多