利用c#提取文本关键词.doc_第1页
利用c#提取文本关键词.doc_第2页
利用c#提取文本关键词.doc_第3页
利用c#提取文本关键词.doc_第4页
利用c#提取文本关键词.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.2. 原理:1、先给本聚类内的所有文档进行分词,然后用一个字典保存每个词出现的次数 3. 2、遍历每个词,得到每个词在所有文档里的IDF值,和在本聚类内出现的次数(TF)相乘的值 4. 3、用一个字典(key是词,value是TF*IDF权重)来保存所有的词信息,然后按value对字典排序,最后取权重排名靠前的几个词作为关键词测试输入如下 5. = 6. a奥运拳击入场券基本分罄邹市明夺冠对手浮出水面 7. a股民要清楚自己的目的 8. a印花税之股民四季 9. aASP.NET自定义控件复杂属性声明持久性浅析 10. a运动员行李将“后上先下”奥运相关人员行李实名制 11. 控件开发显示控件内容 12. a奥运票务网上成功订票后应及时到银行代售网点付款 13. a某心理健康站开张后首个咨询者是位新股民 14. a残疾女青年入围奥运游泳比赛创奥运历史两项第一 15. a介绍一个ASP.netMVC系列教程 16. a在中实现观察者模式,或有更好的方法(续) 17. a输大钱的股民给我们启迪 18. aAsp.Net页面执行流程分析 19. a杭州股民放鞭炮庆祝印花税下调 20. = 21. 数据还是昨天的数据,但每个文章前面都加了个a,所以这个词的IDF肯定很低,如果单村用词频来提取关键词,这个a肯定被当场关键词了,所以要乘以IDF值来调整特征提取的精度。我们要用程序把上面的文档分成3类,并提取每个类的两个关键词 22. 我给TFIDFMeasure类加了一个GetKeyword的方法,第一个参数是传入几个文档id列表,第二个参数是要在这几个文档里提取几个关键词,下面是使用该方法的代码 23.24. /4、初始化k-means算法,第一个参数表示输入数据,第二个参数表示要聚成几个类 25. WawaKMeanskmeans=newWawaKMeans(data,K); 26. /5、开始迭代 27. kmeans.Start(); 28.29. /6、获取聚类结果并输出 30. WawaClusterclusters=kmeans.Clusters; 31. StringBuildersb=newStringBuilder(); 32. foreach(WawaClusterclusterinclusters) 33. 34. Listmembers=cluster.CurrentMembership; 35. 36. /获取该聚类的关键词并打印 37. IEnumerablekeywords=tf.GetKeyword(cluster.CurrentMembership,2); 38. StringBuildersbTemp=newStringBuilder(); 39. sbTemp.Append(-); 40. foreach(stringsinkeywords) 41. 42. sbTemp.AppendFormat(0,s); 43. 44. sbTemp.Append(-/r/n); 45. Console.WriteLine(sbTemp); 46.47. /打印该聚类的成员 48. sb.Append(sbTemp.ToString(); 49. foreach(intiinmembers) 50. 51. Console.WriteLine(docs); 52. sb.AppendFormat(0/r/n,docs); 53. 54. 55.56.57. 再看GetKeyword方法的实现 58. / 59. /获取某组文档的关键词 60. / 61. / 62. / 63. / 64. publicIEnumerableGetKeyword(Listarr,intcount) 65. 66. /1、给每个文档分词并保存在一个列表里 67. ListallWords=newList(); 68. foreach(intiinarr) 69. 70. /这里把一个文档里出现的多个词进行消重 71. allWords.AddRange(GetDistinctWords(_tokenizer.Partition(_docs); 72. 73.74. /2、用一个字典保存词的词频,key是词,value是重复次数 75. DictionarytfDict=SortByDuplicateCount(allWords); 76.77. /3、遍历已排序的词频字典,并获取每个词的IDF值,并把更新后的结果放入一个tfidfDict词典 78. /该词典的key是词,value是tfidf值 79. DictionarytfidfDict=newDictionary(tfDict.Count); 80. foreach(KeyValuePairpairintfDict) 81. 82. inttremIndex; 83. if(_tremIndex.TryGetValue(pair.Key,outtremIndex) 84. 85. floatidf=GetInverseDocumentFrequency(tremIndex); 86. tfidfDict.Add(pair.Key,pair.Value*idf); 87. 88. 89.90. /4、给tfidf字典俺权重排序 91. tfidfDict=GetSortByValueDict(tfidfDict); 92.93. /5、更新要提取的关键词数量 94. intkeywordCount=count; 95. if(keywordCounttfidfDict.Count) 96. keywordCount=tfidfDict.Count; 97. 98. /6、用一个数组保存tfidf字典的keys,这些key已排序 99. stringkeywordArr=newstringtfidfDict.Count; 100. tfidfDict.Keys.CopyTo(keywordArr,0); 101.102. /7、在关键词数组里取出前几个关键词返回给调用者 103. Listresult=newList(keywordCount); 104. inttempCount=0; 105. foreach(stringstrinkeywordArr) 106. 107. tempCount+; 108. result.Add(str); 109. if(tempCount=keywordCount)break; 110. 111. returnresult; 112. 16.117. 这里面用到一个SortByDuplicateCount方法,是对一个集合里的元素按重复次数排序,输出一个字典,字典的key是原始元素,value是出现次数,并按出现次数从大到小排序,像abcd,ab,b,a,abcd,ab,ab,ab,cd,cd,cd这样一个集合应该输入如下结果。 118. ab-4 119. cd-3 120. abcd-2 121. b-1 122. a-1 123. 原理是先用一个字典计算每个元素的出现次数,然后把该字典按value的大小排序,下面是实现代码 124. / 125. /把一个集合按重复次数排序 126. / 127. / 128. / 129. / 130. publicstaticDictionarySortByDuplicateCount(IListinputList) 131. 132. /用于计算每个元素出现的次数,key是元素,value是出现次数 133. DictionarydistinctDict=newDictionary(); 134. for(inti=0;iinputList.Count;i+) 135. 136. /这里没用trygetvalue,会计算两次hash 137. if(distinctDict.ContainsKey(inputList) 138. distinctDictinputList+; 139. else 140. distinctDict.Add(inputList,1); 141. 142.143. DictionarysortByValueDict=GetSortByValueDict(distinctDict); 144. returnsortByValueDict; 145. 49.150. 这里用到一个把一个字典按值的大小排序的方法GetSortByValueDict,代码如下,是泛型的 151. / 152. /把一个字典俺value的顺序排序 153. / 154. / 155. / 156. / 157. / 158. publicstaticDictionaryGetSortByValueDict(IDictionarydistinctDict) 159. 160. /用于给tempDict.Values排序的临时数组 161. VtempSortList=newVdistinctDict.Count; 162. distinctDict.Values.CopyTo(tempSortList,0); 163. Array.Sort(tempSortList);/给数据排序 164. Array.Reverse(tempSortList);/反转 165.166. /用于保存按value排序的字典 167. DictionarysortByValueDict= 168. newDictionary(distinctDict.Count); 169. for(inti=0;itempSortList.Length;i+) 170. 171. foreach(KeyValuePairpairindistinctDict) 172. 173. /比较两个泛型是否相当要用Equals,不能用=操作符 174. if(pair.Value.Equals(tempSortList)&!sortByValueDict.ContainsKey(pair.Key) 175. sortByValueDict.Add(pair.Key,pair.Value); 176. 177. 178. returnsortByValueDict; 179. 83.184. 对一个文章内出现的多个词进行消重是因为如果一个文章里堆叠关键词会影响本聚类关键词提取的准确性,所以要排重,算法如下,也是泛型的 185. / 186. /对一个数组进行排重 187. / 188. / 189. / 190. publicstaticIEnumerableGetDistinctWords(IEnumerablescanKeys) 191. 192. Ttemp=default(T); 193. if(scanKeys.Equals(temp) 194. returnnewT0; 195. else 196. 197. DictionaryfixKeys=newDictionary(); 198. foreach(TkeyinscanKeys) 199. 200. fixKeyskey=key; 201. 202. Tresult=newTfixKeys.Count; 203. fixKeys.Values.CopyTo(result,0); 204. returnresult; 205. 206. 207.208. 最后效果如下 209. Iteration0. 210. Iteration1. 211. -asp,net,- 212. aASP.NET自定义控件复杂属性声明持久性浅析 213. 控件开发显示控件内容 214. a介绍一个ASP.netMVC系列教程 215. a在中实现观察者模式,或有更好的方法(续) 216. aAsp.Net页面执行流程分析 217. -股民,印

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论