2017-08-13 141 views
0

我想重复使用名称相似度的公司(40M +)的巨大列表。我有一个500K的公司名称对被标记为相同/不相同(如I.B.M. =国际商用机器)。通过对名称对的向量差异进行逻辑回归建立的模型具有很好的f-分数(0.98),但推论(找到最相似的名字)太慢(每名称差不多2秒)。培训doc2vec公司名称相似度

是否可以使用名称相似性对(正值和负值)来训练doc2vec模型,从而导致类似名称具有相似的向量,以便我可以使用像Annoy这样的快速向量相似度算法?

回答

2

在高维空间中搜索前N个最近邻居是困难的。要获得完美精确的top-N,通常需要进行彻底搜索,这可能是您令人失望的性能原因。

当可以应用某些索引时,与ANNOY库一样,需要一些额外的索引时间和索引存储,并且会牺牲准确性,因为可能会错过某些真正的前N邻居。

你还没有提到你的现有载体是如何创建的。您不需要采用新的矢量创建方法(如doc2vec)来使用索引;您可以将索引库应用于现有的矢量。

如果你现有的向量是稀疏的(例如,如果他们是大包字符n克表示,有许多维度但最多为0.0),你可能想看看Facebook的PySparNN库。

如果它们很密集,除了你提到的ANNOY之外,可以考虑Facebook FAISS

而且,即使是穷举的搜索邻居也是高度可并行化的:在M个不同的系统上将数据分割成M个分片,并且每个分支上的最高N往往接近同一时间的1/N在整个索引上进行操作,然后合并M个前N个列表相对较快。因此,如果发现最相似的是你的关键瓶颈,并且你需要100毫秒内最相似的N,那么在20个问题的分片上扔20台机器。 (同样,所有前N项结果都可能值得批量计算,如果你使用云资源,租500台机器做4000万次2秒的操作,你将在两个以内完成天。)

+0

Gojomo,谢谢你的努力。是的,我确实有一个很稀少的n-gram表示(40434120,487654)。最慢的部分是从语料库矩阵(csr_matrix)中减去查询向量以准备逻辑回归。这就是为什么我正在寻找一些能够使ANN搜索获得最佳n结果的矢量表示(然后我可以进行精确搜索) –