【发布时间】: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 距离。这是余弦相似度的一个简单示例:stackoverflow.com/a/1750187/5028841
-
在下面的单独评论中我澄清了我的意图
-
您需要做的是将文本标记为单个字符而不是单词(更标准的标记)。像
character_tokenize <- function(x) strsplit(x, split = "")这样的标记化函数 -
谢谢,emilliman5 工作得很好。这是最终代码: library(tm) doc
标签: r similarity tm trigonometry