非主流自然语言处理——遗忘算法系列(五):文本相似度

来源:互联网 发布: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、联系方式:

    2.1、QQ:老憨  244589712

    2.2、邮箱:gzdmcaoyc@163.com




0 0