【自然语言处理】【scikit-learn】文本特征提取

词袋表示

文本分析是机器学习算法的主要应用领域。 然而,原始数据,一串符号序列不能直接送到算法本身,因为大多数算法期望具有固定大小的数字特征向量而不是具有可变长度的原始文本文档。

为了解决这个问题,scikit-learn提供了从文本内容中提取数字特征的最常用方法的实用程序,即:

  1. 标记字符串,为每个可能的标记给定整数id,例如通过使用空格和标点符号作为标记分隔符。
  2. 计算每个文档中标记的出现次数。
  3. 对在大多数样本/文件中出现的标记标准化并通过减少重要性的加权处理。

在该方案中,特征和样本定义如下:

• 每个标记发生频率(标准化或不标准化)被视为特征

• 给定文档的所有标记频率的向量被认为是多变量样本

因此,文档语料库可以由矩阵表示,出现在语料库中的每个文档作为一行,每个标记作为一列(例如,单词)。

我们将矢量化称为将文本文档集合转换为数字特征向量的一般过程。 这种特定的策略(标记化,计数和标准化)被称为词袋或“Bag of n-gram”表示。 文档由单词出现描述,同时完全忽略文档中单词的相对位置信息。

 

稀疏性

由于大多数文档通常使用语料库中所使用字的非常小的子集,因此得到的矩阵将具有许多零(通常超过99%)特征值。 例如,10,000个短文本文档(例如电子邮件)的集合将使用总数为100,000个唯一单词的词汇表,而每个文档将单独使用100到1000个唯一单词。

 

为了能够将这样的矩阵存储在存储器中以及加速代数运算矩阵/向量,通常实现将使用稀疏的表示,例如scipy.sparse包中可用的实现。

 

常见的Vectorizer用法

CountVectorizer在单个类中实现标记化和出现次数计数:

 

from sklearn.feature_extraction.text import CountVectorizer

 

vectorizer = 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)

>>> X

<4x9 sparse matrix of type '<... 'numpy.int64'>'

with 19 stored elements in Compressed Sparse ... format>

 

默认配置通过提取至少2个字母的单词来标记字符串。

因此,在将来对变换方法的调用中,将完全忽略在训练语料库中未看到的单词:

>>> vectorizer.transform(['Something completely new.']).toarray()

...

array([[0, 0, 0, 0, 0, 0, 0, 0, 0]]...)

 

在拟合期间由分析器找到的每个项被赋予对应于结果矩阵中的列的唯一整数索引。

>>> vectorizer.get_feature_names() == (

... ['and', 'document', 'first', 'is', 'one',

... 'second', 'the', 'third', 'this'])

True

>>> X.toarray()

array([[0, 1, 1, 1, 0, 0, 1, 0, 1],

[0, 1, 0, 1, 0, 2, 1, 0, 1],

[1, 0, 0, 0, 1, 0, 1, 1, 0],

[0, 1, 1, 1, 0, 0, 1, 0, 1]]...)

 

Tf-idf术语加权

在大型文本语料库中,一些单词将非常常见(例如,英语中的“the”,“a”,“is”)因此携带关于文档的实际内容的非常少的有意义的信息。 如果我们将直接计数数据直接地提供给分类器,那么非常频繁的术语会影响更稀有但更有趣的术语的频率。

 

为了将计数特征重新加权为适合分类器使用的浮点值,使用tf-idf变换是很常见的。

Tf表示术语频率,而tf-idf表示术语频率乘以逆文档频率:

 

tf-idf(t,d)= tf(t,d)×idf(t)

 

每行被标准化为具有单位欧几里德范数:

vnorm=v|v|2=vv12+v22+⋯+vn2

 

由于tf-idf经常用于文本特征,因此还有另一个名为TfidfVectorizer的类,它将CountVectorizer和TfidfTransformer的所有选项组合在一个模型中:

 

让我们举一个例子来说明以下几点。 第一个词在100%的时间内出现,因此不是很有趣。

另外两个功能仅在不到50%的时间内,因此可能更能代表文档的内容:

 

>>> counts = [[3, 0, 1],

... [2, 0, 0],

... [3, 0, 0],

... [4, 0, 0],

... [3, 2, 0],

... [3, 0, 2]]

...

>>> tfidf = transformer.fit_transform(counts)

>>> tfidf

<6x3 sparse matrix of type '<... 'numpy.float64'>'

with 9 stored elements in Compressed Sparse ... format>

>>> tfidf.toarray()

array([[ 0.81940995, 0. , 0.57320793],

[ 1. , 0. , 0. ],

[ 1. , 0. , 0. ],

[ 1. , 0. , 0. ],

[ 0.47330339, 0.88089948, 0. ],

[ 0.58149261, 0. , 0.81355169]])

 

random使用(附)

random.seed(a=None)

初始化随机数生成器的内部状态。

 

当前时间或操作系统特定随机源(如果可用)中没有或没有参数种子(有关可用性的详细信息,请参阅os.urandom()函数)。

 

如果a不是None或int或long,则使用hash(a)代替。 请注意,启用PYTHONHASHSEED时,某些类型的哈希值是不确定的。

 

参考:http://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction

你可能感兴趣的:(人工智能,sklearn)