R tm 包余弦相似度

Posted

技术标签:

【中文标题】R tm 包余弦相似度【英文标题】:R tm package cosine similary 【发布时间】:2019-08-06 16:04:14 【问题描述】:

我正在尝试使用 R tm 包来解决字符串比较问题(单字字符串,而不是多字文本)。 我已经使用了 Levenshtein 距离,它可以在这些方面给我一个有意义的结果,但我并不完全满意。 在阅读了一篇我觉得有趣的文章后,我现在正在尝试使用余弦相似度。

我研究了文档,也阅读了一些文章,但在这个时间点上,我想我还没有理解算法的能力。

当我将术语作为单词时,我可以使用它。

例如

docs <- c ("open letters", "closed letters", "letters)
terms <- "open", "closed", "letters")

但我无法要求系统处理每一个字母 c ("a", "b", "c", "d")

这将导致使用术语文档矩阵进行字符串比较。 但也许我的错误已经存在。

在 tm 中实现单个单词字符串比较会是什么?

感谢您的帮助, 附:我没有发布代码,因为这是一个更普遍的问题,但我可以创建一个示例以防万一。

尼古拉

这是根据建议的工作代码:

doc <- c( "closed door", "Open door", "door", "doo", "oor", "house" )
doc_corpus <- Corpus( VectorSource(doc) )
control_list <- list(removePunctuation = TRUE, tolower = TRUE)
tdm <- DocumentTermMatrix(doc_corpus,  control = character_tokenize(doc))
tf <- as.matrix(tdm)

【问题讨论】:

请分享一些示例数据。这也不清楚“但我无法要求系统处理每个字母 c(“a”、“b”、“c”、“d”)”。 你想要做词干? 不清楚你想要什么。余弦相似度通过确定词汇表的相似程度来比较文本。如果您想要更细粒度的东西(如字母),请使用 Levenshtein 距离。这是余弦相似度的一个简单示例:***.com/a/1750187/5028841 在下面的单独评论中我澄清了我的意图 您需要做的是将文本标记为单个字符而不是单词(更标准的标记)。像character_tokenize &lt;- function(x) strsplit(x, split = "") 这样的标记化函数 谢谢,emilliman5 工作得很好。这是最终代码: library(tm) doc 【参考方案1】:

这是我明白我能做到的。 给我一个文档,在我的例子中是字符串的“doc”向量,如果匹配被完全激活(例如关闭 -> 关闭的门),系统将为我提供 TDM 矩阵,其中的术语将为 1,但门与 oor 不匹配。

示例:

library(tm)
doc <- c( "closed door", "Open door", "door", "doo", "oor", "house" )
doc_corpus <- Corpus( VectorSource(doc) )
control_list <- list(removePunctuation = TRUE, tolower = TRUE)
tdm <- TermDocumentMatrix(doc_corpus,  control_list)
tf <- as.matrix(tdm)

关键是我读过我也可以这样做,其中术语是单个字母,我想确认这是否可能

所以要有一个 TDM 来构建然后余弦距离来计算字符串之间的距离。 但我在文档中找不到任何内容。

感谢您的帮助, 尼古拉

【讨论】:

请将此添加到您的原始帖子中,而不是作为答案

以上是关于R tm 包余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章

R中的余弦相似度矩阵

20-余弦相似度及其R实现

余弦相似度计算

余弦相似度

余弦计算相似度理解以及计算

余弦相似度的应用