
一、前言
前文介绍了词权重的计算方法,本篇介绍词权重的另一种应用:文本相似度计算。
二、算法原理
文本相似度计算的方法很多,我们这里通过计算“两篇文本中都出现的词汇的权重占比”来衡量相似的程度,具体计算公式如下:
词的权重利用前文中的公式获得:
三、代码实现
1、统计单篇文章的词汇权重
////// 更新文章的权重词典 /// /// 文章对象,定义了:标题、正文、权重词典 /// 邻键集,用于生成词库 /// 词库,用于分词 /// 分词的最大词长 /// 是否更新邻键集 /// 是否更新词库 public static void UpdateArticleWeight(ArticleMDL mdl, MemoryBondCollobjKeyCharColl, MemoryItemColl objKeyWordColl, int maxWordLen = 7, bool bUpdateCharBondColl = true, bool bUpdateKeyWordColl = true) { //引用文章对象中的权重字典,用于存放统计文章中各词的权重 Dictionary objKeyWordDict = mdl.KeyWeightDict; //标题分词 List objKeyTitleList = SegmentDAL.Segment(mdl.Title, objKeyCharColl, objKeyWordColl, maxWordLen, bUpdateCharBondColl, bUpdateKeyWordColl); //内容分词 List objKeyContentList = SegmentDAL.Segment(mdl.Content, objKeyCharColl, objKeyWordColl, maxWordLen, bUpdateCharBondColl, bUpdateKeyWordColl); //遍历标题中的每个词 foreach (string keyWord in objKeyTitleList) { //权重字典中不存在该词 if (!objKeyWordDict.ContainsKey(keyWord)) { //往词典中新增一个零权重的词 objKeyWordDict.Add(keyWord, 0); } //如果词库包含该词则累加(不包含则权重为零) if (objKeyWordColl.Contains(keyWord)) { //计算并累加一个词的权重 objKeyWordDict[keyWord] += -Math.Log(objKeyWordColl[keyWord].ValidCount / objKeyWordColl.MinuteOffsetSize); } } //遍历正文中的每个词,处理过程同标题 foreach (string keyWord in objKeyContentList) { if (!objKeyWordDict.ContainsKey(keyWord)) { objKeyWordDict.Add(keyWord, 0); } if (objKeyWordColl.Contains(keyWord)) { objKeyWordDict[keyWord] += -Math.Log(objKeyWordColl[keyWord].ValidCount / objKeyWordColl.MinuteOffsetSize); } } }
2、计算两篇文章的相似度
////// 计算两篇文章的相似度 /// /// 源文章对象 /// 目标文章对象 public static void CalcArticleSimilarity(ArticleMDL src, ArticleMDL des) { //获取两篇文章中共同出现的词 var share = src.KeyWeightDict.Keys.Intersect(des.KeyWeightDict.Keys); //累加两篇文章所有共同出现的词的权重 double shareValue = share.Sum(x => src.KeyWeightDict[x] + des.KeyWeightDict[x]); //计算两篇文章中所有词的权重 double totalValue = src.KeyWeightDict.Sum(x => x.Value) + des.KeyWeightDict.Sum(x => x.Value); if (totalValue <= 0) des.Similarity = 0; //所有词权重为空时,相似度为零(预防零分母) else des.Similarity = shareValue / totalValue; //计算共有词的权重占比 }
四、演示程序
下载地址:遗忘算法(新闻相似度)演示程序.rar
感谢中科点击授权此演示程序开源。
五、技术交流及业务
本系列文以介绍各项基础技术的实现为主,更多综合应用或项目开发,请移步入群或联系本人:
1、技术QQ群: 217947873
2.1、QQ:老憨 244589712
2.2、邮箱:gzdmcaoyc@163.com