Advertisement

1、【特征抽取(NLP)】机器学习之特征工程和文本特征的提取

阅读量:
  • 常用数据集由特征值与目标变量(取值为0或1)组成
  • 每条记录对应一行数据,在表格中每一列代表一个特定的属性或变量
  • 在分析特征时:
    • 利用pandas库来进行基本的数据清理工作
      • 主要是针对缺失的数据进行填补和去除重复项

特征工程之特征抽取:

对文本数据进行向量化(即将其转换成数值形式):sklearn.feature_extraction
  • 对字典数据进行特征值化:sklearn.feature_extraction.DictVectorizer
复制代码
    DictVectorizer.fit_transform(X)       
    #X:字典或者包含字典的迭代器
    #返回值:返回sparse矩阵
    DictVectorizer.inverse_transform(X)
    #X:array数组或者sparse矩阵
    #返回值:转换之前数据格式
    DictVectorizer.get_feature_names()
    #返回类别名称
    DictVectorizer.transform(X)
    #按照原先的标准转换
    
    #demo
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    from sklearn.feature_extraction import DictVectorizer
    dic = DictVectorizer(sparse=True)
    print(dic.fit_transform(data))
    #默认返回sparse矩阵类型
      (0, 1)	1.0
      (0, 3)	100.0
      (1, 0)	1.0
      (1, 3)	60.0
      (2, 2)	1.0
      (2, 3)	30.0
      
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    from sklearn.feature_extraction import DictVectorizer
    dic = DictVectorizer(sparse=False)
    print(dic.fit_transform(data))
    #默认返回ndarry矩阵格式
    [[  0.   1.   0. 100.]
     [  1.   0.   0.  60.]
     [  0.   0.   1.  30.]]
    
    #对比可知,sparse中实则为第几行几列的数值为多少
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

通过CountVectorizer库对常规文本数据完成特征提取过程

复制代码
    CountVectorizer.fit_transform(X,y)       
    #X:文本或者包含文本字符串的可迭代对象
    #返回值:返回sparse矩阵
    CountVectorizer.inverse_transform(X)
    #X:array数组或者sparse矩阵
    #返回值:转换之前数据格式
    CountVectorizer.get_feature_names()
    #返回值:单词列表
    
    #demo
    data = ["life is short,i like python","life is too long,i dislike python"]
    from sklearn.feature_extraction.text import CountVectorizer
    coun = CountVectorizer()
    print(coun.fit_transform(data).toarray())
    print(coun.get_feature_names())
    #sparse.toarray()直接转为正常矩阵格式,中文也可以如此使用,但是中文需要先进行分词,主要是jieba分词
    
    [[0 1 1 1 0 1 1 0]
     [1 1 1 0 1 1 0 1]]
    ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
    
    #中文案例
    from sklearn.feature_extraction.text import CountVectorizer
    import jieba
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_1 = [jieba.lcut(i) for i in data]
    data_2 = [' '.join(i) for i in data_1]
    coun = CountVectorizer()
    print(coun.fit_transform(data_2).toarray())
    print(coun.get_feature_names())
    
    [[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
     [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
     [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
    ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

Term Frequency-Inverse Document Frequency (TF-IDF): 如果一个词或短语在一个特定文章中的出现频率较高,并且在其他文章中的出现频率较低,则该词或短语具有较强的分类区分能力。它常用于信息检索和文本分类任务中。其中TF表示Term Frequency(词频),计算公式为该词在文章中的出现次数与总单词数的比例;而IDF表示Inverse Document Frequency(逆文档频率),计算公式为log(N/df),其中N是所有文章的数量,df是包含该词的文章数量;最终的TF-IDF值即为两者相乘的结果;此外,在Python scikit-learn库中提供了TfidfVectorizer这一工具来进行相关计算

复制代码
    TfidfVectorizer(stop_words=None,…)
    #返回词的权重矩阵
    TfidfVectorizer.fit_transform(X,y)       
    #X:文本或者包含文本字符串的可迭代对象
    #返回值:返回sparse矩阵
    TfidfVectorizer.inverse_transform(X)
    #X:array数组或者sparse矩阵
    #返回值:转换之前数据格式
    TfidfVectorizer.get_feature_names()
    #返回值:单词列表
    
    #demo
    from sklearn.feature_extraction.text import TfidfVectorizer 
    import jieba
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_1 = [jieba.lcut(i) for i in data]
    data_2 = [' '.join(i) for i in data_1]
    tf = TfidfVectorizer()
    print(tf.fit_transform(data_2).toarray())
    print(tf.get_feature_names())
    
    [[0.         0.         0.21821789 0.         0.         0.
43643578 0.         0.         0.         0.         0.
21821789 0.         0.21821789 0.         0.         0.
     0.21821789 0.21821789 0.         0.43643578 0.
21821789 0.         0.43643578 0.21821789 0.         0.
     0.21821789 0.21821789 0.         0.         0.        ]
     [0.         0.         0.         0.2410822  0.         0.
     0.2410822  0.2410822  0.2410822  0.         0.
     0.         0.         0.         0.         0.2410822
55004769 0.         0.         0.         0.         0.2410822
     0.         0.         0.         0.48216441 0.
     0.         0.         0.         0.2410822  0.2410822 ]
     [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
     0.         0.         0.         0.15698297 0.15698297
     0.15698297 0.         0.15698297 0.15698297 0.
1193896  0.         0.         0.15698297 0.         0.
     0.15698297 0.         0.         0.         0.31396594
15698297 0.         0.         0.15698297 0.         0.        ]]
    ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

全部评论 (0)

还没有任何评论哟~