我在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,行值的例子用逗号分隔如下:我喜欢猫,我是一个狗人,我有三个兔子,我是一个猫人,但我想要一只宠物兔子)
答案 0 :(得分:0)
余弦距离是具有L2归一化的两个矩阵的简单点积。在你的情况下它甚至更简单 - 转换为dtm的L2标准化dtm的乘积。以下是使用Matrix
和text2vec
包的可重现示例:
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