如果从一开始就给大家说什么是向量化再抛出类似稀疏矩阵、文本特征等一系列专业名词大家必然听的云里雾里不知所云,那不如就由浅入深从头开始讲起我们的到底在干什么(what)我们又是如何实现的(how)、我们为什么要这样实现(why)这三个方面开始讲吧!
一、首先我们到底在干什么
身处于互联网大数据时代,每个人、每个企业既是数据的生产者又是信息的消费者,数据的价值也备受着关注越来越多的企业开始去尝试挖掘数据的价值,越来越多的用户也正享受着大数据时代为他们提供的便利,大数据的获取、处理与分析,已成为提高未来竞争力的关键因素,所以我们要做的就是————数据分析
对于文本的分析有一个专有名词叫做 nlp(Natural Language Processing),翻译为自然语言处理,它是计算机科学、人工智能和语言学的交叉领域,目的是让计算机处理或“理解”自然语言,以执行诸如语言翻译和问题回答等任务。他主要用到三种技术:
▌技术1:文本嵌入(Text Embeddings)
在传统的NLP中, 我们把单词看成是离散符号, 然后用一个one-hot向量来表示。向量的维数是整个词库中单词的数量。单词作为离散符号的问题在于, 对于一个one-hot向量来说,没有自然的相似性概念。因此, 另一种方法是学习在向量本身中的编码相似性。核心思想是一个词的意思是由经常出现在其附近的词给出的。
文本嵌入是字符串的实值向量表示形式。我们为每个单词构建一个稠密的向量, 这样做是以便它与出现在相似上下文中的单词向量相似。对于大多数深度NLP任务而言,词嵌入被认为是一个很好的起点。它们允许深度学习在较小的数据集上有效,因为它们通常是深度学习体系结构的第一批输入,也是NLP中最流行的迁移学习方式。
▌技术2:机器翻译
机器翻译是语言理解的经典测试。它由语言分析和语言生成两部分组成。大型机器翻译系统有巨大的商业用途,因为全球语言是一个每年400亿美元的产业
▌技术3:Dialogue 和 Conversations
关于会话AI的文章很多,其中大部分集中在垂直聊天机器人、messenger平台、商业趋势和创业机会(比如亚马逊Alexa、苹果Siri、Facebook M、谷歌助理、微软Cortana)。人工智能理解自然语言的能力仍然有限。因此,创建完全自动化的开放域会话助理仍然是一个开放的挑战
我们要用到的技术就是文本嵌入(Text Embeddings)!
数据分析师Seth Grimes曾指出“80%的商业信息来自非结构化数据,主要是文本数据”,这一表述可能夸大了文本数据在商业数据中的占比,但是文本数据的蕴含的信息价值毋庸置疑
如果原始文本是数据,那么文本挖掘就是信息,NLP就是知识,也就是语法和语义的关系。下面的金字塔表示了这种关系:
二、1、我们又是如何实现的呢
我们要分析的原始数据、符号文字序列不能直接传递给算法,因为它们大多数要求具有固定长度的数字矩阵特征向量,而不是具有可变长度的原始文本文档。为解决这个问题,scikit-learn提供了从文本内容中提取数字特征的最常见方法,即:
令牌化(tokenizing) 对每个可能的词令牌分成字符串并赋予整数形的id,例如通过使用空格和标点符号作为令牌分隔符。
统计(counting) 每个词令牌在文档中的出现次数。
标准化、归一化(normalizing) 在大多数的文档 / 样本中,可以减少重要的次令牌的出现次数的权重。
在该方案中,特征和样本定义如下:
每个单独的令牌发生频率(归一化或不归零)被视为一个特征。
给定文档中所有的令牌频率向量被看做一个多元sample样本。
因此,文本的集合可被表示为矩阵形式,每行对应一条文本,每列对应每个文本中出现的词令牌(如单个词)。
我们称向量化是将文本文档集合转换为数字集合特征向量的普通方法。 这种特殊思想(令牌化,计数和归一化)被称为 Bag of Words 或 “Bag of n-grams” 模型,也就是词袋模型。 文档由单词出现来描述,同时完全忽略文档中单词的相对位置信息。
可能大家还是听得有些迷糊,那我举个稍微平易的例子为大家巩固一下理解吧。我们可以把待分析的文本、原始数据想象成为一个拼装完成的‘乐高积木’,现在我们要分析这个乐高积木,然后我们把它一块一块拆下来,拆除完成之后原本完整的积木变成了一块块单独的零件,我们为拆下的零件一件一件的按照类型编上序号并且按照顺序排列好,这就完成了第一步———分词标记(tokenizing)
【a零件0号,b零件1号,c零件2号,d零件3号,e零件4号,f零件5号,g零件6号,...........】
然后我们要统计拆除下来每个零件的个数,这就是关键的第二部——统计(counting)
【a零件0号:61,b 零件1号:5 ,c 零件2号:6 ,d 零件3号:99 ,e 零件4号:7 ,f 零件5号:5 号,g 零件6号 :2,...........】
但是有许多零件是常常出现但是并不是特别重要的或者太大太小总之我们想要的,我们就要去除对他们的统计,这就是第三部分————归一化(normalizing),我们即将要探讨的TF-IDF模型就是实现归一化的一种方法。
**【b 零件1号:5 ,c 零件2号:6 ,e 零件4号:7 ,f 零件5号:5 ,g 零件6号 :2,...........】 **
现在大家是否对向量化的过程有了更为具象的认识呢,好了重头戏终于来了,到底什么是TF-IDF呢
TF-IDF(term frequency-inverse document frequency)词频-逆文件频率。在处理文本时,如何将文字转化为模型可以处理的向量呢?TF-IDF就是这个问题的解决方案之一。字词的重要性与其在文本中出现的频率成正比(TF),与其在语料库中出现的频率成反比(IDF)。
TF就是词频,词语在文章中出现的次数。
IDF叫做逆文档频率,有些词可能在文本中频繁出现,但并不重要,也即信息量小,如is,of,that这些单词,或是中文中的是、这、那,这些单词在语料库中出现的频率也非常大,我们就可以利用这点,降低其权重。
TF-IDF则是将上面的TF-IDF相乘就得到了的综合参数
二、2.具体又是怎么实现的呢
首先请安装sklearn,Scikit-learn是一个用于数据挖掘和数据分析的简单且有效的工具,它是基于Python的机器学习模块,基于BSD开源许可证。
pip install scikit-learn
我们会用到Scikit-Learn中的两个类:CountVectorizer和TfidfTransformer。
CountVectorizer类 实现了 tokenization (词语切分)和 counting (统计词频)
TfidfTransformer类 实现归一化
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
]
# 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer()
# 计算每个出现词的词频
X = vectorizer.fit_transform(corpus)
# 打印词袋中所有文本特征值
print(vectorizer.get_feature_names())
# 打印词频矩阵
print(X.toarray())
# 该类会统计每个词语的tf-idf权值
transformer = TfidfTransformer()
# 计算词频矩阵X的TF-IDF值
tfidf = transformer.fit_transform(X)
# 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
print(tfidf.toarray())
运行结果如下:
请注意在sklearn中计算tfidf可能与教科书中给的公式有所不同,我们输入一个拥有三个特征,3*6的矩阵,手动计算一遍他的权重,然后对比计算机给出的结果
他的默认公式如下:
tf表示特征出现的次数
nd表示文档的总数
df是包含特征 t 的文档数
对于第一个[3,0,1]有:
最后要正则化,使其适应欧几里得标准:
下面是计算机计算的权重:
如果要提取中文关键词则需要引用jieba库,对语料库进行分词。
运行结果如下:
jieba库中内置了TF-IDF算法,可以直接计算权重并输出topkeywords,比较推荐使用!
四、我们为什么要这样做
关键词提取技术是自然语言处理的重要基础。随着信息科学技术的快速发展以及互联网的普及,网络文本资源呈几何级数不断增长。面对更新日益频繁和规模庞大的文本数据,如何高效准确地实现关键词提取成为影响信息检索系统性能的关键。
TF-IDF简单快速,结果符合实际情况使它成为了经典的权重算法但是他也有缺点,单纯以词频衡量词的重要性,不够全面,有时重要的词出现的次数不多,而且对词的出现位置没有设置,出现位置靠前的词和出现位置靠后的词的重要性一样,可能对全文的第一段或者每一段的第一句给予较大的权重。
对经典的 TFIDF 方法进行改进 通过了解中文自然语言的结构和中文关键词的特点,结合关键词的频率、位置关系以及词性等特征,从而提高关键词的提取性能。
目前国内学者提出了以下几种关键词提取的改进办法:
提出一种综合多因素的关键词提取方法。该方法综合网页中词语的词长、词性以及位置信息进行综合加权。
利用词语之间的语义的连贯性,结合词频、位置等特征,提出一种基于词汇链的网页关键词提取方法。
通过自然语言表现出的复杂网络特征,根据语言网络的“小世界”特性,提出基于语言网络的关键词提取方法。该方法借用复杂网络的特性,将词语之间的链接关系和位置信息相融合,从而提高关键词的抽取性能。
四、参考资料:
给出一些我学习过程中的参考资料,希望能与大家交流学习
英文文档:https://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage
中文文档:https://github.com/apachecn/sklearn-doc-zh/blob/master/docs/0.21.3/39.md