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 <- 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 包余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章