统计机器学习方法 for NLP:基于LSA的主题模型

2023-05-16

前言

最近在重刷李航老师的《统计机器学习方法》尝试将其与NLP结合,通过具体的NLP应用场景,强化对书中公式的理解,最终形成「统计机器学习方法 for NLP」的系列。这篇将介绍潜在语义分析LSA(绝对给你一次讲明白)并基于LSA完成一个主题模型提取的任务。

潜在语义分析是什么

潜在语义分析(Latent Semantic Analysis, LSA)是一种无监督的机器学习方来,通过分析文本内容来获取文本「隐藏主题」,也就是文章的「表示」,一旦能获取文本的「表示」就可以进行文本之间的相似度的计算,进而实现文本聚类等应用。

单词向量空间模型

在统计机器学习里面获取一个文章的「表示」最基础的方法就是单词向量空间模型。基本的想法是用一个向量来表示文章的语义,向量的每一个维度表示词表中的一个单词,这个维度的数值就表示该单词在文本中出现的频次或者权重(例如tf-idf)。这样通过计算两个向量的相似度(例如余弦相似度)就可以来获得两个文本之间的相似度。这种模型非常简单而且计算效率很高,至今在信息检索等场景广泛应用。

但也会存在两个问题:(1) 无法解决一词多义或者多词一义的问题,因为是最简单的「字面匹配」。例如“很开心”和“好快乐” 这两句其实是一个意思,但是没有一个字是一样的,按照上面的方法这两句话的语义相似度就是0 (2) 存储开销较大,因为词表的大小一般是非常大的(例如几万维),所以存一个N*V的矩阵会是很大的开销,这里N表示文章个数,V表示词表大小。(其实现在来看这点不算什么问题)

正是因为最基础的「单词向量空间模型」存在上述的问题,所以潜在语义分析LSA就被提出了。

话题向量空间模型

我们认为一个文本一般包含多个话题,两个文本语义的相似可以等价于两个文本话题的相似。这里的话题就可以用一组相似的单词构成,比如{开心,快乐,高兴}等。所以我们可以构建一个话题向量来对一个文本进行表示,向量的每一个维度表示一个话题,这个维度的数值就表示文本在这个话题上的权重,并且一般话题的个数是远小于词表的个数,存储空间大幅降低。所以通过这种方式就可以解决「单词向量空间模型」遇到了两个问题。

如上图所示,LSA就是通过将「单词-文本矩阵」(单词向量空间)转化成 「单词-话题矩阵」和 「话题-文本矩阵」(话题向量空间模型)乘积的形式,从而挖掘出文章中潜在的语义。

训练阶段:首先基于单词向量空间模型从训练文本中构建出「单词-文本」矩阵,然后通过矩阵的奇异值分解对「单词-文本矩阵」进行分解,将分解结果的左矩阵作为话题的表示,右矩阵作为文本的表示(在话题维度下)。

预测阶段:给定一个文本,先获取单词向量空间(1*m),然后与空间表示(m*k)相乘,就获得了话题空间向量(1*k),作为这个文本的表示。

基于LSA的主题模型

主题模型(Topic Model)是一种无监督的机器学习方法(例如本文介绍的LSA),来获取一个文档/文章所表示的主题是什么。这里的「主题」不一定是我们常见的真实「主题」,例如体育,历史,娱乐等;也可以表示这篇文章一组最佳的关键词,例如奥运会,游泳,夺冠等;甚至是这篇文章的一个向量表示(人类不可读)。

通过主题模型可以实现文章的聚类。例如新闻网站就可以对同一个新闻事件的不同文章进行自动的聚合,或者从一系列的文章中自动挖掘出几个大的类目。

下面我们通过简单的例子来进行实际的应用。假设我们有下面5个句子构成的文档集,并希望挖掘出2个主题。

0         He is a good dog.
1         The dog is too lazy.
2         That is a brown cat.
3         The cat is very active.
4         I have brown cat and dog.

首先我们对句子进行预处理,移除停用词,得到下面清洗后的结果

0         good dog
1         dog lazy
2        brown cat
3       cat active
4    brown cat dog

接下来我们用sklearn的TfidfVectorizer来构建词表和「单词-文本」矩阵

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words='english', smooth_idf=True)
X = vectorizer.fit_transform(df['clean_documents'])

我们看一下构建的词表和原始的「单词-文本矩阵」

print(vectorizer.get_feature_names())
"""['active', 'brown', 'cat', 'dog', 'good', 'lazy']"""

print(X.to_array())
"""
array([[0.        , 0.        , 0.        , 0.55645052, 0.83088075,  0.        ],
       [0.        , 0.        , 0.        , 0.55645052, 0.        ,  0.83088075],
       [0.        , 0.76944707, 0.63871058, 0.        , 0.        ,  0.        ],
       [0.83088075, 0.        , 0.55645052, 0.        , 0.        ,  0.        ],
       [0.        , 0.64846263, 0.53828256, 0.53828256, 0.        ,  0.        ]])
"""

下面继续进行SVD分解,这里我们假设有2个主题

from sklearn.decomposition import TruncatedSVD
# SVD represent documents and terms in vectors 
svd_model = TruncatedSVD(n_components=2, algorithm='randomized', n_iter=100)
lsa = svd_model.fit_transform(X)

我们将每个主题的表示先打印出来

dictionary = vectorizer.get_feature_names()
encoding_matrix = pd.DataFrame(svd_model.components_, index = ["topic_1","topic_2"], columns = (dictionary)).T

可以看到第一个主题主要关于猫 ,第二个主题主要关于狗 。

接着我们将每个文本对应的话题向量打印出来

pd.options.display.float_format = '{:,.16f}'.format
topic_encoded_df = pd.DataFrame(lsa, columns = ["topic_1", "topic_2"])
topic_encoded_df["documents"] = df['clean_documents']
display(topic_encoded_df[["documents", "topic_1", "topic_2"]])

可以看到文本0,1提到了狗所以被分到了主题1;文本2,3提到了猫所以被分到了主题2;文本4中同时提到了狗和猫但是主题1中还包括“brown”棕色这个概念,所以文本4也被分到了主题1。


参考

baiziyu:sklearn-TfidfVectorizer彻底说清楚

https://towardsdatascience.com/latent-semantic-analysis-deduce-the-hidden-topic-from-the-document-f360e8c0614b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

统计机器学习方法 for NLP:基于LSA的主题模型 的相关文章

随机推荐

  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小
  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类
  • 使用gopsutil获取OS信息

    生产环境通常需要掌握主机硬盘 CPU 内存 进程等资源使用情况 xff0c 可以执行系统命令获得 xff0c 通过os exec执行命令 xff0c 如 xff1a ps cd top xff0c 然后解析命令执行结果 对于linux操作系
  • gcc工具小结

    关于 l和 Wall选项的解析 xff1a Wall 打开gcc的所有警告 l参数就是用来指定程序要链接的库 xff0c l参数紧接着就是库名 xff0c 那么库名跟真正的库文件名有什么关系呢 xff1f 就拿数学库来说 xff0c 他的库
  • 如何在Java中调用Python

    Python语言有丰富的系统管理 数据处理 统计类软件包 xff0c 因此从java应用中调用Python代码的需求很常见 实用 DataX 是阿里开源的一个异构数据源离线同步工具 xff0c 致力于实现包括关系型数据库 MySQL Ora
  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中
  • R语言中mean函数

    mean函数是求算术平均值 用法 xff1a mean x trim 61 0 na rm 61 FALSE x是数值型 逻辑向量 trim表示截尾平均数 xff0c 0 0 5之间的数值 xff0c 如 xff1a 0 10表示丢弃最大1
  • 使用Spring @DependsOn控制bean加载顺序

    使用Spring 64 DependsOn控制bean加载顺序 spring容器载入bean顺序是不确定的 xff0c spring框架没有约定特定顺序逻辑规范 但spring保证如果A依赖B 如beanA中有 64 Autowired B
  • 使用R中merge()函数合并数据

    使用R中merge 函数合并数据 在R中可以使用merge 函数去合并数据框 xff0c 其强大之处在于在两个不同的数据框中标识共同的列或行 如何使用merge 获取数据集中交叉部分 merge 最简单的形式为获取两个不同数据框中交叉部分
  • 介绍java中Pair

    介绍java中Pair 在这篇文章中 xff0c 我们讨论了一个非常有用的编程概念 xff0c 配对 Pair 配对提供了一种方便方式来处理简单的键值关联 xff0c 当我们想从方法返回两个值时特别有用 在核心Java库中可以使用配对 Pa
  • python numpy 中linspace函数

    python numpy 中linspace函数 numpy提供linspace函数 有时也称为np linspace 是python中创建数值序列工具 与Numpy arange函数类似 xff0c 生成结构与Numpy 数组类似的均匀分
  • Spring框架学习重点概要笔记(一)

    spring框架的注解实现 xff1a xff08 1 xff09 首先在spring的核心配置文件中开启注解配置 xff1a xff08 2 xff09 64 Component 目前Spring中提供了四个注解 xff0c 相当于时Co
  • 做个爱读书的程序员

    很多时候我们抱怨工作过于忙碌 xff0c 疲于应付各种事情 但是往往即使有时间也总是会无所事事地浪费掉 xff0c 我们可以找很多理由去给自己解脱 xff0c 固然是想在忙碌之外给自己放松一下 xff0c 大多却是过于可惜的时候 今天跟一个
  • xming Error: Can‘t open display:

    运行 xclock xhost 报错 xff1a xming Error Can 39 t open display 需要安装xorg x11 xauth在运行 xclock 或 xhost root 64 stone yum y inst
  • onItemClickListener不起作用解决办法2(原创)

    写这边文章之前 xff0c 犹豫再三 xff0c 不知道会不会冒犯一位朋友 xff0c 他给我之前的一篇文章提出的意见 但我声明真心无意 xff0c 只是想把问题拿出来分析一下 xff0c 希望获得理解 listview在android开发
  • 关于STM32系列串口打印乱码原因解析

    STM32打印串口乱码 xff0c 如果你的配置确认没有问题 xff0c 那么最有可能是 HSE VALUE 这个值不对 xff0c 你可能使用的是一份demo程序 xff0c 而demo程序的时钟晶振和你的时钟晶振不一定都是一样 xff0
  • node.js提取html中的内部引入css和js代码,并修改为外部引入

    前提 xff1a 配置好node环境 xff0c 能够使用终端 xff08 cmd或Windows PowerShell xff09 node命令运行js文件 nodejs安装教程 某位大佬整理的nodejs入门教程 node xxx sp
  • Ffplay视频播放流程

    背景说明 FFmpeg是一个开源 xff0c 免费 xff0c 跨平台的视频和音频流方案 xff0c 它提供了一套完整的录制 转换以及流化音视频的解决方案 而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器 学习ffp
  • 统计机器学习方法 for NLP:基于LSA的主题模型

    前言 最近在重刷李航老师的 统计机器学习方法 尝试将其与NLP结合 xff0c 通过具体的NLP应用场景 xff0c 强化对书中公式的理解 xff0c 最终形成 统计机器学习方法 for NLP 的系列 这篇将介绍潜在语义分析LSA xff