非主流自然语言处理——遗忘算法系列(五):文本相似度
来源:互联网 发布:cnc数控编程招聘 编辑:程序博客网 时间:2024/05/22 13:39
一、前言
前文介绍了词权重的计算方法,本篇介绍词权重的另一种应用:文本相似度计算。
二、算法原理
文本相似度计算的方法很多,我们这里通过计算“两篇文本中都出现的词汇的权重占比”来衡量相似的程度,具体计算公式如下:
词的权重利用前文中的公式获得:
三、代码实现
1、统计单篇文章的词汇权重
/// <summary> /// 更新文章的权重词典 /// </summary> /// <param name="mdl">文章对象,定义了:标题、正文、权重词典</param> /// <param name="objKeyCharColl">邻键集,用于生成词库</param> /// <param name="objKeyWordColl">词库,用于分词</param> /// <param name="maxWordLen">分词的最大词长</param> /// <param name="bUpdateCharBondColl">是否更新邻键集</param> /// <param name="bUpdateKeyWordColl">是否更新词库</param> public static void UpdateArticleWeight(ArticleMDL mdl, MemoryBondColl<string> objKeyCharColl, MemoryItemColl<string> objKeyWordColl, int maxWordLen = 7, bool bUpdateCharBondColl = true, bool bUpdateKeyWordColl = true) { //引用文章对象中的权重字典,用于存放统计文章中各词的权重 Dictionary<string, double> objKeyWordDict = mdl.KeyWeightDict; //标题分词 List<string> objKeyTitleList = SegmentDAL.Segment(mdl.Title, objKeyCharColl, objKeyWordColl, maxWordLen, bUpdateCharBondColl, bUpdateKeyWordColl); //内容分词 List<string> 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、计算两篇文章的相似度
/// <summary> /// 计算两篇文章的相似度 /// </summary> /// <param name="src">源文章对象</param> /// <param name="des">目标文章对象</param> 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
0 0
- 非主流自然语言处理——遗忘算法系列(五):文本相似度
- 非主流自然语言处理——遗忘算法系列(一):算法概述
- 非主流自然语言处理——遗忘算法系列(二):大规模语料词库生成
- 非主流自然语言处理——遗忘算法系列(三):分词
- 非主流自然语言处理——遗忘算法系列(四):关键词提取
- (转)非主流自然语言处理——遗忘算法系列(二):大规模语料词库生成
- 自然语言处理(五 文本相似度)
- 自然语言处理入门(1)——文本相似度计算
- python自然语言处理-----计算文本相似度
- 自然语言处理的中文文本相似度
- 自然语言处理(2)——文档相似度计算
- 文本分析系列——基于相似哈希信息指纹的文本相似度算法
- 【python】python自然语言处理-----计算中文文本相似度
- Python自然语言处理第二章-2.5WordNet(IV)——语义相似度
- python与自然语言处理(五):中文文本词云
- 自然语言处理(1)——文本分词
- 自然语言处理1---文本预处理(删除非文本,非数字字符)
- 文本相似度算法
- Android 解决65535的限制 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- Code Forces 601 B. Lipshitz Sequence(单调栈)
- Linux命令大全
- 工业4.0的来临,你如何应对!
- map的简单用法
- 非主流自然语言处理——遗忘算法系列(五):文本相似度
- AEAI WM V1.0 工作管理系统开源发版
- iPhone屏幕尺寸、分辨率及适配
- 数字图像处理作业之MATLAB操作现象思考
- 一种选择界面
- T-SQL动态查询(4)——动态SQL
- [LeetCode315]Count of Smaller Numbers After Self
- 实例启动过程 11g rac
- 计算两直线交点