R和手计算中的不同tf-idf值

时间:2014-06-03 09:19:06

标签: r matrix tf-idf

我在R中玩,找到tf-idf值。

我有一组documents喜欢:

D1 = "The sky is blue."
D2 = "The sun is bright."
D3 = "The sun in the sky is bright."

我想创建一个这样的矩阵:

   Docs      blue    bright       sky       sun
   D1 tf-idf 0.0000000 tf-idf 0.0000000
   D2 0.0000000 tf-idf 0.0000000 tf-idf
   D3 0.0000000 tf-idf tf-idf tf-idf

所以,我的代码在R

library(tm)
docs <- c(D1 = "The sky is blue.", D2 = "The sun is bright.", D3 = "The sun in the sky is bright.")

dd <- Corpus(VectorSource(docs)) #Make a corpus object from a text vector
#Clean the text
dd <- tm_map(dd, stripWhitespace)
dd <- tm_map(dd, tolower)
dd <- tm_map(dd, removePunctuation)
dd <- tm_map(dd, removeWords, stopwords("english"))
dd <- tm_map(dd, stemDocument)
dd <- tm_map(dd, removeNumbers)
 inspect(dd)
    A corpus with 3 text documents

    The metadata consists of 2 tag-value pairs and a data frame
    Available tags are:
    create_date creator 
    Available variables in the data frame are:
    MetaID 

    $D1
    sky blue

    $D2
     sun bright

    $D3
      sun sky bright

    > dtm <- DocumentTermMatrix(dd, control = list(weighting = weightTfIdf))
    > as.matrix(dtm)
      Terms
            Docs      blue    bright       sky       sun
            D1 0.7924813 0.0000000 0.2924813 0.0000000
            D2 0.0000000 0.2924813 0.0000000 0.2924813
            D3 0.0000000 0.1949875 0.1949875 0.1949875

如果我进行手算,那么矩阵应为:

            Docs  blue      bright       sky       sun
            D1    0.2385     0.0000000 0.3521    0.0000000
            D2    0.0000000 0.3521    0.0000000 0.3521
            D3    0.0000000 0.1949875 0.058     0.058 

我的计算方式与blue = tf1/2 = 0.5 idflog(3/1) = 0.477121255。因此tf-idf = tf*idf = 0.5*0.477 = 0.2385。这样,我正在计算其他tf-idf值。现在,我想知道为什么我在手计算矩阵和R矩阵中得到不同的结果?哪个给出了正确的结果?我在手工计算中做错了什么,或者我的R代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

您的手动计算与DocumentTermMatrix计算不一致的原因是您使用的是不同的log基础。当您说log(3/1) = 0.477121255时,您必须使用日志库10.在R中,这将是log10(3)。 R中的默认log是自然日志,因此如果在R中键入log(3),则得到~1.10。但weightTfIdf使用log base 2进行计算。因此,当计算tf-idf为&#34; blue&#34;你得到了

(1/2)*log2(3/1) = 0.7924813

我希望能够解决问题。