从网页相关性TF-IDF到余弦定理的新闻分类的程序实现

前提:TF-IDF 模型是搜索引擎等实际应用中被广泛使用的信息检索模型,但对于 TF-IDF 模型一直存在各种疑问。本文为信息检索问题一种基于条件概率的盒子小球模型,其核心思想是把“查询串q和文档d的匹配度问题”转化为“查询串q来自于文档d的条件概率问题”。它从概率的视角为信息检索问题定义了比 TF-IDF 模型所表达的匹配度更为清晰的目标。此模型可将 TF-IDF 模型纳入其中,一方面解释其合理性,另一方面也发现了其不完善之处。另外,此模型还可以解释 PageRank 的意义,以及 PageRank
权重和 TF-IDF 权重之间为什么是乘积关系.--->引用(http://baike.baidu.com/view/1228847.htm?fr=aladdin)。

2014年9月19日23:49:07 实现IF-IDF。才30%。坑啊,后期的阈值怎么设置还是需要研究的~

package com.lean;

import java.util.ArrayList;
import java.util.Arrays;

/*
 * 1.如何度量网页和查询的相关性---信息检索领域
 * TF-IDF(词频-逆文本频率指数)算法:
 * TF词频=(词出现的次数/文本中中单词的总数)
 * IDF=log(D/DW)=log(网页总数/包含特定单词的网页)---->为什么是log(),数学之美给出的解释是“一个特定条件下关键词的概率分布的交叉熵”
 * 相关性=TF1*IDF1+TF2*IDF2+TF3*IDF3+...
 *
 * 2.如何利用余弦定理到新闻的自动分类算法
 * 计算每个新闻词汇表的IDF。
 * 将每个新闻词汇表IDF当做特征向量-->数组实现,每个下标对应特定的单词
 * 利用余弦公式计算新闻两两之间的夹角A,(A角度越大,相关性就越小,平行时相关性最大)
 * 不断合并A<T(T代表阈值,根据经验划分)产生的小类
 * 继续计算各个小类的特征向量,继续合并,直到合并为1个大类。
 * 根据合并的层次大小,决定新闻分类的规模,ok
 *
 *
 * 3.优化算法复杂度:
 * 余弦定理的分子分母优化,做记忆化存储。
 * 删除虚词(的,是,和,一些连词,副词,介词,只定位实词"aXb"模式)
 * 位置的加权(主题的关键词权重>正文,正文首尾关键词权重>中间)
 *
 * 模拟算法开始啦~~~
 */
public class newCate {
	int A[]={};
	static int news1[]={0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,1,2,3,3,3};//代表一条新闻。文字用数字代替~~~
	static int news2[]={12,13,19,11,12,13,14,15,11,12,13,13,3};
	static int news3[]={10,11,12,13,24,24,25,21,22,23,23,13};

	static int Keys[]={3,2,8};//3个关键词,当然假设已经经过分词处理过的结果

	/*
	 * 计算词频
	 */
	private double[] getTF(ArrayList<int[]> newsList ,int keys[]) {
		int n=newsList.size(),m=Keys.length;
		double TF[]=new double[m];//词频

		for (int i = 0; i < TF.length; i++) {
			TF[i]=0;
		}
		/*
		 * 可以优化到nlogn~~~懒的写了~~
		 */
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				int news[]=newsList.get(j);
				int K=news.length;
				for (int k = 0; k <K ; k++) {
					if(keys[i]==news[k]) TF[i]+=(1.0/K);
				}
			}
		}
		return TF;
	}
	/*
	 * 计算各个关键词的权重
	 * IDF=log(D/DW)=log(网页总数/包含特定单词的网页)
	 */
	private double[] getIDF(ArrayList<int[]> al,int keys[]) {
		int D=al.size(),DW=0;
		double IDF[]=new double[keys.length];

		for (int i = 0; i < IDF.length; i++) {
			DW= getDw(al,keys[i]);
			IDF[i]+=Math.log(D/DW);
		}
		return IDF;
	}

	/*
	 * 计算出现关键词的新闻数
	 */
	private int getDw(ArrayList<int[]> newsList, int i) {
		int cnt=0;
		for (int j = 0; j < newsList.size(); j++) {
			int news[]=newsList.get(j);
			for (int k = 0; k < news.length; k++) {
				if(news[k]==i){
					 cnt++;
					 break;
				}
			}
		}
		return cnt;
	}

	/*
	 * 词频*权重的集合
	 * 相关性=TF1*IDF1+TF2*IDF2+TF3*IDF3+...
	 */
	private double getRelate(double TF[],double IDF[]) {
		int n=TF.length;
		double ans=0.0;
		for (int i = 0; i <n; i++) {
			ans+=TF[i]*IDF[i];
		}
		return ans;
	}

	public static void main(String[] args) {
		newCate nc=new newCate();

//---------------IF-IDF------------
		//新闻网页集合
		ArrayList<int[]> newsList=new ArrayList<int[]>();
		newsList.add(news1);
		newsList.add(news2);
		newsList.add(news3);
		newsList.add(news3);
		newsList.add(news3);
		newsList.add(news3);
		double tf[]=nc.getTF(newsList, Keys);
		double idf[]=nc.getIDF(newsList, Keys);
		System.out.println("关键词词频集合="+Arrays.toString(tf));
		System.out.println("关键词贡献集合="+Arrays.toString(idf));

		double relate=nc.getRelate(tf, idf);
		System.out.println("关键词的相关性="+relate);

//-----------news_cate-----------------------

	}

}

剩余的明天早上写吧,晚安

时间: 2024-12-27 14:02:05

从网页相关性TF-IDF到余弦定理的新闻分类的程序实现的相关文章

余弦定理实现新闻自动分类算法

前言 余弦定理,这个在初中课本中就出现过的公式,恐怕没有人不知道的吧.但是另外一个概念,可能不是很多的人会听说过,他叫空间向量,一般用e表示,高中课本中有专门讲过这个东西,有了余弦定理和向量空间,我们就可以做许多有意思的事情了,利用余弦定理计算文本相似度的算法就是其中一个很典型的例子.当然这个话题太老,说的人太多,没有什么新意,恰巧周末阅读了吴军博士的<<数学之美>>这门书,书中讲到了利用余弦定理实现新闻分类,于是就索性完成这个算法的初步模型.感兴趣的可以继续往下看. 算法背景 在

tf–idf算法解释及其python代码实现(下)

tf–idf算法python代码实现 这是我写的一个tf-idf的核心部分的代码,没有完整实现,当然剩下的事情就非常简单了,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四句话,每句表示一个文档 copus=['我正在学习计算机','它正在吃饭','我的书还在你那儿','今天不上班'] 由于中文需要分词,jieba分词是python里面比较好用的分词工具,所以选用jieba分词,文末是jieba的链接.首先对文档进行分词: i

[Elasticsearch] 控制相关度 (四) - 忽略TF/IDF

本章翻译自Elasticsearch官方指南的Controlling Relevance一章. 忽略TF/IDF 有时我们不需要TF/IDF.我们想知道的只是一个特定的单词是否出现在了字段中.比如我们正在搜索度假酒店,希望它拥有的卖点越多越好: WiFi 花园(Garden) 泳池(Pool) 而关于度假酒店的文档类似下面这样: { "description": "A delightful four-bedroomed house with ... " } 可以使用

tf–idf算法解释及其python代码实现(上)

tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息检索和文本挖掘中. 一个很自然的想法是在一篇文档中词频越高的词对这篇文档越重要,但同时如果这个词又在非常多的文档中出现的话可能就是很普通的词,没有多少信息,对所在文档贡献不大,例如‘的’这种停用词.所以要综合一个词在所在文档出现次数以及有多少篇文档包含这个词,如果一个词在所在文档出现次数很多同时整个

关于使用Filter减少Lucene tf idf打分计算的调研

将query改成filter,lucene中有个QueryWrapperFilter性能比较差,所以基本上都需要自己写filter,包括TermFilter,ExactPhraseFilter,ConjunctionFilter,DisjunctionFilter. 这几天验证下来,还是or改善最明显,4个termfilter,4508个返回结果,在我本机上性能提高1/3.ExactPhraseFilter也有小幅提升(5%-10%). 最令人不解的是and,原来以为跟结果数和子查询数相关,但几

Elasticsearch学习之相关度评分TF&amp;IDF

relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法 Term frequency(TF):搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关 Inverse document frequency(IDF):搜索文本中的各个词条在整个索引的所有文档中出现了多少次,出现的

使用solr的函数查询,并获取tf*idf值

1. 使用函数df(field,keyword) 和idf(field,keyword). http://118.85.207.11:11100/solr/mobile/select?q={!func}product%28idf%28title,%E9%97%AE%E9%A2%98%29,tf%28title,%E9%97%AE%E9%A2%98%29%29&fl=title,score,product%28idf%28title,%E9%97%AE%E9%A2%98%29,tf%28title

55.TF/IDF算法

主要知识点: TF/IDF算法介绍 查看es计算_source的过程及各词条的分数 查看一个document是如何被匹配到的 一.算法介绍 relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度.Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法 1.Term frequency 搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,

25.TF&IDF算法以及向量空间模型算法

主要知识点: boolean model IF/IDF vector space model 一.boolean model 在es做各种搜索进行打分排序时,会先用boolean model 进行初步的筛选,boolean model类似and这种逻辑操作符,先过滤出包含指定term的doc.must/must not/should(过滤.包含.不包含 .可能包含)这几种情况,这一步不会对各个doc进行打分,只分过滤,为下一步的IF/IDF算法筛选数据. 二.TF/IDF 这一步就是es为boo