我正在尝试使用名称相似性对大量公司(40M+)进行重复数据删除。我有 500K 的公司名称对标记为相同/不同(如 IBM=International Business Machines)。通过对名称对的向量差异进行逻辑回归建立的模型具有很高的 f 值(0.98),但推理(找到最相似的名称)太慢(每个名称几乎 2 秒)。
是否可以使用名称相似性对(正负)来训练 doc2vec 模型,从而导致相似的名称具有相似的向量,以便我可以使用像 Annoy 这样的快速向量相似性算法?
我正在尝试使用名称相似性对大量公司(40M+)进行重复数据删除。我有 500K 的公司名称对标记为相同/不同(如 IBM=International Business Machines)。通过对名称对的向量差异进行逻辑回归建立的模型具有很高的 f 值(0.98),但推理(找到最相似的名称)太慢(每个名称几乎 2 秒)。
是否可以使用名称相似性对(正负)来训练 doc2vec 模型,从而导致相似的名称具有相似的向量,以便我可以使用像 Annoy 这样的快速向量相似性算法?
在高维空间中搜索前 N 个最近邻是很困难的。要获得完全准确的 top-N 通常需要进行详尽的搜索,这可能是您的表现令人失望的原因。
当可以应用一些索引时,就像 ANNOY 库一样,需要一些额外的索引时间和索引存储,并且会牺牲准确性,因为可能会丢失一些真正的 top-N 邻居。
你还没有提到你现有的向量是如何创建的。您不需要采用新的矢量创建方法(如 doc2vec)来使用索引;您可以将索引库应用于现有向量。
如果您现有的向量是稀疏的(例如,如果它们是大袋字符 n-gram 表示,具有许多维度但大多数为 0.0),您可能需要查看 Facebook 的PySparNN库。
如果他们很密集,除了你提到的 ANNOY 之外,还可以考虑Facebook FAISS 。
而且,即使是穷举搜索邻居也是高度可并行化的:将数据拆分为 M 个不同系统上的 M 个分片,并且在每个分片上找到前 N 个通常接近全盘相同操作时间的 1/N index,然后相对快速地合并 M 个 top-N 列表。因此,如果找到最相似的是您的关键瓶颈,并且您需要在 100 毫秒内找到最相似的前 N 个,那么将 20 台机器扔到 20 个问题的分片上。
(同样的,top-N 的结果可能值得批量计算。如果你使用云资源,租用 500 台机器进行 4000 万次 2 秒的操作,两天之内就可以完成。)