• 2020年数维杯数学建模A题舆情监测情感倾向分析建模求解全过程文档及程序


    2020年数维杯数学建模

    A题 舆情监测情感倾向分析建模

    原题再现:

      公共危机事件爆发时,如拍石击水,相关信息在短时间内迅速传播,引起群众的广泛关注。其中负面报道或者主观片面的一些失实评判常常在一定程度上激发人们普遍的危机感,甚至影响到政府及公共单位的公信力,影响到企业的形象及口碑。如果不及时采取正确的措施分析和应对,将对相关部门或者企业造成难以估计的后果。所以关注相关舆情对政府或者企业来说非常重要。
      情感倾向分析是舆情分析技术中的重要内容。通过舆情的情感倾向预测,有助于企业能够了解媒体或网民对相关事件或者品牌的舆情情感倾向分布和情感倾向趋势,同时能快速识别负面情感倾向的文章或评论,及时对口碑进行维护。
      请您针对舆情的情感倾向分析问题展开如下的分析建模:
      问题1:附件1中我们通过技术手段抓取了部分媒体或网民评论的数据,您能否提供一个针对某一主题的舆情筛选方法;
      问题2:您能否提供一个全新数据的抓取方法,其中尽量包含诸如发表时间、评论人数、关注人数及具体内容等具有深层次分析价值的数据;
      问题3:不同的舆情对不同的人群存在着不同的价值,期间不同的人员在舆情传播过程中起到了不同的作用。如果不能够合理的处理舆情,而是采用诸如删除评论等模式,则网民们可能还会以另外一种形式继续传播舆情。为此请大家提供一种能够合理引导网民们情感倾向逐步转向对政府或企业有利的干预方法;
      问题4:不同舆情的传播速度具有一定的差异,管理部门检测到的舆情时间点并不固定,对于政府或企业而言对处于不同阶段的舆情需要进行干预的等级不同,您能否提供一个充分考虑疫情传播时间、规模及网民情感倾向的舆情处理等级的划分方法。

    整体求解过程概述(摘要)

      网络舆情作为社会舆情的网络反映,成为社会舆情的最主要的构成之一。如何对舆情的情感倾向分析,并正确引导舆情,给政府和企业带来了前所未有的挑战。
      针对问题 1,本文首先对附件 1 中数据进行预处理,得到可供模型使用的语料库。然后利用 LDA 主题聚类模型对附件语料进行初步聚类,得到每一簇语料的簇关键词。同时,利用附件语料训练得到 Word2Vec 模型,将筛选主题的关键词和聚类得到的簇关键词输入到 Word2Vec 模型得到主题关键词以及簇关键词的表征向量,进而求得这些向量之间的余弦相似度,从而将筛选范围限制在相似度最高的一簇语料内,达到舆情信息初步筛选的目的。最后通过计算输入关键词与该簇中语料的相似度,实现最终的舆情信息筛选。
      针对问题 2,本文首先设计了用于数据采集的网络爬虫,以实现对网页快速地采集。然后设计了基于网页布局相似度及模块面积大小的加权算法,完整地从网页中抽取了包括标题、正文、时间等与主题内容密切相关的信息。
      针对问题 3,本文提出了基于对抗神经网络的文本生成干预方法,采用 GAN 模型,并加入主体和情感记忆向量,通过设置多个分类器进行多任务博弈训练,从而生成关于特定主体且融合特定情感的文本,并以发帖或者回帖的方式对网民进行认知干预。
      针对问题 4,采用了建立在主曲线排序理论基础上的无监督排序学习算法。首先构建了一个科学系统的舆情事件演化趋势评价指标体系,将舆情危机设为五个等级。然后采用无监督排序学习算法,得到舆情事件的安全态势评分,评估事件危机等级。

    问题分析:

      问题 1 要求提供一个针对某一主题的舆情筛选方法,即针对某一主题下的一个或多个关键词进行舆情信息的筛选。本文提出了一种基于 Word2Vec 以及 LDA
    主题聚类的舆情信息筛选模型,首先利用 LDA 模型对附件语料进行初步聚类,得到每一簇语料的簇关键词。同时,利用附件语料训练得到 Word2Vec 模型,通过该模型可以得到输入主题关键词以及簇关键词的表征向量,进而求得向量之间的余弦相似度,从而将筛选范围限制在某一簇内,达到舆情信息初步筛选的目的。最后通过计算输入关键词与该簇中语料的相似度,实现最终的舆情信息筛选。
      问题 2 要求设计一个全新数据的抓取方法。舆情数据的抓取包含数据的网页采集和网页信息的抽取两个部分。舆情数据采集属于 Web 信息采集的范畴。数据采集的主要方法就是通过网络爬虫来自动在互联网上爬取网页,爬虫程序利用网页之间的链接关系,从一些种子链接出发扩展到整个互联网,将满足条件的网页收集起来,通过在线(网页被下载后)或离线(网页被保存后)的方式,集中进行进一步的分析处理。舆情数据采集得到的网页含有大量噪声,真正有用的舆情数据往往淹没在噪声中,因此需要通过数据抽取来获取舆情数据。本文采用元数据来描述舆情信息,包含标题、作者、内容、时间、点击量、评论数、评论内容等数据,这些数据是舆情数据抽取中主要的对象。针对此,采用无监督的 Web 信息抽取,从网页的布局角度出发,利用影响网页的布局结构的 HTML 标签,通过查找网页内部相似的布局结构及板块的面积来确定各个主题信息块,再从主题信息块中提取出元数据,有效提高抽取的效率和准确率。
      问题 3 希望我们能提出一种对政府和企业有利的干预方法,来合理引导网民的感情倾向。删除评论的方式通常具有权限受限、工作量大等缺陷,因此本文采
    用一种疏导的方法——文本引导,即在有负面情绪的评论下面跟正面情绪的帖,引导网民走向正面的情感倾向,以此改善网络负面氛围。本文建立了融合情感的干预文本生成模型,采用 GAN 模型,并加入主体和情感记忆向量,通过设置多个分类器进行多任务博弈训练,从而生成关于特定主体且融合特定情感的文本。
      问题 4 要求提供一个舆情处理等级的划分方法。为了实现对舆情事件的及时反应和正确应对,首先要构建科学系统的舆情事件演化趋势评价指标体系,采用合理的指标体系,将不同性质、不同发展阶段的舆情事件进行量化,并对舆情事件的演化趋势进行准确判断。在此基础上,将舆情演化趋势评估任务转化为排序学习进行研究,即通过比较得出舆情事件的演化趋势重要性排序,从而定量地评判网络舆情的安全态势,建立预警模型。

    模型假设:

      假设 1:附件中所提供的文本都是有效的,即不存在无语义、不通顺的样本
      假设 2:问题中所针对的舆情信息来源网站是可爬取的,即不存在由于反爬措施导致的字段缺省情况。
      假设 3:当网民看到与自己情感倾向相反的干预文本时,其情感会向干预文本的导向发生转变。
      假设 4:为了解决问题 3 中的情感干预问题,本文假设已经提供了充足的具有正负情感的语料库。

    模型的建立与求解

      本文提出了一种基于 Word2Vec 以及 LDA 主题聚类的舆情信息筛选模型,如图 5-1。首先对附件 1 中的数据进行预处理,然后利用 LDA 模型对附件语料进行初步聚类,得到每一簇语料的簇关键词。同时,利用附件语料训练得到Word2Vec 模型,通过该模型可以得到输入关键词以及簇关键词的表征向量,进而求得向量之间的余弦相似度,从而将筛选范围限制在某一簇内,达到舆情信息初步筛选的目的。最后通过计算输入关键词与该簇中语料的相似度,实现最终的舆情信息筛选。
    在这里插入图片描述
      (一)数据预处理
      附件 1 中的数据需要经过分词、剔除停用词等预处理才能成为供后续模型、使用的语料库。本文使用 jieba 提供的函数实现停用词的提出以及进一步的分词处理。
      (二)LDA 主题聚类
      聚类是数据挖掘的重要工具, 通过对无标记的大型数据进行分析, 根据样本之间的相似情况进行分组, 使组内的数据之间彼此性质互相靠近, 而组间数据相似距离较大。由于这种自动分类方法所具有的"无监督"性, 从而使聚类方法在海量信息处理、基因数据分析、模式识别等领域中得到极大的应用。该方法通过引入文本主题分布大大降低了数据的维度,同时模型的参数空间规模是固定的,与文本集自身规模无关,因此更适用于大规模文本集。本文即采用 LDA 模型实现文本主题聚类以及关键词挖掘。
    在这里插入图片描述
      (三)Word2Vec 模型训练
      Word2Vec 工具摒弃了传统方法的 one-hot 编码方式,实质上是一个两层神经网络,将一个词语对应一个多维向量,通过该多维向量允许我们用变化较小的数字来表征词语,通过欧氏距离或者余弦相似度就可以把相近意思的词语放在相近的位置, 而且一般用的是实数向量.通过将所有的词向量化,词与词之间就可以定量的度量他们之间的关系。
      Word2Vec 包括 CBOW 模型和 skip-gram 模型,前者是根据上下文预测当前词语概率,后者则通过当前词预测上下文概率。本文选取 Word2Vec 里的 skip-gram 词向量模型将文本转换为词向量。给定针对某一主题的关键词集合𝒦̃后,通过寻找与主题关键词语义最相近的簇关键词集合𝒦∗,并将该簇作为初步舆情信息筛选的结果。为了能够计算这两者之间的相似度,首先需要利用 2.1 中划分好的语料库训练 Word2Vec 模型,通过训练好的 Word2Vec 模型,分别得到两者的低维表征向量,进而计算相似度。该部分模型如下图 5-3 所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    模型的验证与结果

    在这里插入图片描述
      以第一组数据为例,当在程序中输入关键词“汽车、性价比”时,模型从附件1 中输出了以相关度排序的一系列语料。为了验证模型的正确性,我们挑选出与关键词相关度最高的语料文本 a,然后分别输入句 1(包含关键词):“奥迪汽车性价比太低”、句 2(不包含关键词)“吃菜有益身体健康”两个句子,输出句 1 与文本 a、句 2 与文本 a 的相关度结果。很明显句 1 与文本 a 的相关度应该高于句 2与文本 a 的相关度,而实验结果显示句 1 与文本 a 的相关度为 64.96%,明显高于句 2 与文本 a 的相关度 35.53%,与认知相符合,说明我们的模型具有可行性。
    在这里插入图片描述

    模型的求解

      (一)舆情数据采集
      网络爬虫的基本原理很简单,从给定的种子链接出发,向 Web 服务器发送HTTP 请求(本文只讨论 HTTP 协议),获取网页内容,并从中分析出所有链接,依据一定的算法从中选取某些链接添加到下载队列中,重复这个过程直到满足停止条件。其工作的基本流程如图 5-6 所示。
      (二)舆情数据抽取
      在进行舆情数据抽取时,我们主要关心发表时间、评论人数、关注人数及具体内容等具有深层次分析价值的元数据,包含这些内容的区域称为网页的主题信息块。为了快速,准确地从网页中提取出元数据,我们采用分级处理的方式,主要包括两个步骤:
      (1)网页级处理,滤除整体噪声,识别出主题信息块;
      (2)区域级处理,滤除局部噪声,从主题信息块中提取出元数据。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      B、元数据提取
    在这里插入图片描述
      对于具有相同布局的网站簇,如百度贴吧下的各个贴吧子站点,本文直接编写合适的爬虫进行所需信息的爬取,如发布日期、回复人数等。这类网站通常具有稳定的结构特征,因此采用常规的爬虫手段进行信息爬取即可。以“考试”为主题关键词,针对这种情况本方法在贴吧类的站点中爬取结果如图 5-8。可以看到该情况下本方法设计的爬虫能够将所需的舆情信息完整的爬取下来,具有极高的参考价值。
    在这里插入图片描述
      针对不同布局的网站,根据本文提出的基于网页布局相似度及模块面积大小的加权算法,本文实现了从不同布局的网站中爬取相同字段的爬虫,选取贴吧、百度搜一搜作为爬取站点验证算法有效性,爬取结果如图 5-9。通过图 5-9 可以观察到,根据本文方法编写的爬虫可以同时满足百度搜索和百度贴吧的信息爬取,内容包括 url、标题、正文、发布时间以及评论数。证明了本文爬取方法的有效性。
    在这里插入图片描述
      针对问题 3,本文提出了文本引导模型,如图 5-10。收集社交网络中热点事件的全部博文作为源语料集,根据舆情事件管理需要,通过融合情感的干预文本生成模块生成与网络负面文本对抗的观点,然后发表在评论下,实现对网民的情感倾向的引导。比如甲评论:“我很讨厌 xxx”,则在评论下面评论:“xxx 很好”。从 web 抽取源语料已经在问题 2 中得到很好的解决,因此我们接下来主要介绍干预文本生成模块的求解。
    在这里插入图片描述
      干预文本生成模块旨在生成针对目标主体的特定情感倾向的文本,从而更具针对性和贴合性地对目标主体进行干预。干预文本生成模块采用 GAN 模型的多任务训练方式,分为构造分类器(判别器)和生成器判别器博弈训练两部分,如图 5-11。
    在这里插入图片描述
    (一)分类器构造
    在这里插入图片描述
    在这里插入图片描述
      (二)生成模型训练与推理
      文本生成模型包括一个生成器和三个对抗训练的判别器,生成器生成和语料句子分面相同、观点对抗的文本,三个判别器区分生成器生成的句子和源语料句子,如此反复对抗训练,直到三个判别器均无法区分生成器生成的句子和源语料句子。
      A、文本生成模型训练阶段
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      B、文本生成模型推理过程
    在这里插入图片描述

    模型的验证与结果

      (一)数据集
      模型训练数据集由微博、论坛、新闻网站等社交媒体上爬取的 2019 年热点舆情事件的网络发帖组成,分别有不同的舆情事件语料,部分见表 5-2:
    在这里插入图片描述
    (二)测试结果分析
      以 2019 年 3 月 24 日至 3 月 26 日发生的‘男子穿“和服”进武大赏樱遭殴打’事件为例进行融合情感的干预文本生成方法测试。
      在本事件中,主要有‘穿和服男子’以及‘武汉大学’两个分面主体,分别存在的观点有:
      观点 1: 主体为穿和服男子,情感倾向为负向,认为该男子穿和服严重冒犯了我国的民族情结和勿忘国耻的爱国情怀。
      观点 2: 主体为武汉大学,情感倾向为负向,武汉大学作为中国甚至世界一流大学,包容性不足,表现了狭隘的民族主义倾向。
      观点 3: 主体为武汉大学,情感倾向为正向,肯定和支持武汉大学的做法,认为需要有自己的原则。
      对该事件生成融合情感的认知干预的文本,主要包括生成上述两个主体的正负情感倾向的观点,生成的部分干预文本见表 5-3。从测试结果分析可得,融合情感的干预文本基本满足特定主体和情感倾向要求,也基本符合正确的语言语法规律。
    在这里插入图片描述
      针对问题四,首先构建一个科学系统的舆情事件演化趋势评价指标体系,然后采用无监督排序学习算法,得到舆情的安全态势。如图 5-13 所示,可以看出是一个典型的“输入—处理—输出”的过程。输入是指标体系的实际值,输出是要得到的结果,即舆情事件的演化安全态势评分,中间的处理部分是采用排序学习算法。
    在这里插入图片描述

    模型的求解

      (一)评价指标体系的建立
      在查阅文献的基础上,以“因人”“因事”“因势”为中心构建舆情事件指标体系,包括基本指标和进阶指标。基本指标是指可以由舆情数据集直接计算得到的指标,例如参与人数量,舆情事件传播速度(以单位时间内新增帖子数量来表征)等;进阶指标是指需要引入外部信息辅助计算才能得到的指标,例如舆情事件的敏感度,事件的倾向性等。体系如图 5-14 所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      (二)排序学习算法的建立
      根据监督形式的主曲线排序理论,利用贝塞尔曲线得到排序学习算法,排序学习算法的伪代码如下所示:
    在这里插入图片描述
      (三) 舆情事件的安全态势评分
      本文根据网络舆情危机的严重程度、紧急程度、可控性和影响范围等因素,将预警等级设为五个等级:安全、轻警、中警、重警、巨警;分别用绿色、蓝色、黄色、橙色、红色信号表示。
      根据模型的输出安全态势分数划定事件的等级:1—20 分为安全,此时要居安思危,防范于未然,实时监控网络信息;21—40 为轻警,分析引起危机的缘由。官方机构要实事求是地调查事情真相,并在第一时间向民众告知真相,联合各大新闻网站进行舆情疏导;41—60 为中警,此时严密监控网民情绪,并大幅度、频繁地进行新闻发布、媒体联动,不断地消除网民的疑惑、负面声音,掌握舆论并进行舆论引导;61—80 为重警,表明网络上的关于危机主体的观点大都是负面观点,此时相关部门要高度重视,采取一定的手段解除此时的危机状态,安抚民众此时高涨的情绪,避免转化成行为舆论如游行示威、罢工群斗、动乱等;81—100 为巨警,此时状态已达危机最高警戒,一不小心就面临崩溃,极有可能产生行为舆论、不可抑制的后果。此时相关的所有部门要联合起来,有效指挥,尽力挽回损失。最好的方法还是开诚布公、信息透明,让民众了解到事情真相,并把民众的情绪引导到关注好的另一方面,相关部门要彻查此事件,出台相关政策,彻实贯彻以人为本的方针,寻根溯源,标本兼治。

    论文缩略图:

    在这里插入图片描述
    在这里插入图片描述

    程序代码:

    from gensim.models.word2vec import Word2Vec
    import math
    import json
    import numpy as np
    import time
    from read_file import *
    import os
    import jieba
    import jieba.posseg as jp
    from gensim import corpora, models
    from read_file import *
    from word2vec_2 import doc_vec
    from similarity_1 import *
    import csv
    import codecs
    # Global Dictionary
    # ------------构建语料库--------------#
    path = 'data/data_A.csv'
    yuliao_path_train = 'data/yuliao_train.txt'
    yuliao_path_test = 'data/yuliao_test.txt'
    documents = read_file(path).tolist()
    new_words = ['奥预赛', '折叠屏'] # 新词
    stopword_file_path = 'stopword.txt'
    stopwords = stopword_file(stopword_file_path)
    synonyms = {'韩国': '南朝鲜', '传言': '流言'} # 同义词
    stopwords.append('\n')
    topK = 20
    def remove_stopwords(ls): # 去除停用词
     return [word for word in ls if word not in stopwords]
    def replace_synonyms(ls): # 替换同义词
     return [synonyms[i] if i in synonyms else i for i in ls]
    path = 'data/data_A.csv'
    documents = read_file(path).tolist()
    isExists = os.path.exists(yuliao_path_train)
    if not isExists:
    words_ls = []
     print('开始构建语料库...')
     # with open(yuliao_path_train,'w') as f:
     memory_0 = {}
     for i,text in enumerate(documents):
     words = replace_synonyms(remove_stopwords([w.word for w in jp.cut(text)]))
     words_ls.append(words)
     memory_0[text] = words
     if i % 50 == 0:
     print('#:' + str(i) + '/' + str(len(documents)))
     write_file(yuliao_path_train,words_ls)
     memory_1,memory_2 = doc_vec()
     memory_3 = cal_similarity()
     sen2score = {}
     for key in memory_0.keys():
     sen2score[key] = memory_3[memory_1[memory_0[key]]] 
     
    else:
     n_dim=300 #向量维度
     print('语料库已经存在')
     memory_0 = {}
     memory_00 = {}
     with open(yuliao_path_train,'r') as f: #读数据
     train_data_list=f.read().strip().split('\n')
     print('构建 memory_0...')
     for i,sen in enumerate(documents):
     memory_0[train_data_list[i]] = sen
     memory_00[sen] = train_data_list[i] 
     if i % 10000 == 0:
     print('#:' + str(i) + '/' + str(len(documents)))
     print('memory_0 构建完毕') 
     memory_1,memory_2 = doc_vec(yuliao_path_train,'data/senvec300.json')
     memory_3 = cal_similarity([' 汽车',' 性价比','年轻人'])
     rank_senvec = {}
     sen2score = []
     print('构建 sen2score...') 
     for key in memory_3.keys():
     sen2score.append([memory_0[key],memory_3[key]])
     print('sen2score 构建完毕') 
     sen2score = sorted(sen2score,key=lambda x:x[1],reverse=True)
    for i,sen in enumerate(sen2score[:topK]):
     tmp1 = memory_00[sen[0]]
     rank_senvec[sen[0]] = memory_2[tmp1]
     sen_test = ['福克斯汽车的性价比太低了,不如选择购买奥迪,奥迪才是年轻人应该开的
    品牌','多吃蔬菜有益身体健康']
     #把 rank_sentence 和 sen_test 分别分词
     words_ls = []
     print('开始对测试集分词...')
     # with open(yuliao_path_train,'w') as f:
     memory_0 = {}
     for i,text in enumerate(sen_test):
     words = replace_synonyms(remove_stopwords([w.word for w in jp.cut(text)]))
     words_ls.append(words)
     # memory_0[words[0]] = text
     if i % 50 == 0:
     print('#:' + str(i) + '/' + str(len(sen_test)))
     print(words_ls)
     w2v_model = Word2Vec.load('model/w2v_model_300.pkl') # 加载训练好的Word2Vec 模
    型
     vector_dt=[] #句子:句子向量
     print('开始构建文本对应的向量...')
     for i,index in enumerate(words_ls):
     senvec=build_sentence_vector_weight(words_ls[i], n_dim, w2v_model)
     vector_dt.append(senvec.tolist())
     if i % 1000 == 0:
     print('#:' + str(i) + '/' + str(len(words_ls))) 
     print('文本向量构造完毕')
     # print(vector_dt)
     dist = []
     for vec in vector_dt:
     dist.append(np.sum(cosine_similarity(vec, list(rank_senvec.values())[0])))
    print(dist)
    Word2vec.py
    from gensim.models.word2vec import Word2Vec
    import math
    import json
    import numpy as np
    import time
    import os
    # 构建 word2vec 模型,词向量的训练与生成
    def get_dataset_vec(dataset,n_dim):
     w2v_model = Word2Vec(dataset, sg=1, size=n_dim, min_count=0, hs=1,iter=10) # 初
    始化模型并训练
     w2v_model.save('model/w2v_model_300.pkl') # 保存训练结果
    # 对每个句子的所有词向量取均值,来生成一个句子的 vector
    def build_sentence_vector_weight(sentence, size, w2v_model):
     sen_vec = np.zeros(size).reshape((1, size))
     count = 0
     for word in sentence:
     try:
     sen_vec += w2v_model[word].reshape((1, size))
     count += 1
     except KeyError:
     continue
     if count != 0:
     sen_vec /= count
     return sen_vec
    # 将文本数据转换为文本向量
    def doc_vec(path_yuliao,path_senvec):
     memory = {}
     n_dim=300 #向量维度
     with open(path_yuliao,'r') as f: #读数据
     train_data_list=f.read().strip().split('\n')
     #将数据转换为[[词,词,词],[词,词,词],[词,词,词]]形式
     train_data=[]
     print('构造 train_data_list...')
     for i,sen in enumerate(train_data_list):
     memory[str(sen.split(','))] = sen
     train_data.append(sen.split(','))
     if i % 1000 == 0:
     print('#:' + str(i) + '/' + str(len(train_data_list))) 
     print('train_data_list 构造完毕')
     # print (train_data)
     isExists = os.path.exists('model/w2v_model_300.pkl')
     if not isExists:
     get_dataset_vec(train_data,n_dim) #训练模型
     print('模型训练完毕')
     else:
     print('加载已有模型')
     w2v_model = Word2Vec.load('model/w2v_model_300.pkl') # 加 载 训 练 好 的
    Word2Vec 模型
     #print(model.wv.index2word())
     isExists = os.path.exists(path_senvec)
     if not isExists:
     vector_dt={} #句子:句子向量
     print('开始构建文本对应的向量...')
     for i,index in enumerate(train_data):
     # print(index)
     senvec=build_sentence_vector_weight(train_data[i], n_dim, w2v_model)
     vector_dt[train_data_list[i]]=senvec.tolist()
     if i % 1000 == 0:
     print('#:' + str(i) + '/' + str(len(train_data))) 
     print('文本向量构造完毕')
     #将句子及其向量以字典的形式存入 json 文件
     with open(path_senvec,'w') as f:
     json.dump(vector_dt, f)
     else:
     print('加载已有词向量')
     with open(path_senvec, 'r') as f:
     vector_dt = json.load(f) #将所有句子及其向量下载下来
     return memory,vector_dt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    词库查重相似性检验算法
    from gensim.models.word2vec import Word2Vec
    import json
    from sklearn.metrics.pairwise import cosine_similarity
    import numpy as np
    from gensim.models.doc2vec import Doc2Vec, TaggedDocument
    # import jieba
    # 加载训练好的模型
    def build_sentence_vector_weight(sentence, size, w2v_model):
     sen_vec = np.zeros(size).reshape((1, size))
     count = 0
    for word in sentence:
     try:
     sen_vec += w2v_model[word].reshape((1, size))
     count += 1
     except KeyError:
     continue
     if count != 0:
     sen_vec /= count
     return sen_vec
    def cal_similarity(keyword):
     w2v_model = Word2Vec.load('model/w2v_model_300.pkl') # 加载训练好的Word2Vec 模with open('data/senvec300.json', 'r') as f:
     vector = json.load(f) #将所有句子及其向量下载下来
     print(len(vector))
     keyword=build_sentence_vector_weight(keyword,300,w2v_model) #获得每个关键词描述
    的向量
     threshold=0.6 #语义距离阈值
     dt={} #保存与关键词语义距离符合要求的句子及对应的距离,并存入 json 文件
     idx = 0
     print('开始计主题算关键词与文本之间的相似度...')
     for key in vector.keys():
     dist = np.sum(cosine_similarity(keyword, vector[key]))
     if dist>threshold:
     dt[key]=dist
     idx += 1
     if idx % 100 == 0:
     print('#:' + str(idx) + '/' + str(len(vector)))
     print('相似度计算完毕')
     f=open("result/result.json", mode="a", encoding="utf-8")
     json.dump(dt,f)
    return dt
    read_file.py
    import pandas as pd
    import numpy as np
    from gensim.corpora import WikiCorpus
    # import zhconv
    # import jieba
    def read_file(path):
    data_A = pd.read_csv(path,delimiter="\t")
    data_A = data_A.values
    data_B = np.unique(data_A)
    return data_B
    def write_file(path,data):
    with open(path,'w') as f:
    for ele in data:
    f.write(str(ele).replace('[','').replace(']','').replace('\'','')+'\n')
    def stopword_file(path):
    list_ = set()
    f = open(path)
    data = f.read().splitlines()
    f.close()
    return data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    高级架构师_Elasticsearch_第一章_Elasticsearch安装
    linux高频面试题目
    爬虫数据获取的秘诀,高效稳定让你爬个够
    商品分类代码
    51单片机的hello world之点灯
    快手视频批量下载.py(10月可以用)
    vue添加全局的 loading 加载图标,或者点击按钮之后禁用按钮
    【疯狂Java讲义】Java学习记录(IO流)
    如何判断一个js对象是否存在循环引用
    【大模型应用开发教程】动手学大模型应用开发,一起探索LLM Universe
  • 原文地址:https://blog.csdn.net/weixin_43292788/article/details/127647540