R - преобразовать DFM в LSA, а затем вычислить косинусное сходство: ошибка наследует (x, "Matrix") не TRUE - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть матрица особенностей документа (DFM): я хочу преобразовать ее в объект LSA и, наконец, вычислить косинусное сходство между каждым документом.

- это отрывки, за которыми я следовал

lsa_t2 <- convert(DFM_tfidf, to = "lsa" , omit_empty = TRUE)
t2_lsa_tfidf_cos_sim = sim2(x = lsa_t2, method = "cosine", norm = "l2")

но я получаю эту ошибку:

Ошибка в sim2 (x = lsa_t2, method = "cosine", norm = "l2"):
наследует (x, "matrix ") || наследует (x, "Matrix") не TRUE

, чтобы дать больше контекста, вот как выглядит las_t2

How lsa_t2 looks like

любой из документов содержит текст (я уже проверял это), и я отфильтровал документы без текста, прежде чем очистил dfm.

Есть идеи, что случилось?

1 Ответ

1 голос
/ 18 февраля 2020

Полученная ошибка в основном означает, что функция sim2 не работает с объектом lsa. Тем не менее, я не совсем уверен, что понимаю вопрос. Почему вы хотите преобразовать текстовый матричный формат dfm в lsa?

Если вы хотите вычислить косинусное сходство между текстами, вы можете сделать это непосредственно в quenteda

library(quanteda)

texts <- c(d1 = "Shipment of gold damaged in a fire",
           d2 = "Delivery of silver arrived in a silver truck",
           d3 = "Shipment of gold arrived in a truck" )

texts_dfm <- dfm(texts)

textstat_simil(texts_dfm, 
               margin = "documents",
               method = "cosine")
#> textstat_simil object; method = "cosine"
#>       d1    d2    d3
#> d1 1.000 0.359 0.714
#> d2 0.359 1.000 0.598
#> d3 0.714 0.598 1.000

Если вы хотите использовать sim2 из text2vec, вы можете сделать это, используя один и тот же объект без предварительного преобразования:

library(text2vec)
sim2(x = texts_dfm, method = "cosine", norm = "l2")
#> 3 x 3 sparse Matrix of class "dsCMatrix"
#>           d1        d2        d3
#> d1 1.0000000 0.3585686 0.7142857
#> d2 0.3585686 1.0000000 0.5976143
#> d3 0.7142857 0.5976143 1.0000000

Как видите, результаты одинаковы .

Обновление

Что касается комментариев, теперь я понимаю, что вы хотите применить преобразование ваших данных с помощью анализа скрытой семантики c. Вы можете следовать учебному руководству, указанному ниже, и подключить dfm вместо dtm, который используется в учебном пособии:

texts_dfm_tfidf <- dfm_tfidf(texts_dfm)


library(text2vec)
lsa = LSA$new(n_topics = 2)
dtm_tfidf_lsa = fit_transform(texts_dfm_tfidf, lsa) # I get a warning here, probably due to the size of the toy dfm
d1_d2_tfidf_cos_sim = sim2(x = dtm_tfidf_lsa, method = "cosine", norm = "l2")
d1_d2_tfidf_cos_sim
#>              d1           d2        d3           d4
#> d1  1.000000000 -0.002533794 0.5452992  0.999996189
#> d2 -0.002533794  1.000000000 0.8368571 -0.005294431
#> d3  0.545299245  0.836857086 1.0000000  0.542983071
#> d4  0.999996189 -0.005294431 0.5429831  1.000000000

Обратите внимание, что эти результаты отличаются от запуска к запуску, если вы не используете set.seed().

Или, если вы хотите сделать все в quanteda:

texts_lsa <- textmodel_lsa(texts_dfm_tfidf, 2)

textstat_simil(as.dfm(texts_lsa$docs), 
               margin = "documents",
               method = "cosine")
#> textstat_simil object; method = "cosine"
#>          d1       d2    d3       d4
#> d1  1.00000 -0.00684 0.648  1.00000
#> d2 -0.00684  1.00000 0.757 -0.00894
#> d3  0.64799  0.75720 1.000  0.64638
#> d4  1.00000 -0.00894 0.646  1.00000
...