美文网首页机器学习ML
文本特征提取-TfidfVectorizer和CountVect

文本特征提取-TfidfVectorizer和CountVect

作者: 致Great | 来源:发表于2018-07-12 12:07 被阅读40次

    Bag of words(词袋)

    统计每个词在文档中出现的次数

    from sklearn.feature_extraction.text import CountVectorizer
    documents = ['我 爱 北京 天安门,天安门 很 壮观',
                 '我 经常 在 广场 拍照']
    
    count_vec = CountVectorizer()
    
    count_data = count_vec.fit_transform(documents)
    print(count_data, count_data.shape, type(count_data))
    count_array = count_data.toarray()
    print(count_array, count_array.shape, type(count_data))
    print('词汇表为:\n', count_vec.vocabulary_)
    

    输出为:

      (0, 1)    1  # 这里=>0代表第一个文档,也就是我们语料中第一句话,1地表词汇的索引,在这里是壮观
      (0, 2)    2
      (0, 0)    1
      (1, 4)    1
      (1, 3)    1
      (1, 5)    1 (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
    [[1 1 2 0 0 0] =>第一个文档对应的单词索引
     [0 0 0 1 1 1]] (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
    词汇表为:
     {'北京': 0, '天安门': 2, '壮观': 1, '经常': 5, '广场': 3, '拍照': 4}
    

    tfidf

    计算文档中每个词的tfidf值

    from sklearn.feature_extraction.text import TfidfVectorizer
    tfidf_vecc = TfidfVectorizer()
    count_data = tfidf_vecc.fit_transform(documents)
    print(count_data, count_data.shape, type(count_data))
    count_array = count_data.toarray()
    print(count_array, count_array.shape, type(count_data))
    print('词汇表为:\n', tfidf_vecc.vocabulary_)
    
      (0, 0)    0.408248290463863
      (0, 2)    0.816496580927726
      (0, 1)    0.408248290463863
      (1, 5)    0.5773502691896257
      (1, 3)    0.5773502691896257
      (1, 4)    0.5773502691896257 (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
    [[0.40824829 0.40824829 0.81649658 0.         0.         0.        ]
     [0.         0.         0.         0.57735027 0.57735027 0.57735027]] (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
    词汇表为:
     {'北京': 0, '天安门': 2, '壮观': 1, '经常': 5, '广场': 3, '拍照': 4}
    

    csr_matrix

    其实我比较疑惑的地方是toarray()这个方法,count_data 为什么可以通过这个方法可以转化成那个样子,后来查了一下资料:
    下面是一个关于csr_matrix的实例:

    import numpy as np
    from scipy.sparse import csr_matrix
    
    
    arr = np.array([[0, 1, 0, 2, 0], [1, 1, 0, 2, 0], [2, 0, 5, 0, 0]])
    b = csr_matrix(arr)
    
    print(b.shape)
    # 非零个数
    print(b.nnz)
    # 非零值
    print(b.data)
    # 稀疏矩阵非0元素对应的列索引值所组成数组
    print(b.indices)
    # 第一个元素0,之后每个元素表示稀疏矩阵中每行元素(非零元素)个数累计结果
    print(b.indptr)
    print(b)
    

    输出为:

    (3, 5)
    7
    [1 2 1 1 2 2 5]
    [1 3 0 1 3 0 2]
    [0 2 5 7]  =>是因为[0, 1, 0, 2, 0]有两个非0元素,[1, 1, 0, 2, 0]有3个非0,默认第一行为0,其次累加:2,2+3=5,5+2=7
      (0, 1)    1
      (0, 3)    2
      (1, 0)    1
      (1, 1)    1
      (1, 3)    2
      (2, 0)    2
      (2, 2)    5
    

    我们看下toarray的结果

    b为:
      (0, 1)    1
      (0, 3)    2
      (1, 0)    1
      (1, 1)    1
      (1, 3)    2
      (2, 0)    2
      (2, 2)    5
    
    print(b.toarray())
    [[0 1 0 2 0]
     [1 1 0 2 0]
     [2 0 5 0 0]]
    

    我们可以看书,[0 1 0 2 0]就是将(0, 1) 1 (0, 3) 2,相对应的值,填到索引位置上。
    这里比较绕,然我整理下思绪O(∩_∩)O哈哈~。。。。
    参考资料:
    csr_matrix矩阵
    sparse.csr_matrix矩阵的压缩存储
    CountVectorizer与TfidfVectorizer的参数设置

    相关文章

      网友评论

        本文标题:文本特征提取-TfidfVectorizer和CountVect

        本文链接:https://www.haomeiwen.com/subject/ahwlpftx.html