R中字符n-gram的层次聚类
hierarchical clustering with character n-grams in R
我有七篇经文,想从八字看它们的相近程度。
我已经从每篇文章中提取了所有的八卦。所以我有七个这样的向量:
text1 <- ("aaa", "abc", "bce", "cef", "efg", ...)
text2 <- ("aaa", "abc", "dce", "lmm", ...)
等等
如何比较每个文本中共享卦的百分比?
是否有标准的方法来创建字符三元组的距离矩阵?
可重现的数据
t1 <- letters[1:10]
t2 <- letters[1:9]
t3 <- letters[1:8]
t4 <- letters[1:7]
基础 R 解决方案
maxval <- 4 # number of trigram vectors
all.combs <- expand.grid(1:maxval, 1:maxval) %>% setNames(c("A","B")) # makes all combinations, including self <-> self comparison
以下计算向量之间 intersect
的长度,并为向量的所有成对组合除以 max(length(v1), length(v2))
P <- sapply(1:nrow(all.combs), function(x) length(intersect(get(paste0("t", all.combs$A[x])), get(paste0("t", all.combs$B[x])))) / max(length(get(paste0("t", all.combs$A[x]))), length(get(paste0("t", all.combs$B[x])))))
转换为矩阵
M <- matrix(P, ncol=maxval)
输出
[,1] [,2] [,3] [,4]
[1,] 1.0 0.9000000 0.8000000 0.7000000
[2,] 0.9 1.0000000 0.8888889 0.7777778
[3,] 0.8 0.8888889 1.0000000 0.8750000
[4,] 0.7 0.7777778 0.8750000 1.0000000
我有七篇经文,想从八字看它们的相近程度。
我已经从每篇文章中提取了所有的八卦。所以我有七个这样的向量:
text1 <- ("aaa", "abc", "bce", "cef", "efg", ...)
text2 <- ("aaa", "abc", "dce", "lmm", ...)
等等
如何比较每个文本中共享卦的百分比?
是否有标准的方法来创建字符三元组的距离矩阵?
可重现的数据
t1 <- letters[1:10]
t2 <- letters[1:9]
t3 <- letters[1:8]
t4 <- letters[1:7]
基础 R 解决方案
maxval <- 4 # number of trigram vectors
all.combs <- expand.grid(1:maxval, 1:maxval) %>% setNames(c("A","B")) # makes all combinations, including self <-> self comparison
以下计算向量之间 intersect
的长度,并为向量的所有成对组合除以 max(length(v1), length(v2))
P <- sapply(1:nrow(all.combs), function(x) length(intersect(get(paste0("t", all.combs$A[x])), get(paste0("t", all.combs$B[x])))) / max(length(get(paste0("t", all.combs$A[x]))), length(get(paste0("t", all.combs$B[x])))))
转换为矩阵
M <- matrix(P, ncol=maxval)
输出
[,1] [,2] [,3] [,4]
[1,] 1.0 0.9000000 0.8000000 0.7000000
[2,] 0.9 1.0000000 0.8888889 0.7777778
[3,] 0.8 0.8888889 1.0000000 0.8750000
[4,] 0.7 0.7777778 0.8750000 1.0000000