Используйте настраиваемую функцию подобия, чтобы быстро вычислить сходство набора слов друг с другом - PullRequest
0 голосов
/ 17 июня 2020

У меня несколько странный вопрос о векторизации вычислений в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...