机器学习与深度学习——基于潜在语义分析(LSA)的文档相似度计算

news2024/11/24 17:21:09

机器学习与深度学习——基于潜在语义分析(LSA)的文档相似度计算

基于潜在语义分析(LSA)是一种使用数学和统计方法来分析文本数据的技术。该技术可用于发现文本之间的关系,以及为文本提供有关其含义的更深层次的信息。

下面是LDA模型的详细描述:

收集语料库:首先需要收集一个包含大量文本数据的语料库。这些文本可以是任何类型的,例如新闻文章、博客、论文等等。

构建词汇表:然后从语料库中提取所有不同的单词,并构建一份称为“词汇表”的列表。此外,还需要将每个单词映射到唯一的ID上。

创建文档-词频矩阵:接下来,需要将文本数据转换为数字形式。为此,可以创建一个称为“文档 - 词频”矩阵的矩阵,其中每行表示一个文档,每列表示一个单词。每个元素表示该单词在该文档中出现的次数。

进行奇异值分解(SVD):接下来,需要对文档 - 词频矩阵进行奇异值分解(SVD)。SVD是一种数学技术,可将矩阵分解为三个矩阵的乘积。这些矩阵包括一个表示文档的矩阵、一个表示主题的矩阵和一个表示单词的矩阵。

选择主题数量:选择要提取的主题数量,该数量通常是根据实验和经验来确定的。

提取主题:使用前面步骤中计算得到的主题矩阵和单词矩阵,可以提取文本数据中存在的主题。每个主题都表示一组相关联的单词,可以用于理解文本含义。

应用模型:基于提取的主题,可以应用该模型来进行各种任务,例如文本聚类、分类和信息检索等。

LDA模型使用SVD技术将文本数据转换为数字形式,并提供有关文本数据之间的相似性和含义的更深层次的见解。

下面我们通过一个案例来更进一步了解和学习LSA。

目的

  1. 使用Jieba库对句子进行中文分词,并输出分词结果
  2. 基于潜在语义分析(LSA)对18个docx文档进行文本相似度分析

基本思路

1、读取文档集合:从指定目录中读取所有的.docx文件,并将它们的内容存储在docs列表中。
2、对于每个文档,执行预处理操作(例如去除停用词、分词和词干提取等),并使用gensim库创建文档-单词矩阵
3、创建文档-单词矩阵:使用CountVectorizer将文档集合转换为文档-单词矩阵表示形式,其中每个元素表示相应文档中的单词出现次数。
4、训练 LSA 模型:使用TruncatedSVD进行降维操作,将文档-单词矩阵转换为潜在语义空间表示形式。
5、创建索引和相似度矩阵:使用MatrixSimilarity创建相似度矩阵,用于计算文档之间的相似度。
6、使用相似度矩阵计算文档相似度:选择一个目标文档,并计算该文档与其他文档的相似度。
7、输出与目标文档最相似的文档:打印目标文档的内容,然后按相似度从高到低的顺序,打印最相似的前10篇文档的索引、内容和相似度得分。

程序代码

使用LSA模型和相似度矩阵,对给定的18个docx文档集合进行相似度分析

import os
import docx
from gensim import corpora, models, similarities

#定义 docx_analysis 类(读取指定docx文件中的内容,并分析其中每个句子中包含的单词及其出现频率。)

class docx_analysis:
    def __init__(self, docx_path):
        self.docx_path = docx_path
        self.wds_freq = {}
        
    def local_record_wds(self, words):
        for wd in words:
            if wd in self.wds_freq:
                self.wds_freq[wd] += 1
            else:
                self.wds_freq[wd] = 1

    def analyze(self):
        doc = docx.Document(self.docx_path)
        for para in doc.paragraphs:
            sentences = para.text.split("。")
            for sent in sentences:
                words = sent.strip().split()
                self.local_record_wds(words)
                
# 读取文档集合
doc_dir = r'C:\Users\l\Desktop\机器学习与深度学习\LSA\lsa'
docs = []
for file in os.listdir(doc_dir):
    if file.endswith('.docx'):
        with open(os.path.join(doc_dir, file), 'rb') as f:
            doc = docx.Document(f)
            text = '\n'.join([para.text for para in doc.paragraphs])
            docs.append(text)

# 预处理文本,去除停用词、进行分词和词干提取等
stoplist = set('for a of the and to in'.split())
texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in docs]

# 创建词典和文档-单词矩阵
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

# 训练 LSA 模型
lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=10)

# 将文档映射到潜在语义空间中
corpus_lsi = lsi[corpus]

# 创建索引和相似度矩阵
index = similarities.MatrixSimilarity(corpus_lsi)

# 使用相似度矩阵计算文档相似度
doc_id = 0  # 选择第一个docx作为目标文档
sims = index[lsi[corpus[doc_id]]]
sims = sorted(enumerate(sims), key=lambda item: -item[1])


# 输出与目标文档最相似的文档
print(f'选择目标文档为第{doc_id+1}个docx :\n{docs[doc_id]}')
# 对目标文档进行分析和统计词频
target_doc_path = os.path.join(doc_dir, os.listdir(doc_dir)[doc_id])
da = docx_analysis(target_doc_path)
da.analyze()


# 输出目标文档的词频统计结果
print('\n目标文档词频统计结果:')
for word, freq in da.wds_freq.items():
    print(f'词语: {word}, 词频: {freq}')
print('\n相似文档:')
for doc_idx, sim_score in sims[1:11]:  # 最相似的前10篇文档
    print(f'相似文档索引——{doc_idx}: \n{docs[doc_idx]}文档相似度: {sim_score}')

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

基于潜在语义分析(LSA)的优点和缺点。
优点:

  • LSA假设隐藏在词语中的隐含意思 (也就是潜在语义空间的这些语义维)可以更好地刻画文本真实含义。
  • LSA利用潜在的语义结构表示词条和文本,将词条和文本映射到同一个k维的语义空间内,均表示为k个因子的形式,向量的含义发生了很大的变化。它反映的不再是简单的词条出现频率和分布关系,而是强化的语义关系。在保持了原始的大部分信息的同时,克服了传统向量空间表示方法时产生的多义词、同义词和单词依赖的现象。

缺点:

  • LSA不是概率模型,缺乏严谨的数理统计基础。
  • LSA解决部分一词多义和一义多词问题,也可以用于降维,但LSA不是概率模型,缺乏严谨的数理统计基础。建议考虑隐含狄利克雷分布(Latent Dirichlet allocation,简称LDA),一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【twcc】学习1:cc-feedback包构造及其接收处理

我的代码是m79,大神的代码看起来比我的新。核心的 ProcessTransportFeedbackInner 竟然没有找到。 webrtc源码分析(8)-拥塞控制(上)-码率预估 再次膜拜一下大神的分析。 本文大量引用大神的论述。 cc-controller下最重要的几个函数来介绍码率控制的核心过程,其分别是OnProce…

perf之cpu性能计数器

在win10主机上的VMware虚拟机里的centos7执行 perf list cache,显示空: [workcontrol-plane ~]$ perf list cache List of pre-defined events (to be used in -e): [workcontrol-plane ~]$ 原因是cpu cache的计数需要硬件支持,在虚拟机里…

使用omp和mpi并行技术实现蒙特卡罗算法实验 (MonteCarlo)

蒙特卡洛算法思想: 画一个正方形和一个内切圆然后在图形上面随机撒点,数一下落在圆 内和正方形内的点的数量之比,就是二者面积之比, 也就是π/4。 大数定理告诉我们,随着样本数量的增大,我们用这种方式模拟出来的值应该是越来越…

玩转电脑|带你了解如何快速查看电脑开关机时间

目录 前言 1、打开管理 2、打开事件查看器 3、打开windows日志 5、获取开机事件 6、获取关机事件 7、保存事件 8、保存事件文件 9、打开事件文件 前言 最近因为一些原因作者想要查看自己电脑每天的的开关机时间记录,但是不知道怎么进行查看,于是在网…

C++重温笔记(十): C++输入输出流

1. 写在前面 c在线编译工具,可快速进行实验: https://www.bejson.com/runcode/cpp920/ 这段时间打算重新把c捡起来, 实习给我的一个体会就是算法工程师是去解决实际问题的,所以呢,不能被算法或者工程局限住,应时刻提…

龙智携手Atlassian亮相DevOps国际峰会:释放团队潜力,以协作挑战不可能

2023年6月29日到30日,龙智将亮相DevOps国际峰会 北京站213展位。本次参展,我们将呈现Atlassian ITSM、DevOps以及工作管理三大解决方案,帮助您释放团队的力量,将不可能变成可能。 立即预约龙智专家面对面交流>>> 龙智自…

BuildAdmin商业级后台管理系统

🚀 CRUD代码生成 图形化拖拽生成后台增删改查代码,自动创建数据表,大气实用的表格、多达22种表单组件支持、拖拽排序、受权限控制的编辑和删除、支持关联表等等,可为您节省大量开发时间。[ 视频介绍 | 使用文档 ] 💥 内置WEB终端 我们内置了WEB终端以实现一些理想中的…

[算法前沿]--019-医学AIGC大模型的构建

基于主动健康的主动性、预防性、精确性、个性化、共建共享、自律性六大特征[1],华南理工大学未来技术学院-广东省数字孪生人重点实验室开源了中文领域生活空间主动健康大模型基座ProactiveHealthGPT,包括:(1) 经过千万规模中文健康对话数据指令微调的生活空间健康大模型扁鹊…

绿色零碳节群硕获奖,为可持续发展提供数字化抓手

6月15日,为探索迈向碳中和之路,第二届国际零碳节暨2023ESG领袖峰会盛大召开。各大绿色品牌与科技集团纷纷现身北京,展示低碳生产与绿色发展的科技成果。群硕也携带创新数字化产品与解决方案亮相国际绿色零碳节,并荣获2023绿色可持…

文献阅读:智能网联环境下面向语义通信的资源分配

目录 智能网联环境下面向语义通信的网络架构模型驱动和数据驱动资源分配算法对比计算卸载和协同计算未来研究方向参考文献 智能网联环境下面向语义通信的网络架构 车辆借助车联网将基于语义理解的计算任务进一步卸载到计算资源丰富的移动边缘计算服务器(通常部署在路…

忆联主导消费级存储权威标准制定,推动行业规范化发展

近日,由记忆科技旗下公司忆联主导的团体标准《消费级固态硬盘可靠性及环境适应性规范》(以下简称:规范)研讨会顺利召开。此次会议完善了《规范》中的相关内容与细节,以确保消费级固态硬盘在可靠性方面能更进一步地满足…

沙利文头豹研究院发布《2023年腾讯云数据安全能力中心分析报告》

2023年6月15日,分析机构沙利文(Frost & Sullivan)头豹研究院发布《2023年腾讯安全数据安全能力中心分析报告》(下文简称:报告),报告针对腾讯安全在数据安全领域的解决思路、产品、安全体系、…

在微信公众平台注册一个小程序开发账号

我们先访问地址 https://mp.weixin.qq.com/ 进入微信公众平台 如果您是第一个进入 直接点上面的 立即注册即可 然后 他会让我选择账号类型 我们要做的是小程序开发 所以 一定要选择小程序的账号类型 下一个界面并没有价值 直接点前往注册即可 注册主要分三个节点 第一步 填…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(中)

注意:本文由GPT4与Claude联合生成。 81、HammerScope: Observing DRAM Power Consumption Using Rowhammer 内存单元尺寸的不断缩小使得内存密度提高,功耗降低,但同时也影响了其可靠性。Rowhammer攻击利用这种降低的可靠性在内存中引发比特翻…

从零使用source insight并完成必要设置

文章目录 1 创建新工程2 打开四大窗口3 更改编码方式5 修改背景颜色为护眼色6 设置批量注释和批量取消注释7 选择变量高亮其他相同变量也高亮8 自定义快捷键 1 创建新工程 点new project,改成自己熟悉的名字 选择源文件路径 add tree 加载完成后点close 然后点Pr…

【vue导入导出Excel】vue简单实现导出和导入复杂表头excel表格功能【纯前端版本和配合后端版本】

前言 这是一个常用的功能,就是导入和导出excel表格 但是时常会遇到一些复杂表头的表格导出和导入 比如我这个案例里面的三层表头的表格。 网上看了下发现了一个非常简单导出和导入方法 当然这个是纯前端的版本,会出现分页不好下载的情况。所以实际工作中…

深入分析Go语言与C#的异同

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 为了更加深入地介绍Go语言以及与C#语言的比较,本文将会从多个维度出发…

ppt怎么录制视频和声音 ppt怎么录制人像

ppt在课堂上是非常重要的工具,许多微课都是通过ppt讲授。ppt的功能日新月异,之前的ppt仅具有演示功能,如今pp录制视频t还是可以的。ppt怎么录制视频和声音?首先,我们得创建一个ppt,然后再进行录制。ppt怎么…

【Python 随练】分解质因数

题目: 将一个正整数分解质因数。例如:输入 90,打印出90233*5。 简介: 在本篇博客中,我们将解决一个数学问题:如何将一个正整数分解成质因数的乘积。我们将给出问题的解析,并提供一个完整的代码示例来实现…

【Python】解决pandas读取excel,以0向前填充的数字会变成纯数字

1 问题 test.xlsx的内容如下 序号code000012310001242000125 df pd.read_excel(test.xlsx)读取后的codel列,样例如下 序号code012311242125 显然这不是我想要的结果。 2 解决办法 (1)第一种 指定列以字符串读取 df pd.read_excel(t…