результаты сопоставления sklearn становятся не выровненными, когда наборы данных увеличиваются - PullRequest
1 голос
/ 27 апреля 2020

Я использовал sklearn NearestNeighbors для сопоставления имен, и в определенный момент результаты становятся не выровненными. Мой стандартизированный список имен составляет сотни миллионов. Мой список имен, которые будут сопоставлены, значительно меньше, но все еще может быть в диапазоне от 250 до 500 тысяч. Кажется, что после определенной точки индекс начинает сдвигаться на 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') 

Похоже, что когда мой стандартизированный список превышает 80 тыс., Он начинает сдвигать результаты вниз.

«грязное имя» VITALI, ANGELO (содержит запятую)

VITALI, ANGELO

Стандартизированный список имен может включать эти (без запятой)

VITALI ANGELO   
SENSABLE TECHNOLOGIES INC

После запуска через вышеуказанное соответствие приведенный ниже результат показывает, что VITALI, ANGELO почти идеально подходит для SENSABLE TECNOLOGIES IN C, потому что индекс сместился на одну единицу ... Я думаю.

 0.00   SENSABLE TECHNOLOGIES INC   VITALI, ANGELO

Возможно ли, что размер или количество записей превышает пределы этой матрицы, и это как-то портит индексы?

1 Ответ

1 голос
/ 02 мая 2020

Наборы не гарантируют сохранение порядка в целом. Таким образом, порядок, в котором 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), а затем используйте списки повсюду и посмотрите, работает ли он.

Источник:

Объект set - это неупорядоченная коллекция различных хеш-объектов.

python документы

...