栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 前沿技术 > 人工智能 > NLP

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

NLP 更新时间:发布时间: 百科书网 趣学号



一、前言


前文介绍了词权重的计算方法,本篇介绍词权重的另一种应用:文本相似度计算。


二、算法原理


文本相似度计算的方法很多,我们这里通过计算“两篇文本中都出现的词汇的权重占比”来衡量相似的程度,具体计算公式如下:



词的权重利用前文中的公式获得:


三、代码实现


1、统计单篇文章的词汇权重

        /// 
        /// 更新文章的权重词典
        /// 
        /// 文章对象,定义了:标题、正文、权重词典
        /// 邻键集,用于生成词库
        /// 词库,用于分词
        /// 分词的最大词长
        /// 是否更新邻键集
        /// 是否更新词库
        public static void UpdateArticleWeight(ArticleMDL mdl, MemoryBondColl objKeyCharColl, 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、联系方式:

    2.1、QQ:老憨  244589712

    2.2、邮箱:gzdmcaoyc@163.com

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/834458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号