Матрица расстояний между строками с использованием Python, занимающая огромное время вместо R - PullRequest
0 голосов
/ 14 июля 2020

Я хочу сгенерировать матрицу расстояний между строками, используя python, как показано ниже.

          str1    str2    str3    str4    ...     str4k
  str1    0.8     0.4     0.6     0.1     ...     0.2
  str2    0.4     0.7     0.5     0.1     ...     0.1
  str3    0.6     0.5     0.6     0.1     ...     0.1
  str4    0.1     0.1     0.1     0.5     ...     0.6
  .       .       .       .       .       ...     .
  .       .       .       .       .       ...     .
  .       .       .       .       .       ...     .
  str20k    0.2     0.1     0.1     0.6     ...     0.7

У меня есть 2 файла CSV, файл crnt2 имеет 4K строк, а файл hist2 имеет 20K строк, и я использую приведенный ниже код для создания матрицы.

import textdistance
import numpy as np
import csv

def read_csv_data(fileName):
    rdr = None
    lst_temp=[]
    with open(fileName,"r") as f:
        rdr = csv.reader(f)
        for r in rdr:
            lst_temp.append(r)

    return lst_temp

c = read_csv_data("crnt2.csv")
h = read_csv_data("hist2.csv")

m = np.zeros((len(h),len(c)), dtype=int)

for i in range(0,len(h)):
    for j in  range(0,len(c)):
        m[i][j] = textdistance.levenshtein.distance(h[i][0],c[j][0])
        
np.savetxt("output.csv",m,delimiter=",")

Когда я запускаю свой код python, для его обработки требуется около 30 секунд row и 166 часов для получения полного вывода.

И когда я использую R в том же наборе данных uring stringdistmatrix , тогда это вряд ли займет от 2 до 3 минут для получения того же результата.

> a <- read.csv("crnt2.csv")
> b <- read.csv("hist2.csv")
> c <- stringdistmatrix(a$column1,b$column1, method = c("jw"))
> write.csv(c,file = "output.csv")

Уловка в том, что мне придется использовать решение Python только для этого, не могу использовать R, поэтому, пожалуйста подскажите, как мне сократить время, используя Python.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...