注:翻译自 scikit-learn 的 User Guide 中关于文本特征提取部分。
1. 词袋(Bag of Words)表示
文本分析是机器学习的一大应用领域,但是长度不一的字符序列是无法直接作为算法的输入。为了解决这个问题,scikit-learn 提供了几个常用的文本特征提取的方法:
- 将字符串切分(tokenize),比如利用空格和标点符号进行切分(中文需要额外的分词),并给每一个潜在的分词分配一个 ID
- 统计分词在每一个文本中的出现的次数(count)
- 对统计出的词频进行归一化(normalization)或者加权(weight)以消除常见词的影响。
在这个框架下,特征和样本定义为:
- 每个单词的(归一化的)词频作为特征
- 对一篇给定的文档,由这个文档的词频构成的向量视为样本
如此,一个预料库可以由一个矩阵表示,它的行代表了一篇文档,它的列则表示一个单词在这个文档中出现的频率。
我们称这种将文本转换为数值特征向量的处理为向量化,这个策略(分词 tokenization、计数 counting 和归一化 normalization)称为词袋模型。词袋模型忽视了词与词之间的位置信息
2. 稀疏性(Sparsity)
大部分文档只使用了语料库中非常小的一部分单词,导致的结果就是矩阵中绝大部分(大于99%)的特征数值都是零。为了可以存储这个大型矩阵同时加速代数运算,我们必须采用稀疏表示,比如采用 scipy.sparse 包
3. 常用向量化工具(Vectorizer)用法
CountVectorizer 在一个类内实现了分词和计数
from sklearn.feature_extraction.text import CountVectorizer
CountVectorizer 有很多参数,但是默认参数是很合理的
vectorizer = CountVectorizer()
下面我们在一个小语料上,尝试下 CountVectorizer
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
]
X = vectorizer.fit_transform(corpus)