R中距离矩阵计算时间过长

时间:2016-08-06 02:24:06

标签: r text-mining

我在R中有一个术语文档矩阵(tdm)(从大约16,000个文本的语料库中创建),我正在尝试创建一个距离矩阵,但它没有加载,我不知道它应该多长时间拿(它已经超过20分钟)。我还尝试使用文档术语矩阵格式创建距离矩阵,但它仍然无法加载。我能做些什么来加快这个过程。对于tdm,行是文本文档,列是可能的单词,因此矩阵单元格中的条目是每个文档的每个给定单词的计数。 这就是我的代码:

library(tm)
library(slam)
library(dplyr)
library(XLConnect)
wb <- loadWorkbook("Descriptions.xlsx")
df <- readWorksheet(wb, sheet=1) 
docs <- Corpus(VectorSource(df$Long_Descriptions))
docs <- tm_map(docs, removePunctuation) %>%
  tm_map(removeNumbers) %>%
  tm_map(content_transformer(tolower), lazy = TRUE) %>%
  tm_map(removeWords, stopwords("english"), lazy = TRUE) %>%
  tm_map(stemDocument, language = c("english"), lazy = TRUE) 
dtm <- DocumentTermMatrix(docs)
tdm <- TermDocumentMatrix(docs, control = list(removePunctuation = TRUE, stopwords = TRUE))
z<-as.matrix(dist(t(tdm), method = "cosine"))

(我知道我的代码应该是可重现的,但我不知道如何分享我的数据.excel文档有一列授权Long_Descriptions,行值的例子用逗号分隔如下:我喜欢猫,我是一个狗人,我有三个兔子,我是一个猫人,但我想要一只宠物兔子)

1 个答案:

答案 0 :(得分:0)

余弦距离是具有L2归一化的两个矩阵的简单点积。在你的情况下它甚至更简单 - 转换为dtm的L2标准化dtm的乘积。以下是使用Matrixtext2vec包的可重现示例:

library(text2vec)
library(Matrix)

cosine <- function(m) {
  m_normalized <- m / sqrt(rowSums(m ^ 2))
  tcrossprod(m_normalized)
}

data("movie_review")
data = rep(movie_review$review, 3)
it = itoken(data, tolower, word_tokenizer)
v = create_vocabulary(it) %>% 
  prune_vocabulary(term_count_min = 5)
vectorizer = vocab_vectorizer(v)
it = itoken(data, tolower, word_tokenizer)
dtm = create_dtm(it, vectorizer)
dim(dtm)
# 15000 24548

system.time( dtm_cos <- cosine(dtm) )
# user  system elapsed 
# 41.914   6.963  50.761 
dim(dtm)
# 15000 15000

编辑: 对于tm包,请参阅此问题:R: Calculate cosine distance from a term-document matrix with tm and proxy