网站有哪些平台,门户网站开发架构,大学生引流推广的方式,我做的网站怎样推广1、先给本聚类内的所有文档进行分词#xff0c;然后用一个字典保存每个词出现的次数;2、遍历每个词#xff0c;得到每个词在所有文档里的IDF值#xff0c;和在本聚类内出现的次数#xff08;TF#xff09;相乘的值;3、用一个字典(key是词#xff0c;value是TF*IDF权重)来…1、先给本聚类内的所有文档进行分词然后用一个字典保存每个词出现的次数;2、遍历每个词得到每个词在所有文档里的IDF值和在本聚类内出现的次数TF相乘的值;3、用一个字典(key是词value是TF*IDF权重)来保存所有的词信息然后按value对字典排序 摘要昨天给大家演示简单的文本聚类但要给每个聚类再提取一两个关键词用于表示该聚类。我们还是用TFIDF算法来做因为这是比较简单的提取特征算法不过这里的TF是指某词在本聚类内所有文章的词频而不是本文章内出现的次数IDF还是在所有文章里出现的倒文档频率。原理1、先给本聚类内的所有文档进行分词然后用一个字典保存每个词出现的次数2、遍历每个词得到每个词在所有文档里的IDF值和在本聚类内出现的次数TF相乘的值3、用一个字典(key是词value是TF*IDF权重)来保存所有的词信息然后按value对字典排序最后取权重排名靠前的几个词作为关键词 测试输入如下a 奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面a 股民 要 清楚 自己 的 目的a 印花税 之 股民 四季a ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析a 运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制a asp.net 控件 开发 显示 控件 内容a 奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款a 某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民a 残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一a 介绍 一 个 ASP.net MVC 系列 教程a 在 asp.net 中 实现 观察者 模式 或 有 更 好 的 方法 续a 输 大钱 的 股民 给 我们 启迪a Asp.Net 页面 执行 流程 分析a 杭州 股民 放 鞭炮 庆祝 印花税 下调 数据还是昨天的数据但每个文章前面都加了个a所以这个词的IDF肯定很低如果单村用词频来提取关键词这个a肯定被当场关键词了所以要乘以IDF值来调整特征提取的精度。我们要用程序把上面的文档分成3类并提取每个类的两个关键词 我给TFIDFMeasure类加了一个GetKeyword的方法第一个参数是传入几个文档id列表第二个参数是要在这几个文档里提取几个关键词下面是使用该方法的代码 //4、初始化k-means算法第一个参数表示输入数据第二个参数表示要聚成几个类WawaKMeans kmeans new WawaKMeans(data, K);//5、开始迭代kmeans.Start();//6、获取聚类结果并输出WawaCluster[] clusters kmeans.Clusters;StringBuilder sb new StringBuilder();foreach (WawaCluster cluster in clusters){ Listint members cluster.CurrentMembership; //获取该聚类的关键词并打印 IEnumerablestring keywords tf.GetKeyword(cluster.CurrentMembership, 2); StringBuilder sbTemp new StringBuilder(); sbTemp.Append(---------); foreach (string s in keywords) { sbTemp.AppendFormat({0},, s); } sbTemp.Append(-------\r\n); Console.WriteLine(sbTemp); //打印该聚类的成员 sb.Append(sbTemp.ToString()); foreach (int i in members) { Console.WriteLine(docs[i]); sb.AppendFormat({0}\r\n, docs[i]); }} 再看GetKeyword方法的实现 /**//// summary/// 获取某组文档的关键词/// /summary/// param namearr/param/// param namecount/param/// returns/returnspublic IEnumerablestring GetKeyword(Listint arr, int count){ //1、给每个文档分词并保存在一个列表里 Liststring allWords new Liststring(); foreach (int i in arr) { //这里把一个文档里出现的多个词进行消重 allWords.AddRange(GetDistinctWords(_tokenizer.Partition(_docs[i]))); } //2、用一个字典保存词的词频,key是词value是重复次数 Dictionarystring , int tfDict SortByDuplicateCount(allWords); //3、遍历已排序的词频字典并获取每个词的IDF值并把更新后的结果放入一个tfidfDict词典 //该词典的key是词value是tfidf值 Dictionarystring,float tfidfDict new Dictionarystring, float(tfDict.Count); foreach (KeyValuePairstring, int pair in tfDict) { int tremIndex; if(_tremIndex.TryGetValue(pair.Key,out tremIndex)) { float idf GetInverseDocumentFrequency(tremIndex); tfidfDict.Add(pair.Key, pair.Value * idf); } } //4、给tfidf字典俺权重排序 tfidfDict GetSortByValueDict(tfidfDict); //5、更新要提取的关键词数量 int keywordCount count; if (keywordCount tfidfDict.Count) keywordCount tfidfDict.Count; //6、用一个数组保存tfidf字典的keys这些key已排序 string[] keywordArr new string[tfidfDict.Count]; tfidfDict.Keys.CopyTo(keywordArr,0); //7、在关键词数组里取出前几个关键词返回给调用者 Liststring result new Liststring(keywordCount); int tempCount 0; foreach (string str in keywordArr) { tempCount; result.Add(str); if(tempCount keywordCount) break; } return result;} 这里面用到一个SortByDuplicateCount方法是对一个集合里的元素按重复次数排序输出一个字典字典的key是原始元素value是出现次数并按出现次数从大到小排序像 { abcd, ab, b, a, abcd, ab, ab, ab, cd, cd, cd }这样一个集合应该输入如下结果。ab-4cd-3abcd-2b-1a-1原理是先用一个字典计算每个元素的出现次数然后把该字典按value的大小排序下面是实现代码 /**//// summary/// 把一个集合按重复次数排序/// /summary/// typeparam nameT/typeparam/// param nameinputList/param/// returns/returnspublic static DictionaryT, int SortByDuplicateCountT(IListT inputList){ //用于计算每个元素出现的次数key是元素value是出现次数 DictionaryT, int distinctDict new DictionaryT, int(); for (int i 0; i inputList.Count; i) { //这里没用trygetvalue会计算两次hash if (distinctDict.ContainsKey(inputList[i])) distinctDict[inputList[i]]; else distinctDict.Add(inputList[i], 1); } DictionaryT, int sortByValueDict GetSortByValueDict(distinctDict); return sortByValueDict;} 这里用到一个把一个字典按值的大小排序的方法GetSortByValueDict代码如下是泛型的 /**//// summary/// 把一个字典俺value的顺序排序/// /summary/// typeparam nameK/typeparam/// typeparam nameV/typeparam/// param namedistinctDict/param/// returns/returnspublic static DictionaryK, V GetSortByValueDictK,V(IDictionaryK, V distinctDict){ //用于给tempDict.Values排序的临时数组 V[] tempSortList new V[distinctDict.Count]; distinctDict.Values.CopyTo(tempSortList, 0); Array.Sort(tempSortList); //给数据排序 Array.Reverse(tempSortList);//反转 //用于保存按value排序的字典 DictionaryK, V sortByValueDict new DictionaryK, V(distinctDict.Count); for (int i 0; i tempSortList.Length; i) { foreach (KeyValuePairK, V pair in distinctDict) { //比较两个泛型是否相当要用Equals不能用操作符 if (pair.Value.Equals(tempSortList[i]) !sortByValueDict.ContainsKey(pair.Key)) sortByValueDict.Add(pair.Key, pair.Value); } } return sortByValueDict;} 对一个文章内出现的多个词进行消重是因为如果一个文章里堆叠关键词会影响本聚类关键词提取的准确性所以要排重算法如下也是泛型的 /**//// summary/// 对一个数组进行排重/// /summary/// param namescanKeys/param/// returns/returnspublic static IEnumerableT GetDistinctWordsT(IEnumerableT scanKeys){ T temp default(T); if (scanKeys.Equals(temp)) return new T[0]; else { DictionaryT, T fixKeys new DictionaryT, T(); foreach (T key in scanKeys) { fixKeys[key] key; } T[] result new T[fixKeys.Count]; fixKeys.Values.CopyTo(result, 0); return result; }} 最后效果如下Iteration 0...Iteration 1...---------asp,net,------- a ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析a asp.net 控件 开发 显示 控件 内容a 介绍 一 个 ASP.net MVC 系列 教程a 在 asp.net 中 实现 观察者 模式 或 有 更 好 的 方法 续a Asp.Net 页面 执行 流程 分析---------股民,印花税,------- a 股民 要 清楚 自己 的 目的a 印花税 之 股民 四季a 某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民a 输 大钱 的 股民 给 我们 启迪a 杭州 股民 放 鞭炮 庆祝 印花税 下调---------奥运,拳击,------- a 奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面a 运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制a 奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款a 残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一 可以看到提取的关键字还是准确的并没把a当成关键字。转载于:https://www.cnblogs.com/lindayyh/archive/2009/10/13/1582299.html