两个tfidf矩阵之间的文本相似度

时间:2018-03-28 08:51:35

标签: r similarity

我有两个xml文本文件并使用quanteda和tm包,我已将它们标记化并转换为tf-idf矩阵。这是我的rstudio环境:

enter image description here

如何计算这两个文件之间的相似性,例如,使用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

1 个答案:

答案 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.tfidfpta3.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