У меня несколько странный вопрос о векторизации вычислений в python, с которым я не очень силен.
Я решаю задачу нормализации слов. У меня есть список компаний, названия которых я хочу сократить путем стандартизации. В качестве одного из шагов я хочу найти сходство между всеми названиями компаний в списке и построить матрицу сходства, которую затем могу использовать для кластеризации имен.
Я разработал специальную функцию, которая вычисляет сходство между двумя слова так, как я хочу, и я помещаю их в массив numpy. Он работает нормально, но поскольку я явно перебираю каждую пару слов, эта функция очень плохо масштабируется и становится очень медленной, когда у меня есть даже всего 20К слов в нормализируемом списке. Я хотел понять, есть ли хороший способ как-то использовать (возможно) numpy и ускорить процесс за счет распараллеливания или чего-то подобного? Мы будем очень благодарны за любые советы.
Ниже представлена функция, которую я разработал:
def fuzz_similarity(company_names):
print("similarity array creation started")
#make placeholder for similarity array
similarity_array = np.ones((len(company_names), (len(company_names))))*100
print("similarity array ready")
#iterate over each company
for i in tqdm(range(1, len(company_names))):
#iterate over all names before current in list
for j in range(i):
#get similarity measure and record it
s1 = fuzz.token_set_ratio(company_names[i],company_names[j])+0.00000000001
s2 = fuzz.partial_ratio(company_names[i],company_names[j])+0.00000000001
similarity_array[i][j] = 2*s1*s2/(s1+s2)
print("\nDone with first aray calculation, refreshing diagonal elements")
for i in tqdm(range(len(company_names))):
for j in range(i+1, len(company_names)):
similarity_array[i][j] = similarity_array[j][i]
np.fill_diagonal(similarity_array,100)
print("similarity done")
return similarity_array