文本挖掘从小白到精通(一):语料、向量空间和模型的概念

2 评论 10377 浏览 22 收藏 11 分钟

本文给大家介绍几个在使用gensim进行文本挖掘所需了解的基本概念和术语,并提供一些简单的用法示例。enjoy~

笔者最近在梳理自己的文本挖掘知识结构,借助gensim、sklearn、keras等库的文档做了些扩充,希望在梳理自身知识体系的同时也能对想学习文本挖掘的朋友有一点帮助,这是笔者写该系列的初衷。

本文会介绍几个在使用gensim进行文本挖掘所需了解的基本概念和术语,并提供一些简单的用法示例。

在更高层次上,gensim是一种通过检查词汇模式(或更高级别的结构,如语句或文档)来发现文档语义结构(Semantic Structure)的工具。

gensim通过语料库——一组文本文档,并在语料库中生成文本的向量表示(Vector Representation of the Text)来实现这一点。 然后,文本的向量表示可用于训练模型——它是用于创建不同的文本数据(蕴含语义)表示的算法。

这三个概念是理解gensim如何工作的关键,所以让我们花一点时间来解释它们的含义。与此同时,我们将通过一个简单的例子来说明每个概念。

一 、语料(Corpus)

一个语料库是数字文档的集合(A Collection of Digital Documents)。 这个集合是gensim的输入,它将从中推断文档的结构或主题。从语料库中推断出的潜在结构(Latent Structure)可用于将主题分配给先前不存在于仅用于训练的语料库中的新文档。 出于这个原因,我们也将此集合称为训练语料库(Training Corpus)。

这个过程不需要人工干预(比如手动给文档打标签)——因为主题分类是无监督的(Unsupervised)(https://en.wikipedia.org/wiki/Unsupervised_learning)。

对于笔者用于示例的语料库,有12个文档,每个文档只有一个语句:

这只是一个很小的语料库,其实你可以用其他的语料库进行替代,比如:微信上的文章、微博博文,或者新闻标题等。

收集语料库之后,通常会进行一系列的文本预处理。 作为示例,为了简洁起见,笔者仅删除语料库中的停用词和在语料库中只出现一次的词汇。 在此过程中,笔者将进行分词操作,将文档分解为由词汇组成的列表(在本例中使用空格作为分隔符)。

在继续之前,笔者希望将语料库中的每个词汇与唯一的整数ID相关联。 我们可以使用gensim.corpora.Dictionary这个类来完成,这个词典定义了笔者之前预处理后的语料中的词汇。

from gensim import corpora

dictionary = corpora.Dictionary(processed_corpus)

print(dictionary)

Dictionary(14 unique tokens: [‘创新’, ‘商业’, ‘知识图谱’, ‘技术’, ‘数据’]…)

因为笔者给定的语料较小, 只有14个不同的词汇在这个 Dictionary中。 对于较大的语料库,词典中会包含成千上万的词汇,数量庞大。

二 、 向量空间(Vector Space)

为了推断语料库中的潜在结构(Latent Structure),我们需要一种可用于数学操作(比如,加减乘除等运算)的文档表示方法。一种方法是将每个文档表示为向量,有各种用于创建文档的向量表示的方法,其中一个简单的方法是词袋模型(Bag-of-Words Model)。

在词袋模型下,每个文档由包含字典中每个单词的频率计数的向量表示。例如:给定一个包含词汇[‘咖啡’,’牛奶’,’糖果’,’勺子’]的字典,那么,一个由字符串’咖啡 牛奶 糖果 勺子’组成的文档可以用向量表示为[2 ,1,0,0],其中向量的元素(按顺序)对应文档中出现的“咖啡”,“牛奶”,“糖”和“勺子”。向量的长度是字典中的词汇数。词袋模型的一个主要特性是它完全忽略了编码文档(the Encoded Document )中的词汇顺序,这就是词袋模型的由来。

我们处理过的语料库中有14个不同的词汇,这意味着语料库中的每个文档将由这个14维向量的词袋模型来表示,我们可以使用字典将分词后的文档转换为14维向量。由此,我们可以看到这些ID对应的词汇:print(dictionary.token2id)

{‘创新’: 0, ‘商业’: 1, ‘知识图谱’: 2, ‘技术’: 3, ‘数据’: 4, ‘金融’: 5, ‘分析’: 6, ‘知识’: 7, ‘管理’: 8, ‘一文’: 9, ‘关键’: 10, ‘企业’: 11, ‘智能’: 12, ‘转型’: 13}

例如,假设我们想要对“知识图谱为企业转型助力”这个语句进行向量化(请注意,该语句不在我们原来的语料库中)。 我们可以使用dictionary的doc2bow方法为该语句创建词袋表示,该方法返回词汇计数的稀疏表示:

每个元组中的第一个元素对应字典中的词汇ID,第二个条目对应于该词汇的计数。

请注意,原始语料库中没有出现“为”、“助力”,因此它们将不包含于新生成的向量表示中。 另请注意,此向量仅包含实际出现在文档中的词汇。 因为任何给定文档只包含字典中许多单词中的几个单词,所以未参与向量化的词汇会直接被剔除,以节省空间。

我们可以将整个原始语料库转换为向量列表:

请注意,虽然此列表完全保存在内存中,但在大多数的应用场景,你需要更具伸缩性的解决方案(A More Scalable Solution)。幸运的是,gensim允许流式迭代器。 后面笔者会谈及。

三 、 模型(Model)

现在,我们已经对测试语料库进行了向量化,我们可以开始使用models对其进行转换了。 我们使用模型作为抽象术语,指的是从一个文档表示到另一个文档表示的转换。 在gensim中,文档表示为向量,因而模型可以被认为是两个向量空间之间的转换。 从训练语料库中学习这种转换的细节。

一个简单的模型示例是TF-IDF。 TF-IDF模型将向量从词袋表示(Bag-of-Words Representation)转换为向量空间,其中频率计数根据语料库中每个单词的相对稀有度(the relative rarity of each word in the corpus)进行加权。

这是一个简单的例子。 让我们初始化tf-idf模型,在测试语料库上进行训练,然后对字符串“知识图谱这种技术是企业转型的利器”进行转换:

TF-IDF模型再次返回元组列表,每个元组的第一个元素是词汇ID,第二个条目是TF-IDF加权值。 注意,对应于“知识图谱”的ID(在训练语料库中出现10次)的加权值低于对应于“转型”的ID(在训练语料库中出现2次)权重值。

gensim提供了许多不同的模型/转换。 有关详细信息,请看笔者后续的文章。

#专栏作家

苏格兰折耳喵(微信公众号:Social Listening与文本挖掘),人人都是产品经理专栏作家,数据PM一只,擅长数据分析和可视化表达,热衷于用数据发现洞察,指导实践。

本文原创发布于人人都是产品经理。未经许可,禁止转载。

题图来自Unsplash,基于CC0协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 您好,有一个问题想请教下:最终的模型转换成向量空间的转换依据是训练语料库里面的词典,那么是不是可以理解为词典会直接影响到模型效果,那如何选择训练语料库呢(语料库大小和质量方面)?——–来自一个初级数据分析菜鸟的第一篇文本挖掘的文章学习

    来自安徽 回复
    1. 可以预设的,只要包含所分析语料中的词汇即可。

      来自香港 回复