2016-08-16 9 views
-2

У меня есть матрица dfm 10025x1417 TFIDF, созданная с помощью quanteda. (Фактический класс - это dfmSparse, который является подклассом dfm-matrix). Когда я конвертирую в h2o с as.data.frame, а затем as.h2o, я неправильно получаю 1002 x1417, с нежелательной дополнительной первой строкой NaNs. По соображениям производительности я не хочу создавать временную df с полной плотной матрицей.Преобразование квантовой матрицы dfmSparse-> data.frame-> h2o добавляет нежелательную начальную строку NaN

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

library(quanteda) 
mat <- quanteda::weight(theDfm, type="tfidf") 

# Convert to df then h2o, correctly gives 10025x1417 matrix 
mat_df <- as.data.frame(mat) # this will dispatch quanteda::as.data.frame for dfmSparse 
mat_h2o <- as.h2o(mat_df) 

# Convert in one go, get 10026x1417, get unwanted extra first row of NaNs 
bad_h2o <- as.h2o(as.data.frame(mat)) 
dim(bad_h2o) 
[1] 10026 1417 

# Which as.data.frame method this uses 
> showMethods(quanteda::as.data.frame) 
Function: as.data.frame (package base) 
x="ANY" 
x="dfm" 
x="dfmSparse" 
    (inherited from: x="dfm") 
x="matrix" 
    (inherited from: x="ANY") 

######################################### 
# Ken Benoit requested sessionInfo() 

R version 3.2.3 (2015-12-10) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] h2o_3.8.3.3   statmod_1.4.22  quanteda_0.9.8  RevoUtilsMath_3.2.3 

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.2  lattice_0.20-33 SnowballC_0.5.1 bitops_1.0-6  chron_2.3-47  grid_3.2.3  R6_2.1.1   
[8] jsonlite_0.9.19 magrittr_1.5  httr_1.0.0  stringi_1.0-1 data.table_1.9.6 ca_0.58   Matrix_1.2-3  
[15] tools_3.2.3  stringr_1.0.0 RCurl_1.95-4.7 parallel_3.2.3 
+1

'sessionInfo()'? И выполняется ли преобразование в data.frame, прежде чем применять функцию 'weight()'? Кроме того, если вы хотите указать проблему со ссылкой на данные, чтобы я мог ее воспроизвести, я должен был бы исправлять довольно быстро. –

+0

@KenBenoit sessionInfo добавлен. Он также дает ненужную дополнительную строку NaN до того, как я применил 'weight()', то есть только на необработанном dfm. Я не смог создать воспроизводимые данные, но вы тоже должны это увидеть, если попробуете какие-то нетривиальные данные. – smci

+0

Я попытался, но не смог воспроизвести его. Mat_df выглядит хорошо для меня, возможно, ошибка в 'as.h20()'? –

ответ

3

Из соображений производительности я не хочу, чтобы создать временный ДФ с полной плотной матрицей.

В самом деле, quanteda будет конвертировать разреженную матрицу густая перед преобразованием его data.frame: https://github.com/kbenoit/quanteda/blob/master/R/dfm-classes.R#L513-L516

Если вам необходимо импортировать разреженную матрицу h2o, преобразовать его в формат svmlight и использовать importFile. См. Эту тему: How to use H2o on feature hashed matrix in R

+1

Это правильно, но это не поведение ** quanteda **, а тот факт, что любой data.frame является плотным. Это хорошее решение, чтобы избежать принуждения к плотному объекту. –

+0

Я согласен с тобой, нет смысла конвертировать разреженную матрицу в плотный data.frame. Просто указал. Мы можем преобразовать разреженную матрицу в триплетной форме в data.frame, но это уже другая история. –