欢迎访问集智主站:集智,通向智能时代的引擎html
在使用机器学习方法解决实际问题的时候,每每咱们所获得的并非纯粹的数据文件,它们有多是图片、文本、视频等包含有效信息的复杂数据,这时候就须要咱们从这些数据中提取数字特征,以便于咱们以后的分析和训练过程。本节将介绍Scikit-learn中可用于文本分类的一些功能,它们包括bash
关于具体的使用文本特征进行模型训练、评估和优化过程,咱们将在下一节的文章中进行讨论。网络
首先来了解咱们所要用到的数据集。本文所用到的数据集被称为“20种新闻组”,是一个常常被用来进行机器学习和天然语言处理的数据集。它包含20种新闻类别的近20000篇新闻,其官方简介可参见 http://qwone.com/~jason/20Newsgroups/ 。数据结构
咱们有多种方式来获取这个数据集,一种简单的方法是使用sclearn的自带函数sklearn.datasets.fetch_20newsgroups
。这个函数能自动从网上下载“20种新闻组”的数据并进行读取,示例以下。为了节省计算和处理的时间,咱们仅选取20种分类中的四种进行以后的分析工做。dom
注意:因为数据包体积较大且数据源地址在国外,下述示例运行将比较缓慢,所以不提供运行。机器学习
from sklearn.datasets import fetch_20newsgroups
# 选取须要下载的新闻分类
categories = ["alt.atheism", "soc.religion.christian",
"comp.graphics", "sci.med"]
# 下载并获取训练数据
twenty_train = fetch_20newsgroups(subset="train",
categories=categories, shuffle=True, random_state=42)
# 显示训练数据的分类
twenty_train.target_names
复制代码
固然,咱们更经常使用的方法是直接从网络下载咱们所须要的数据。咱们能够用Python所提供的urllib库来完成数据包的下载工做,并解压。从网络下载文件可使用urllib.request.urlretrieve
这个函数。一般,咱们下载到的数据包都是压缩文件,这时候咱们可使用tarfile
这个库来完成,以下面的例子所示。函数
# 从网络下载数据包
from urllib import request
request.urlretrieve("http://jizhi-10061919.cos.myqcloud.com/sklearn/20news-bydate.tar.gz", "data.tar.gz")
# 解压下载的数据包
import tarfile
tar = tarfile.open("data.tar.gz", "r:gz")
tar.extractall()
tar.close()
# 选取须要下载的新闻分类
categories = ['alt.atheism','soc.religion.christian',
'comp.graphics', 'sci.med']
# 从硬盘获取训练数据
from sklearn.datasets import load_files
twenty_train = load_files('20news-bydate/20news-bydate-train',
categories=categories,
load_content = True,
encoding='latin1',
decode_error='strict',
shuffle=True,random_state=42)
# 显示训练数据的分类
print(twenty_train.target_names)
复制代码
如上所示,数据包下载完成后,咱们可使用sklearn.datasets.load_files
来获取数据。咱们一样只采集四种分类的文本数据用于分析,并检查所读取文本数据的一些信息以肯定数据已被读取。post
不管是什么机器学习方法,都只能针对向量特征(也就是一系列的数字组合)进行分析,所以在读取文本以后,咱们要将文本转化为数字化的特征向量。学习
提取文本特征最经常使用的一种方法就是使用词袋模型,其具体表述以下: 为训练集文档中全部出现的词语给予一个固定的数字ID(也就是为全部的词语创建一个由整数进行索引的字典) 对于每一篇文档#i
,计算每一个词语w
出现的次数并将其记录在X[i, j]
中做为特征#j
的值,j
表明词语w在字典中的位置fetch
词袋模型假设每一个数据集中存在n_features
个不一样的单词,而这个数字一般会超过100000。这会带来什么问题呢?考虑一下,若是采样数(也就是文档的个数)为10000,特征以32位浮点数存储,则总的文本特征须要,而这4GB必须所有存储在计算机内存中,这对于如今的计算机而言几乎是不可能的。
幸运的是,上述方法获得的特征数据中大部分特征数值都会是零值,这是由于每篇文档实际上仅使用了几百个不一样的词汇。因为这个缘由,咱们将词袋模型称之为高维度稀疏数据集。咱们能够经过仅存储非零特征来大幅节省内存使用量。
scipy.sparse
模型正是处理这个过程的一系列数据结构,而它们也获得了scikit-learn
的支持。
一个高效的数据处理模块会包含文本与处理、标记和停词(stopwords,指对句意无影响的虚词,如“的”、“地”等等)过滤等功能,这些功能可以帮助咱们将文本数据转换为特征向量,从而创建起数据的特征字典。
CountVectorizer
就是一个支持文本中词语计数的函数库,咱们可使用其中的函数来分析文本数据来获得特征向量字典,字典中每个项目的值表明该词语在所有数据中出现的次数,以下面的例子所示。
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
# 打印特征相关信息
print("训练数据共有{0}篇, 词汇计数为{1}个".format(X_train_counts.shape[0], X_train_counts.shape[1]))
# 查看某个词语的计数
count = count_vect.vocabulary_.get(u'algorithm')
print("algorithm的出现次数为{0}".format(count))
复制代码
统计词语的出现次数是个很好的尝试,但这也一样存在一个问题,那就是对于一个词语而言,它在较长篇幅的文章出现的几率每每会比短文章高得多,即使是这两篇文章讨论的是同一个话题,这个现象一样存在。
为了解决这些潜在的差别,咱们能够尝试用每一个词语在某个文档中出现的次数除以这个文档中总共的词语数目,这样获得的新的特征咱们能够称之为tf
,也就是词频(Term Frequencies)。
在tf
基础上的另一种优化方案是为某些不过重要的词语下降权重,这些词语每每会在不少文档中出现,相对于那些仅在一小部分文档中出现的词语而言,它们对于分类的影响会更细微。
咱们把这种词频+权重模型称之为tf-idf
,也就是“Term Frequency times Inverse Document Frequency”。下面咱们简要介绍它们的数学意义。
tf
,即词频,指的是一个词语在某篇文档
中中出现的几率,它能够用以下的公式计算:
[math]$$$\textrm{tf}_{i,j}=\frac{n_{i,j}}{\sum_kn_{k,j}}$$$[/math]
其中指词语在文件
中出现的次数,而
[math]$\sum_kn_{k,j}$[/math]
指文件中全部词语的出现次数。
idf
,即逆向文件频率,指的是一个词语广泛重要性的度量,表示该词语信息量的大小。IDF能够由总文件数目除以包含该词语的文件的数目而后取对数获得:
其中表示数据中的文件总数,
表示包含词语
的文件数目。
最后则有:
[math]$$$\textrm{tfidf}_{i,j}= \textrm{tf}_{i,j}\times \textrm{idf}_i$$$[/math]
tf
与tf-idf
都可以经过如下的方式获得计算。
from sklearn.feature_extraction.text import TfidfTransformer
# 使用TF-IDF提取文本特征
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
# 查看特征结果
X_train_tf.shape
复制代码
在上述的代码中,咱们首先使用了fit(..)
方法来处理原始文本数据而后使用transform(..)
方法来将词汇统计数据转换为tf-idf
模型。这两部其实能够合并到一块儿以节省计算过程,咱们可使用以下所示的fit_transform(..)
方法来实现这一点。
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
# 查看特征结果
X_train_tfidf.shape
复制代码
至此咱们就完成了使用tf-idf
模型从文本数据提取数据特征的所有过程,咱们将在下一节讨论如何使用这些数据特征进行文本分类模型训练、评估和优化过程。
(本篇课程内容来自于Scikit-Learn - Working With Text Data,转载请注明来源。)