0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种文本挖掘方法称为主题建模,什么时候会用到主题建模?

zhKF_jqr_AI 来源:未知 作者:李倩 2018-10-10 09:01 次阅读

你曾经是否去过一家管理良好的图书馆?我常常被图书馆有秩序的书籍管理震惊到,他们可以根据书名、内容或者其他主题把所有书排列整齐。但是如果你给图书馆提供了几千本书,让他们根据每本书的种类进行管理,他们一定会累到吐血。

但如果你有这些书的电子格式,做起来似乎就简单的多了,无需手动操作,几秒钟可能就完成了。NLP万岁!

请看下面一小段话:

从三种颜色的高亮处我们得知,这里有三种主题(或者概念)。一个好的主题模型可以分辨出相似的单词,并把它们归到一个群组中。在上面这段话中,最主要的主题就是绿色的主题2,通过它我们可以了解到这段话的主要意思是有关假视频的。

在这篇文章中,我们将学习一种文本挖掘方法,称为主题建模(topic modeling)。这是提取主题的一种非常有用的技术,在NLP问题中会经常用到。

注:在阅读这篇文章前,我强烈推荐我们此前的另一篇文章:《12种降维方法终极指南(含Python代码)》,从中可以了解SVD、UMAP等概念,这些概念会在本文出现。

什么是主题模型?

主题模型可以看作是一种无监督技术,用于在多个文本文件中发现主题。但这些主题在自然中是抽象的,而且一段文本中可能含有多种主题。就目前来说,我们暂且将主题模型理解成一个黑箱,如下图所示:

黑箱(主题模型)将很多相似相关的词语聚集起来,称为主题。这些主题在文本中有特定的分布形态,每种主题都是通过它包含的不同单词比例确定的。

什么时候会用到主题建模?

回到我们开头说到的图书馆的例子,现在假设你要对几个数字化文本进行管理,如果数量不多,完全可以手动完成,但如果电子文本数量很大该怎么办?

这就需要用到NLP技术,对于这项任务,主题建模是必须用到的。

主题建模可以帮助使用者处理大量文本数据,找到文本中相似的多个词语,确定抽象的主题。除此之外,主题模型还可以用于搜索引擎,让搜索结果与搜索字符相匹配。

隐藏语义分析(LSA)概览

所有语言都有自己细小的特征,机器难以分辨(有时连人类都会认错)。比如有时不同的单词却表达相同含义,或者同一个单词却表达不同意思。

例如,看以下两个句子:

I liked his lastnovelquite a lot.

We would like to go for anovelmarketing campaign.

在第一句话中,“novel”指的是一本书、小说,而在第二句话中它是形容词,意为“新的”。

我们可以轻易地分辨二者,因为我们理解了“novel”前后词语的意思。但是,机器无法理解这些概念,所以也不能理解词语所处的语境。这就需要用到隐藏语义分析(LSA)了,它通过分析词语周围的语境捕捉其中的隐藏概念,即主题。

所以,仅仅将词语映射到文本中并不能起到太大帮助,我们真正要做的是弄清楚词语背后隐藏的概念或主题,这就是LSA的目的。

实施LSA的步骤

假设我们有m个文本文档,总共有n个不同的词语,我们想从文档中所有文本数据中提取出k个主题,而k是由用户决定的。

生成一个文本-单词矩阵,计算TF-IDF分数。

之后,我们会将上述矩阵的维度降至k,利用奇异值分解(SVD)。

SVD将一个矩阵分解成三个其他的矩阵,假设我们想用SVD分解矩阵A,它就会将其分成矩阵U、S和VT(矩阵V的转置矩阵)。

矩阵UK的每一行都是对应文本的向量表示,这些向量的长度是k,即目标主题的数量。我们数据中的词语的向量表示可以在矩阵VK中找到。

通过SVD,我们得到了我们的数据中每个文本和词语的向量表示,然后用这些向量,我们可以找到相似的单词,利用余弦相似性找到相似的文本。

用Python实现LSA

首先下载所需要的库。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

pd.set_option("display.max_colwidth", 200)

在这篇文章中,我们会用到sklearn中的“20 Newsgroup”,下载地址:archive.ics.uci.edu/ml/datasets/Twenty+Newsgroups。代码如下:

from sklearn.datasets import fetch_20newsgroups

dataset = fetch_20newsgroups(shuffle=True, random_state=1, remove=('headers', 'footers', 'quotes'))

documents = dataset.data

len(documents)

输出:11314。

dataset.target_names

['alt.atheism',

'comp.graphics',

'comp.os.ms-windows.misc',

'comp.sys.ibm.pc.hardware',

'comp.sys.mac.hardware',

'comp.windows.x',

'misc.forsale',

'rec.autos',

'rec.motorcycles',

'rec.sport.baseball',

'rec.sport.hockey',

'sci.crypt',

'sci.electronics',

'sci.med',

'sci.space',

'soc.religion.christian',

'talk.politics.guns',

'talk.politics.mideast',

'talk.politics.misc',

'talk.religion.misc']

数据及共有11314个文本文档,分布在20各不同的newsgroup中。

数据预处理

开始之前,我们先尝试着清理文本数据。主要思想就是清除其中的标点、数字和特殊字符。之后,我们需要删除较短的单词,因为通常它们不会包含什么有用的信息。最后,我们将文本变为不区分大小写。

news_df = pd.DataFrame({'document':documents})

# removing everything except alphabets`

news_df['clean_doc'] = news_df['document'].str.replace("[^a-zA-Z#]", " ")

# removing short words

news_df['clean_doc'] = news_df['clean_doc'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>3]))

# make all text lowercase

news_df['clean_doc'] = news_df['clean_doc'].apply(lambda x: x.lower())

之后我们要删除没有特别意义的停止词,例如“it”、“they”、“am”、“been”、“about”、“because”、“while”等等。为了实现这一目的,我们要对文本进行标记化,也就是将一串文本分割成独立的标记或单词。删除停止词之后,再把这些标记组合在一起。

from nltk.corpus import stopwords

stop_words = stopwords.words('english')

# tokenization

tokenized_doc = news_df['clean_doc'].apply(lambda x: x.split())

# remove stop-words

tokenized_doc = tokenized_doc.apply(lambda x: [item for item in x if item notin stop_words])

# de-tokenization

detokenized_doc = []

for i in range(len(news_df)):

t = ' '.join(tokenized_doc[i])

detokenized_doc.append(t)

news_df['clean_doc'] = detokenized_doc

文本-词语矩阵

这是通向主题建模的第一步。我们要用sklearn的TfidfVectorizer给1000个词语创造一个文本-词语矩阵。如果你有足够的计算力,可以增加更多数据。

from sklearn.feature_extraction.text importTfidfVectorizer

vectorizer = TfidfVectorizer(stop_words='english',

max_features= 1000, # keep top 1000 terms

max_df = 0.5,

smooth_idf=True)

X = vectorizer.fit_transform(news_df['clean_doc'])

X.shape # check shape of the document-term matrix

(11314, 1000)

主题建模

下一步是将每个词语和文本用向量表示,我们会用到文本-词语矩阵并对他们降维。这里会用到TruncatedSVD执行矩阵的分解。

由于数据来自20个不同的分组,我们就假设文本数据有20个不同主题。

from sklearn.decomposition importTruncatedSVD

# SVD represent documents and terms in vectors

svd_model = TruncatedSVD(n_components=20, algorithm='randomized', n_iter=100, random_state=122)

svd_model.fit(X)

len(svd_model.components_)

20

svdmodel中的元素就是我们的主题,我们可以用svdmodel.components_查看。最后,在20个主题中输入几个重要单词,看模型会做出什么反应。

terms = vectorizer.get_feature_names()

for i, comp in enumerate(svd_model.components_):

terms_comp = zip(terms, comp)

sorted_terms = sorted(terms_comp, key= lambda x:x[1], reverse=True)[:7]

print("Topic "+str(i)+": ")

for t in sorted_terms:

print(t[0])

print(" ")

Topic0: like know people think good time thanks

Topic1: thanks windows card drive mail file advance

Topic2: game team year games season players good

Topic3: drive scsi disk hard card drives problem

Topic4: windows file window files program using problem

Topic5: government chip mail space information encryption data

Topic6: like bike know chip sounds looks look

Topic7: card sale video offer monitor price jesus

Topic8: know card chip video government people clipper

Topic9: good know time bike jesus problem work

Topic10: think chip good thanks clipper need encryption

Topic11: thanks right problem good bike time window

Topic12: good people windows know file sale files

Topic13: space think know nasa problem year israel

Topic14: space good card people time nasa thanks

Topic15: people problem window time game want bike

Topic16: time bike right windows file need really

Topic17: time problem file think israel long mail

Topic18: file need card files problem right good

Topic19: problem file thanks used space chip sale

主题可视化

为了更方便地探索主题,我们应该对其可视化。当然,可是话不能大于三维,但是PCA或t-SNE等技术可以帮我们将高维数据降成低维进行可视化。这里,我们用另一种相对较新的技术,称作UMAP(Uniform Manifold Approximation and Projection)。

import umap

X_topics = svd_model.fit_transform(X)

embedding = umap.UMAP(n_neighbors=150, min_dist=0.5, random_state=12).fit_transform(X_topics)

plt.figure(figsize=(7,5))

plt.scatter(embedding[:, 0], embedding[:, 1],

c = dataset.target,

s = 10, # size

edgecolor='none'

)

plt.show()

如上所示,结果非常明显,每个点代表一段文本,不同的颜色表示20个分组。

完整代码地址:github.com/prateekjoshi565/latentsemanticanalysis

LSA的优缺点

如上所示,隐藏语义分析非常有用,但是它也有自己的缺点。在使用它之前,还需要了解它的优缺点。

优点:

LSA非常快,并且易于实施。

结果很清晰,比单一的向量空间模型好得多。

缺点:

由于它是一个线性模型,可能在非线性数据集上表现的不是很好。

LSA假设文本中的词语是高斯分布,可能不适用于所有问题。

LSA中涉及SVD,可能在出现新数据或更新时需要大量计算力。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    2671

    浏览量

    47572
  • SVD
    SVD
    +关注

    关注

    0

    文章

    21

    浏览量

    12065

原文标题:用隐藏语义分析(LSA)进行主题建模(附Python代码)

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    生产线仿真建模过程和优化方法

    今天我们分享一个详细的生产线仿真建模和分析案例。
    的头像 发表于 01-02 11:01 436次阅读
    生产线仿真<b class='flag-5'>建模</b>过程和优化<b class='flag-5'>方法</b>

    SaberRD状态机建模工具介绍(一)什么是状态机建模

    状态机建模是使用状态图和方程式的手段,创建基于混合信号的有限状态机模型的一种建模工具。
    的头像 发表于 12-05 09:51 443次阅读
    SaberRD状态机<b class='flag-5'>建模</b>工具介绍(一)什么是状态机<b class='flag-5'>建模</b>

    机器人建模方法和组成

    URDF:机器人建模方法 ROS是机器人操作系统,当然要给机器人使用啦,不过在使用之前,还得让ROS认识下我们使用的机器人,如何把一个机器人介绍给ROS呢? 为此,ROS专门提供了一种机器人
    的头像 发表于 11-22 16:30 310次阅读
    机器人<b class='flag-5'>建模</b><b class='flag-5'>方法</b>和组成

    ESL设计中事务级建模的一般理论

    在更详细地描述事务级建模之前,首先介绍在事务级建模用到的一些术语。首先事务表示数据和事件的交换过程。各个连续的事务可以是不同大小的数据传输,也可以是在系统同步时用来调整或管理模块之间行为
    的头像 发表于 11-02 14:48 209次阅读

    射频功放的建模资料

    随着通信技术的发展,射频电路在通信系统中得到了广泛的应用。功率放大器的研究和设计直是通信发展中的重要课题。近年来,基于模糊神经网络的射频器件和电路建模的研究取得了巨大的成果,对大规模集成电路和复杂电路的建模有着巨大的启发意义,
    发表于 09-22 07:22

    可视化大屏设计模板 | 主题皮肤(报表UI设计)

    下载使用可视化大屏设计模板,减少重复性操作,提高报表制作效率的同时也确保了报表风格致,凸显关键数据信息。 软件:奥威BI系统,又称奥威BI数据可视化工具 所属功能板块:主题皮肤上传下载(数据可视化
    发表于 09-12 10:10

    什么是系统建模语言SysML?

    对复杂系统的建模是架构师的基础能力之一。从这篇文章开始,笔者介绍系统建模语言SysML(OMG System Modeling Language)。 对复杂系统的建模是架构师的基础能力之一。从这篇文章开始,笔者介绍系统
    的头像 发表于 09-01 15:48 2196次阅读
    什么是系统<b class='flag-5'>建模</b>语言SysML?

    软件建模原则包括哪些内容

    软件建模正在成为一种普遍的技术来帮助软件工程师理解。
    的头像 发表于 08-29 10:07 737次阅读
    软件<b class='flag-5'>建模</b>原则包括哪些内容

    UC3825A芯片建模过程

    本节主要讲述UC3825A芯片建模,详细资料参考数据手册。前一节已讲述振荡器与前沿消隐电路,本节完成整个芯片的建模工作,通过建模过程可以更加熟悉仿真软件的使用方法
    的头像 发表于 07-13 10:23 1030次阅读
    UC3825A芯片<b class='flag-5'>建模</b>过程

    一种基于Simulink搭建的柴油发动机建模方法

    汽油机和柴油机是目前汽车中最为广泛使用的动力源。其中,本期带来基于Simulink搭建的柴油发动机建模方法
    发表于 06-29 11:26 1342次阅读
    求<b class='flag-5'>一种</b>基于Simulink搭建的柴油发动机<b class='flag-5'>建模</b><b class='flag-5'>方法</b>

    什么是马尔可夫建模,它的用途是什么?

    这篇博客是关于可靠性建模的便捷技术,包括称为马尔可夫建模的CCF。作为复习,CCF通常涉及冗余安全系统中的所有通道同时发生故障,从而发生危险。理想情况下,在冗余系统中,如果发生单个故障,仍然至少有一个通道可以确保您的安全。CCF
    的头像 发表于 06-28 16:33 1004次阅读
    什么是马尔可夫<b class='flag-5'>建模</b>,它的用途是什么?

    使用PyMC进行时间序列分层建模

    在统计建模领域,理解总体趋势的同时解释群体差异的一个强大方法是分层(或多层)建模
    的头像 发表于 06-19 16:26 359次阅读
    使用PyMC进行时间序列分层<b class='flag-5'>建模</b>

    基于实体和动作时空建模的视频文本预训练

    摘要 尽管常见的大规模视频-文本预训练模型已经在很多下游任务取得不错的效果,现有的模型通常将视频或者文本视为一个整体建模跨模态的表示,显示结合并建模细粒度信息的探索并不多,本文提出了S
    的头像 发表于 05-25 11:29 410次阅读
    基于实体和动作时空<b class='flag-5'>建模</b>的视频<b class='flag-5'>文本</b>预训练

    UML统一建模语言

    UML-Unified Modeling Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模一种语言。UML的定义包括UML语义和UML表示法两个元
    的头像 发表于 05-05 10:15 558次阅读
    UML统一<b class='flag-5'>建模</b>语言

    SOLIDWORKS曲面建模实例

    关于SOLIDWORKS软件曲面建模,下面众联亿诚通过实例为大家简单介绍SOLIDWORKS曲面建模流程。
    的头像 发表于 04-06 16:10 1463次阅读
    SOLIDWORKS曲面<b class='flag-5'>建模</b>实例