我有两个xml文本文件并使用quanteda和tm包,我已将它们标记化并转换为tf-idf矩阵。这是我的rstudio环境:
如何计算这两个文件之间的相似性,例如,使用Jaccard。
我尝试过dist(),cosine()和text2vec,但是,我都遇到错误。
例如:
余弦(x = pta2.tokens.tfidf,y = pta3.tokens.tfidf) 余弦误差(x = pta2.tokens.tfidf,y = pta3.tokens.tfidf): 论证不匹配。需要一个矩阵或两个向量作为输入。
simi< - sim2(pta2.tokens.tfidf,pta3.tokens.tfidf,method =“jaccard”,norm =“none”) 错误:ncol(x)== ncol(y)不为TRUE
答案 0 :(得分:1)
问题是你有一个带字符串值的data.frame并且你正在使用需要数字矩阵输入的距离
<强> DIST 强>
你需要一个数字矩阵:
?dist
<强>用法强>
dist(x,method =&#34; euclidean&#34;,diag = FALSE,upper = FALSE,p = 2)
<强>参数强>
x数字矩阵,数据框或&#34; dist&#34;对象
<强> COSINE 强>
您需要数值:
?cosine
用法
余弦(x,y,使用=&#34;所有内容&#34;,反向=假)
参数
x数字数据框/矩阵或向量
<强> SIM2 强>
您的错误是由于pta2.tokens.tfidf
和pta3.tokens.tfidf
中的列数不同造成的。这是一个错误的例子:
df1<-as.matrix(data.frame(a=c("a","b","c"),b=c("d","e","f")))
df2<-as.matrix(data.frame(c=c("a","b","c"),d=c("d","e","f"),e=c("g","h","i")))
sim2(df1,df2)
错误:ncol(x)== ncol(y)不为TRUE
但是如果你有相同的维度,这个方法将无法正常工作,因为它在输入中需要数字参数:
sim2(df1,df1)
m ^ 2中的错误:二元运算符的非数字参数
您必须具有相同尺寸和数字的矩阵,如下所示:
df3<-as.matrix(data.frame(a=c(1,2,3),b=c(4,5,6)))
> df4<-as.matrix(data.frame(a=c(3,2,3),b=c(3,3,6)))
> sim2(df3,df4)
[,1] [,2] [,3]
[1,] 0.8574929 0.9417419 0.9761871
[2,] 0.9191450 0.9785498 0.9965458
[3,] 0.9486833 0.9922779 1.0000000
可能的解决方案
使用stringdist
包中的stringdist
函数,这里有一个玩具示例:
两个带字符串值的数据框
df1<-data.frame(a=c("abc","bav","cda"),b=c("ddd","ese","feff"))
df2<-data.frame(a=c("abc","gfb","cdd"),b=c("dsd","eeesfd","fafe"))
比较两个大数据字符串中的字符串值的函数:
f<-function(i,df1,df2)
{
f2<-function(y,list1,list2)
{
return(stringdist(list1[y],list2[y],method="jw"))
}
return(unlist(lapply(seq(1:length(df1[,i])),f2,list1=df1[,i],list2=df2[,i])))
}
dist_matrix<-do.call(cbind,lapply(seq(1:ncol(df1)),f,df1=df1,df2=df2))
距离矩阵
dist_matrix
[,1] [,2]
[1,] 0.0000000 0.2222222
[2,] 1.0000000 0.2777778
[3,] 0.2222222 0.3333333