У меня есть следующий код:
import pandas as pd
import os
import jellyfish
import numpy as np
a = {'c' : ['dog', 'cat', 'tree','slow','fast','hurry','hello', 'world', 'germany', 'france','rahul', 'india',
'pakisthan', 'bangla', 'australia','newzealand', 'united kingdom', 'france','spain', 'belgium',
'bangladesh', 'west indies','USA','canada','afghanisthan','columbia','tamilnadu','telangana','hyderabad',
'khanapur', 'warangal']}
df = pd.DataFrame(a)
У меня есть следующий код в структуре класса:
class Distance:
def __init__(self, partitions):
self.partitions = partitions
def partitionlist(self, list_ofelements, num_of_divisions):
for i in range(0, list_ofelements.size, num_of_divisions):
yield list_ofelements[i:i + num_of_divisions]
def fuzzy_match(self, terms):
if len(terms) == 1:
return 1
return jellyfish.jaro_winkler((*terms))
def distance_measure(self, x, y):
term1 = np.repeat(x,len(y))
term2 = np.tile(y,(len(x),1)).flatten()
terms = list(zip(term1,term2))
resu = [self.fuzzy_match(frozenset(t)) for t in terms]
final_ = np.reshape(resu, (len(x),len(y)))
return np.around(final_.astype('float16'),2)
def dist_calculation(self, list_of_companies):
for index,item in enumerate(list_of_companies):
for i in range(len(list_of_companies)):
files = os.listdir()
filename = 'result_for_partition' + str(index) + str('_') + str(i) + '.npy'
if not filename in files:
if index <= i:
print('for partition: ' + str(index) + str('_') + str(i))
partition_result = self.distance_measure(list_of_companies[index],list_of_companies[i])
np.save(filename, partition_result)
return self
def read_distances(self, list_of_companies):
files = os.listdir()
fullfilename = 'jaro_distance' + '.npy'
if not fullfilename in files:
arr = None
for index,item in enumerate(list_of_companies):
row = None
for i in range(len(list_of_companies)):
if i == 0 and index <= i:
filename = 'result_for_partition' + str(index)+ str('_') + str(i) + str('.npy')
row = np.load(filename)
#print(row)
elif index <= i:
#print('elif')
print(index,i)
filename = 'result_for_partition' + str(index) + str('_') + str(i) + str('.npy')
block = np.load(filename)
row = np.hstack((row,block))
#print(row)
elif i==0 and index > i:
print(index,i)
filename = 'result_for_partition' + str(i) + str('_') + str(index) + str('.npy')
row = np.load(filename).T
#print(row)
else:
print(index,i)
filename = 'result_for_partition' + str(i) + str('_') + str(index) + str('.npy')
block = np.load(filename).T
row = np.hstack((row,block))
#print(row)
if index > 0:
row = np.concatenate((previous_rows, row), axis =0)
print(row.shape)
previous_rows = row
if index == len(list_of_companies)-1:
matrix = row
np.save(fullfilename, matrix)
print("saved in:")
print(fullfilename)
distances = 1 - np.load(fullfilename)
else:
distances = 1 - np.load(fullfilename)
return distances
def dist_matrix(self, dataset):
company_names = dataset['c'].unique()
print('length of unique company name:',company_names.size)
elements_list = list(self.partitionlist(company_names, self.partitions))
print(elements_list)
self.dist_calculation(elements_list)
distance_mat = self.read_distances(elements_list)
return distance_mat
obj = Distance(partitions = 6)
matrix = obj.dist_matrix(dataset = df)
На самом деле я пытаюсь определить сходство между текстами.Здесь я использовал набор игрушечных данных, но в моем случае у меня есть огромные текстовые данные, где я должен найти сходство.Я не смог уместить все данные в ОЗУ и решил разделить данные и построить матрицу расстояний.Но это заняло слишком много времени, и мы хотели запустить его быстрее, используя многопроцессорность.Я пробовал несколько методов, но я захожу в тупиковую ситуацию.Кроме того, я нашел библиотеку лучей, но не смог интегрировать ее в этот код (пытался, но не смог сократить время).Есть ли способ оптимизировать его с точки зрения обработки.