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