大数据

数据矢量化 - scikit-learn vectorizor使

2018-11-13  本文已影响2人  geekpy

在进行机器学习的过程中我们经常需要将数据矢量化,即生成某些特定的vector然后再进行训练和计算。scikit-learn提供了很多vectorizor可以用来实现这个功能,尤其是针对TFIDF算法的相关应用,我们可以很方便的使用scikit-learn的* TfidfVectorizer*来直接生成对应的TFIDF矩阵,可以非常方便的进行下一步数据处理。

TF-IDF

TF-IDF是为了提取一篇文章的关键字而诞生的算法,为了理解TF-IDF算法,先要理解如下的概念:

# 如下,一个corpus就是一个list,list中每一句话都可以认为是一个简单的文档
corpus = ["hi, you", "I'm so kind", "kiss me, baby"]

TF-IDF的公式如下图,关键字i针对文章j的tf-idf值:


tfidf.jpeg

TfidfVectorizer

基本用法

在scikit-learn中有专门的vectorizer用于将文本类数据进行矢量化,其中TfidfVectorizer在矢量化的同时还可以计算文档中各个词语的tf-idf值,是非常实用的一个文本数据处理工具。先看代码:

In [105]: from sklearn.feature_extraction.text import TfidfVectorizer

# 每个文档都是list中一个item,我们也可以使用其它iterator,比如通过generator来进行处理
In [106]: corpus = ["this artical is about scikit-learn vectorizor",
     ...:           "do you like it",
     ...:           "if you like it, please click favorite"]
     ...:

# TfidfVectorizer初始化的时候,可以有非常多的选项,我们后边再详细讲述,目前就用默认参数
In [107]: vec = TfidfVectorizer()

# fit函数一般用于load数据集,此处fit还进行了相关的分词和编码动作
In [108]: vec.fit(corpus)
Out[108]:
TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
        stop_words=None, strip_accents=None, sublinear_tf=False,
        token_pattern='(?u)\\b\\w\\w+\\b', tokenizer=None, use_idf=True,
        vocabulary=None)

# 通过vocabulary_属性我们可以看到生成的词汇表以及每个单词对应的编码(也可以认为是index)
In [110]: vec.vocabulary_
Out[110]:
{'about': 0,
 'artical': 1,
 'click': 2,
 'do': 3,
 'favorite': 4,
 'if': 5,
 'is': 6,
 'it': 7,
 'learn': 8,
 'like': 9,
 'please': 10,
 'scikit': 11,
 'this': 12,
 'vectorizor': 13,
 'you': 14}

# 每个单词对应的tf-idf值,比如第0个item1.69314718表示'about'单词对应的tf-idf值
In [111]: vec.idf_
Out[111]:
array([1.69314718, 1.69314718, 1.69314718, 1.69314718, 1.69314718,
       1.69314718, 1.69314718, 1.28768207, 1.69314718, 1.28768207,
       1.69314718, 1.69314718, 1.69314718, 1.69314718, 1.28768207])

# transform函数用于将corpus转换成matrix,这样的话每个文档就对应一个vector
# 至此,我们就已经把我们的数据corpus转化为了matrix(完成了矢量化)
In [112]: v = vec.transform(corpus)

In [113]: v.shape
Out[113]: (3, 15)

# 从此处可以看出,矢量化之后,其存储的数值还是tf-idf值
In [114]: v.toarray()
Out[114]:
array([[0.37796447, 0.37796447, 0.        , 0.        , 0.        ,
        0.        , 0.37796447, 0.        , 0.37796447, 0.        ,
        0.        , 0.37796447, 0.37796447, 0.37796447, 0.        ],
       [0.        , 0.        , 0.        , 0.60465213, 0.        ,
        0.        , 0.        , 0.45985353, 0.        , 0.45985353,
        0.        , 0.        , 0.        , 0.        , 0.45985353],
       [0.        , 0.        , 0.41756662, 0.        , 0.41756662,
        0.41756662, 0.        , 0.31757018, 0.        , 0.31757018,
        0.41756662, 0.        , 0.        , 0.        , 0.31757018]])

TfidfVectorizer参数详解

常用函数解释

References:

上一篇 下一篇

猜你喜欢

热点阅读