文字相似度-余弦-控制

时间:2018-11-15 18:43:30

标签: r cosine-similarity linguistics quanteda text2vec

我想问你,是否有人可以检查我的代码,因为它很奇怪-无法正常工作,使我突然出错而又未做任何更改而出现错误-代码将位于底部。

背景:因此,我的目标是要计算联合国在一些国家/地区发表的年度声明之间的文本相似度(目前为余弦)。更具体地说,找到给定年份中的语句x和y之间的相似性,并在所有45年中都这样做。因此,我可以为它的演变作图。

我的工作方式:[新手]我决定分几步进行这项工作-首先确定A国与B国的陈述相似,然后重新进行在其他国家/地区工作(A国停留,一切都归A国)。

所以我过滤了国家A的报表,按年份排列。进行了文本预处理(标记化,降低,停用词,精液化,词袋化)。然后我用它制作了一个TF-IDF矩阵-名为: text.tokens.tfidf

我对B国进行了相同的处理,并得到了 text.tokensChina.tfidf -只是在新纸上将所有text.tokens替换为text.tokensChina。因此,每个矩阵都包含1971年至2005年的年度报表的tf-idf,其中行=文档(年),列=术语。

计算余弦相似度:因此,我决定按照here所述使用Text2Vec-但是,我没有为其定义公共空间和项目文档-不重要。然后决定输入两个函数 sim2和psim2 ,因为我不知道并行的区别。

开始时出了什么问题:第一次运行函数时,我遇到一个错误,可能是在告诉我,我在两个TF-IDF矩阵中的列长不匹配:< / p>

  

ncol(x)== ncol(y)不正确

但是,重新运行我所有步骤的代码,然后再试一次,就可以了,但是我没有做任何更改...

结果:函数sim2的结果为怪异表[1:45,1:45]。显然不是我想要的-在给定年份中,A国和B国的演讲之间有相似之处。

函数psim2的结果更好-包含结果的一列[不确定,它们的正确性如何]。

技术问题:我想使用Psim2-不是,我看不到sim2创建了诸如相关热图之类的东西,这很糟糕。但是,即使列长不同(图片),Psim2函数为何也起作用?另外,我没有做错什么,尤其是当我没有创建公共空间时?

代码,图片

    # *** Text Pre-Processing with Quanteda *** 
      # 1. Tokenization
      text.tokens <- tokens(docs$text, what = 'word',
                          remove_numbers = TRUE,
                          remove_punct = TRUE,
                          remove_symbols = TRUE,
                          remove_hyphens = TRUE)

      # 2. Transform words to lower case
      text.tokens <- tokens_tolower(text.tokens)

      # 3. Removing stop-words (Using quanteda's built-in stopwords list)
      text.tokens <- tokens_select(text.tokens, stopwords(),
                                   selection = 'remove')
      # 4. Perform stemming on the tokens.
      text.tokens <- tokens_wordstem(text.tokens, language = 'english')

      # 5. Create bag-of-words model / document feature(frequance)
      text.tokens.dfm <- dfm(text.tokens, tolower = FALSE)

      # 6. Transform to a matrix to work with and inspect
      text.tokens.matrix <- as.matrix(text.tokens.dfm)
      dim(text.tokens.matrix)

    # *** Doing TF-IDF *** 
      # Defining Function for calculating relative term frequency (TF)
      term.frequency <- function(row) {
        row / sum(row)
      }
      # Defining Function for calculating inverse document frequency (IDF)
      inverse.doc.freq <- function(col) {
        corpus.size <- length(col)
        doc.count <- length(which(col > 0))

        log10(corpus.size / doc.count)
      }
      # Defining function for calculating TD-IDF
      tf.idf <- function(tf, idf) {
        tf * idf
      }

      # 1. First step, normalize all documents via TF.
      text.tokens.df <- apply(text.tokens.matrix, 1, term.frequency)
      dim(text.tokens.df)

      # 2. Second step, calculate the IDF vector 
      text.tokens.idf <- apply(text.tokens.matrix, 2, inverse.doc.freq)
      str(text.tokens.idf)

      # 3. Lastly, calculate TF-IDF for our corpus
        # Apply function on columns, because matrix is transposed from TF function  
        text.tokens.tfidf <- apply(text.tokens.df, 2, tf.idf, idf = text.tokens.idf)
        dim(text.tokens.tfidf)

      # Now, transpose the matrix back
        text.tokens.tfidf <- t(text.tokens.tfidf)
        dim(text.tokens.tfidf)

     # Cosine similarity using Text2Vec 
  similarity.sim2 <- sim2(text.tokensChina.tfidf, text.tokensChina.tfidf, method = "cosine", norm = "none")

  similarity.psim2 <- psim2(text.tokensChina.tfidf, text.tokensChina.tfidf, method = "cosine", norm = "none")
  similarity.psim2 <- as.data.frame(similarity.psim2)

全球环境图片: Picture of my screen with Global Environment + Psim2 Results

1 个答案:

答案 0 :(得分:0)

结果是,整个过程都是完整的BS。没有在一个向量空间中比较事物。更不用说,最好的方法是使用doc2vec,但是不幸的是,我试图弄清楚了几天,却一无所获。