当数据集增加时,sklearn 匹配结果变得不对齐
sklearn matching results become misaligned when the data sets increase
我一直在使用 sklearn NearestNeighbors 进行名称匹配,但在某个时候结果变得不对齐。我的标准化名单是数以亿计的。我要匹配的名字列表要小得多,但仍可能在 250k 到 500k 之间。在某个点之后,指数似乎开始移动 1 或更多。
nbrs = NearestNeighbors(n_neighbors=1, n_jobs=-1).fit(tfidf)
unique_org = set(names['VariationName'].values) # set used for increased performance
#matching query:
def getNearestN(query):
queryTFIDF_ = vectorizer.transform(query)
distances, indices = nbrs.kneighbors(queryTFIDF_)
return distances, indices
print('Getting nearest n...')
distances, indices = getNearestN(unique_org)
unique_org = list(unique_org) #need to convert back to a list
print('Finding matches...')
matches = []
for i,j in enumerate(indices):
temp = [round(distances[i][0],2), clean_org_names.values[j][0][0],unique_org[i]]
matches.append(temp)
print('Building data frame...')
matches = pd.DataFrame(matches, columns=['Match confidence (lower is better)','Matched name','Original name'])
print('Data frame built')
似乎一旦我的标准化列表超过 80k,结果就会开始向下移动。
VITALI、ANGELO的"messy name"(有逗号)
VITALI, ANGELO
标准名称列表可能包括这些(无逗号)
VITALI ANGELO
SENSABLE TECHNOLOGIES INC
经过运行通过上面的匹配,下面的结果显示VITALI, ANGELO是SENSABLE TECNOLOGIES INC近乎完美的匹配,因为指数向下移动了一个...我认为。
0.00 SENSABLE TECHNOLOGIES INC VITALI, ANGELO
是否有可能是记录的大小或数量超过了该矩阵限制并且不知何故弄乱了索引?
集合通常不能保证顺序不变。因此 getNearestN
遍历 unique_org
的顺序可能与 list
构造函数执行的顺序不同:
distances, indices = getNearestN(unique_org) # computed distances with respect to an unordered set
unique_org = list(unique_org) # `unique_org` was potentially shuffled here
改为尝试使用列表,看看是否可行。如果列表慢很多,我怀疑罪魁祸首是重复的名称,而不是更适合这项工作的集合。您可以在 pandas (names['VariationName'].unique()
) 或原版 python (list(set(names['VariationName']))
).
中处理重复项
总而言之,我会确保我没有重复项(可能使用 pandas),然后在整个过程中使用列表并查看它是否有效。
来源:
A set object is an unordered collection of distinct hashable objects.
我一直在使用 sklearn NearestNeighbors 进行名称匹配,但在某个时候结果变得不对齐。我的标准化名单是数以亿计的。我要匹配的名字列表要小得多,但仍可能在 250k 到 500k 之间。在某个点之后,指数似乎开始移动 1 或更多。
nbrs = NearestNeighbors(n_neighbors=1, n_jobs=-1).fit(tfidf)
unique_org = set(names['VariationName'].values) # set used for increased performance
#matching query:
def getNearestN(query):
queryTFIDF_ = vectorizer.transform(query)
distances, indices = nbrs.kneighbors(queryTFIDF_)
return distances, indices
print('Getting nearest n...')
distances, indices = getNearestN(unique_org)
unique_org = list(unique_org) #need to convert back to a list
print('Finding matches...')
matches = []
for i,j in enumerate(indices):
temp = [round(distances[i][0],2), clean_org_names.values[j][0][0],unique_org[i]]
matches.append(temp)
print('Building data frame...')
matches = pd.DataFrame(matches, columns=['Match confidence (lower is better)','Matched name','Original name'])
print('Data frame built')
似乎一旦我的标准化列表超过 80k,结果就会开始向下移动。
VITALI、ANGELO的"messy name"(有逗号)
VITALI, ANGELO
标准名称列表可能包括这些(无逗号)
VITALI ANGELO
SENSABLE TECHNOLOGIES INC
经过运行通过上面的匹配,下面的结果显示VITALI, ANGELO是SENSABLE TECNOLOGIES INC近乎完美的匹配,因为指数向下移动了一个...我认为。
0.00 SENSABLE TECHNOLOGIES INC VITALI, ANGELO
是否有可能是记录的大小或数量超过了该矩阵限制并且不知何故弄乱了索引?
集合通常不能保证顺序不变。因此 getNearestN
遍历 unique_org
的顺序可能与 list
构造函数执行的顺序不同:
distances, indices = getNearestN(unique_org) # computed distances with respect to an unordered set
unique_org = list(unique_org) # `unique_org` was potentially shuffled here
改为尝试使用列表,看看是否可行。如果列表慢很多,我怀疑罪魁祸首是重复的名称,而不是更适合这项工作的集合。您可以在 pandas (names['VariationName'].unique()
) 或原版 python (list(set(names['VariationName']))
).
总而言之,我会确保我没有重复项(可能使用 pandas),然后在整个过程中使用列表并查看它是否有效。
来源:
A set object is an unordered collection of distinct hashable objects.