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

标签: 文档 文档 频率 | 发表时间:2013-05-04 14:50 | 作者:jia20003
出处:http://blog.csdn.net

TF-IDF计算:

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

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

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

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

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

相关代码:

	private static Pattern r = Pattern.compile("([ \\t{}()\",:;. \n])"); 
	private static List<String> documentCollection;

    //Calculates TF-IDF weight for each term t in document d
    private static float findTFIDF(String document, String term)
    {
        float tf = findTermFrequency(document, term);
        float idf = findInverseDocumentFrequency(term);
        return tf * idf;
    }

    private static float findTermFrequency(String document, String term)
    {
    	int count = getFrequencyInOneDoc(document, term);

        return (float)((float)count / (float)(r.split(document).length));
    }
    
    private static int getFrequencyInOneDoc(String document, String term)
    {
    	int count = 0;
        for(String s : r.split(document))
        {
        	if(s.toUpperCase().equals(term.toUpperCase())) {
        		count++;
        	}
        }
        return count;
    }


    private static float findInverseDocumentFrequency(String term)
    {
        //find the  no. of document that contains the term in whole document collection
        int count = 0;
        for(String doc : documentCollection)
        {
        	count += getFrequencyInOneDoc(doc, term);
        }
        /*
         * log of the ratio of  total no of document in the collection to the no. of document containing the term
         * we can also use Math.Log(count/(1+documentCollection.Count)) to deal with divide by zero case; 
         */
        return (float)Math.log((float)documentCollection.size() / (float)count);

    }
建立文档的向量空间模型Vector Space Model并计算余弦相似度。

相关代码:

public static float findCosineSimilarity(float[] vecA, float[] vecB)
{
    float dotProduct = dotProduct(vecA, vecB);
    float magnitudeOfA = magnitude(vecA);
    float magnitudeOfB = magnitude(vecB);
    float result = dotProduct / (magnitudeOfA * magnitudeOfB);
    //when 0 is divided by 0 it shows result NaN so return 0 in such case.
    if (Float.isNaN(result))
        return 0;
    else
        return (float)result;
}

public static float dotProduct(float[] vecA, float[] vecB)
{

    float dotProduct = 0;
    for (int i = 0; i < vecA.length; i++)
    {
        dotProduct += (vecA[i] * vecB[i]);
    }

    return dotProduct;
}

// Magnitude of the vector is the square root of the dot product of the vector with itself.
public static float magnitude(float[] vector)
{
    return (float)Math.sqrt(dotProduct(vector, vector));
}
注意点

零词过滤(stop-words filter)

零词列表

ftp://ftp.cs.cornell.edu/pub/smart/english.stop

关于TF-IDF参考这里:

链接–> http://en.wikipedia.org/wiki/Tf*idf


作者:jia20003 发表于2013-5-4 14:50:45 原文链接
阅读:0 评论:0 查看评论

相关 [文档 文档 频率] 推荐:

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

- - CSDN博客推荐文章
TF-IDF反映了在文档集合中一个单词对一个文档的重要性,经常在文本数据挖据与信息. 在一份给定的文件里, 词频(termfrequency-TF)指的是某一. 个给定的词语在该文件中出现的频率. 逆向文件频率(inversedocument frequency,. IDF)是一个词语普遍重要性的度量.

HTML5 & CSS3 研究文档

- Kings - 幸福收藏夹
已经说了好久,一直没把这个文件夹分享出来. 这是我去年第四季度里做的,里面有 11 一个文档. 包括 HTML5 中最主要的 JS API 文档,还有 CSS3 中两个比较难的属性. 主要还停留在纯 API 层面上的研究,没有深入到应用中去. 不过,当做工具来使用,和入门文档,还是不错的. 特别是其中的 HTML5 JS API 文档.

Twitter API中文文档

- Jacob - 月光博客
  目前的国内的微博客很多,不少微博客都提供Open API,然而,很多微博提供的API和Twitter的API有一些或多或少的差别,调用格式上并不完全相同.   我建议所有提供API的微博客系统,都将各自的API统一为Twitter的API调用格式,例如目前较有影响的开源微博系统StatusNet(Laconica)的API格式就完全兼容Twitter,这种统一API对于开发者和用户都有很大的好处.

Underscore.js Version (1.2.3) 中文文档

- - WEB前端开发
Underscore 一个非常实用的JavaScript库,提供许多编程功能的支持,就像你期望 Prototype.js (或者 Ruby), 有这些功能且不扩展任何JavaScript的原生对象. 有函数式编程的风格,还支持链式调用. 主要涉及对Collection、Object、Array、Function的操作,还有一些实用方法.

Redis集群明细文档

- - CSDN博客架构设计推荐文章
  Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式). 目前根据文档已经看到Redis正在开发集群功能,其中一部分已经开发完成,但是具体什么时候可以用上,还不得而知. 文档来源: http://redis.io/topics/cluster-spec.

Azkaban2官方配置文档

- - CSDN博客云计算推荐文章
最近工作实在是太忙了,我把之前翻译的官方的文档先放上来吧,希望对大家有所帮助~. 3、更容易设置job的依赖关系. 6、Kill和restart工作流. 8、日志和设计工作流和job. Azkaban2是相当容易搭建的,尽管它比azkaban要进行更多的插件组装. 在Azkaban2中有两个server和一个数据库需要搭建:.

elasticsearch文档-字段的mapping

- - 开源软件 - ITeye博客
elasticsearch文档-字段的mapping. Mapping是指定义如何将document映射到搜索引擎的过程,比如一个字段是否可以查询以及如何分词等,一个索引可以存储含有不同"mapping types"的documents,ES允许每个mapping type关联多个mapping定义.

elasticsearch 文档 - 轩脉刃

- - 博客园_首页
elasticsearch 文档. 索引中最基本的单元叫做文档 document. "content": "汽车常见故障的解决办法有哪些. } 文档中下划线开头的是es自带的字段. _id 代表文档id,如果插入文档的时候没有设置id的话,那么es会自动生成一个唯一id. _score 这个不是文档自带的,而是进行搜索的时候返回的,代表这个文档和搜索的相关匹配分值.

文档抽象模型xml,xml解析生成pdf,word文档

- - CSDN博客推荐文章
            

文档与笔记利器reStructuredText和Sphinx

- Wick - 七星庐
关于制作文档和笔记这种事,我已经纠结了很久,网上解决方案也一大推,我试过几样,ScrapBook和Zotero,编辑不太方便,同步麻烦. Google Note过于格式简单,现在也不更新了,Google Docs又有点杀鸡用牛刀. 还有传得很神奇的Evernote跟Onenote,我压根没兴趣去用.