参考:

https://blog.csdn.net/Clannad_niu/article/details/95216996

from sklearn.feature_extraction.text import CountVectorizer
# from sklearn.feature_extraction.text import TfidfTransformer
import pandas as pd


# 参考:https://blog.csdn.net/Clannad_niu/article/details/95216996

if __name__ == '__main__':

    data = ['I love you', 'you are my angle are']
    '''
    ngram_range:(1,1)表示1-gram (2,2)表示2-gram   (1,2)表示1-gram + 2-gram
    binary:FALSE表示不将文本进行二进制表示
    token_pattern:通过正则表达式来确定哪些数据被过滤掉,默认情况下单个英文字母会被过滤掉,代码中的\w{1,}可以避免这种情况
    '''
    vecl = CountVectorizer(ngram_range=(1, 2), binary=False, token_pattern='\w{1,}')
    # 用来对数据进行处理,表示成n-gram的形式
    xl = vecl.fit_transform(data)
    # 特征名称
    print(vecl.get_feature_names())
    # 特征在列表中的索引位置
    print(vecl.vocabulary_)
    # 这样看不直观,使用pandas看会很直观
    print(xl)

    df = pd.DataFrame(xl.toarray(), columns=vecl.get_feature_names())  # to DataFrame

    print(df.head())


    '''
       angle  are  i  love  my  you
    0      0    0  1     1   0    1
    1      1    2  0     0   1    1
    输出结果表示,第一句话有1个i,1个love,1个you,第二句话有2个are,
    所以可以看出,使用CountVectorize,只能统计每句话每个词的词频,这个时候每个维度就表示一个单词,
    如果有10000句话,包含60000个单词,那么他们就可以表示成一个10000*60000的矩阵(很大),如果词汇量更大,
    则矩阵也会相应增大,并且由于很多词只出现一次,是非常冗余的,所以这种方式的使用需谨慎
    '''

输出

['angle', 'angle are', 'are', 'are my', 'i', 'i love', 'love', 'love you', 'my', 'my angle', 'you', 'you are']
{'i': 4, 'love': 6, 'you': 10, 'i love': 5, 'love you': 7, 'are': 2, 'my': 8, 'angle': 0, 'you are': 11, 'are my': 3, 'my angle': 9, 'angle are': 1}
  (0, 4)    1
  (0, 6)    1
  (0, 10)   1
  (0, 5)    1
  (0, 7)    1
  (1, 10)   1
  (1, 2)    2
  (1, 8)    1
  (1, 0)    1
  (1, 11)   1
  (1, 3)    1
  (1, 9)    1
  (1, 1)    1
   angle  angle are  are  are my  i  ...  love you  my  my angle  you  you are
0      0          0    0       0  1  ...         1   0         0    1        0
1      1          1    2       1  0  ...         0   1         1    1        1