Как явно построить разреженную матрицу строк, чтобы избежать нехватки памяти? - PullRequest
1 голос
/ 23 июня 2019

Соответствует большому количеству слегка изменяющихся названий ресторанов в векторе «данных» соответствующему вектору «совпадений»:

Функция stringdistmatrix в пакете stringdist великолепна, но не хватает памяти для нескольких 10k x 10k, и мои данные больше.

Попытка as(stringdistmatrix(data, match),'sparseMatrix') даст ожидаемый результат, но не хватает памяти. Следовательно, я хотел бы явно индексировать пары, используя sparseMatrix(i,j,x,dims,dimnames) с x, рассчитанным по adist() или подобным расстоянием строки, в надежде, что оно уместится в памяти.

R

data <- c("McDonalds", "MacDonalds", "Mc Donald's", "Wendy's", "Wendys", "Wendy", 
          "Chipotle", "Chipotle's")

match <- c("McDonalds", "Wendys", "Chipotle")

Попытка:

library(Matrix)
library(stringdist)

idx <- expand.grid(a=data,b=match)
idx$row <- match(idx$a,idx$b)
idx$col <- match(idx$b,idx$a)

library(Matrix)
sparseMatrix(i=idx$row, 
             j=idx$col,
             x=ifthen(adist(data,match)<2,1,0),
             dims=c(7,3),
             dimnames = list(data, match))

Надеялись на совпадение вывода:

library(stringdist)
as(ifelse(stringdistmatrix(data,match)<2,1,0),'sparseMatrix')

1 Ответ

0 голосов
/ 26 июля 2019

Если я правильно понимаю ваш вопрос, ваша задача - сопоставить грязные строки с чистыми.Вам не нужна вся матрица для этого (и она действительно не будет редкой).Вместо этого вы можете использовать amatch.

library(stringdist)
data <- c("McDonalds", "MacDonalds", "Mc Donald's", "Wendy's", "Wendys", "Wendy", 
          "Chipotle", "Chipotle's")
match <- c("McDonalds", "Wendys", "Chipotle")
i <- amatch(data, match, method="osa",maxDist=2)
data.frame(data=data, matched_data = match[i], stringsAsFactors = FALSE)

         data matched_data
1   McDonalds    McDonalds
2  MacDonalds    McDonalds
3 Mc Donald's    McDonalds
4     Wendy's       Wendys
5      Wendys       Wendys
6       Wendy       Wendys
7    Chipotle     Chipotle
8  Chipotle's     Chipotle
...