文档的词频-反向文档频率(TF-IDF)计算

TF-IDF计算:

TF-IDF反映了在文档集合中一个单词对一个文档的重要性,经常在文本数据挖据与信息

提取中用来作为权重因子。在一份给定的文件里,词频(termfrequency-TF)指的是某一

个给定的词语在该文件中出现的频率。逆向文件频率(inversedocument frequency,

IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含

该词语之文件的数目,再将得到的商取对数得到。

相关代码:

[java]  view plain copy
  1. private static Pattern r = Pattern.compile("([ \\t{}()\",:;. \n])");   
  2. private static List<String> documentCollection;  
  3.   
  4.    //Calculates TF-IDF weight for each term t in document d  
  5.    private static float findTFIDF(String document, String term)  
  6.    {  
  7.        float tf = findTermFrequency(document, term);  
  8.        float idf = findInverseDocumentFrequency(term);  
  9.        return tf * idf;  
  10.    }  
  11.   
  12.    private static float findTermFrequency(String document, String term)  
  13.    {  
  14.     int count = getFrequencyInOneDoc(document, term);  
  15.   
  16.        return (float)((float)count / (float)(r.split(document).length));  
  17.    }  
  18.      
  19.    private static int getFrequencyInOneDoc(String document, String term)  
  20.    {  
  21.     int count = 0;  
  22.        for(String s : r.split(document))  
  23.        {  
  24.         if(s.toUpperCase().equals(term.toUpperCase())) {  
  25.             count++;  
  26.         }  
  27.        }  
  28.        return count;  
  29.    }  
  30.   
  31.   
  32.    private static float findInverseDocumentFrequency(String term)  
  33.    {  
  34.        //find the  no. of document that contains the term in whole document collection  
  35.        int count = 0;  
  36.        for(String doc : documentCollection)  
  37.        {  
  38.         count += getFrequencyInOneDoc(doc, term);  
  39.        }  
  40.        /* 
  41.         * log of the ratio of  total no of document in the collection to the no. of document containing the term 
  42.         * we can also use Math.Log(count/(1+documentCollection.Count)) to deal with divide by zero case;  
  43.         */  
  44.        return (float)Math.log((float)documentCollection.size() / (float)count);  
  45.   
  46.    }  
建立文档的向量空间模型Vector Space Model并计算余弦相似度。

相关代码:

[java]  view plain copy
  1. public static float findCosineSimilarity(float[] vecA, float[] vecB)  
  2. {  
  3.     float dotProduct = dotProduct(vecA, vecB);  
  4.     float magnitudeOfA = magnitude(vecA);  
  5.     float magnitudeOfB = magnitude(vecB);  
  6.     float result = dotProduct / (magnitudeOfA * magnitudeOfB);  
  7.     //when 0 is divided by 0 it shows result NaN so return 0 in such case.  
  8.     if (Float.isNaN(result))  
  9.         return 0;  
  10.     else  
  11.         return (float)result;  
  12. }  
  13.   
  14. public static float dotProduct(float[] vecA, float[] vecB)  
  15. {  
  16.   
  17.     float dotProduct = 0;  
  18.     for (int i = 0; i < vecA.length; i++)  
  19.     {  
  20.         dotProduct += (vecA[i] * vecB[i]);  
  21.     }  
  22.   
  23.     return dotProduct;  
  24. }  
  25.   
  26. // Magnitude of the vector is the square root of the dot product of the vector with itself.  
  27. public static float magnitude(float[] vector)  
  28. {  
  29.     return (float)Math.sqrt(dotProduct(vector, vector));  
  30. }  
注意点

零词过滤(stop-words filter)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值