Go to Top

03_data特征抽取 of 特征工程【day1】

0、Xmind

 

 1、data的特征抽取

 1、what is 特征抽取示例?

  特征提取:文本,字符串 

 

  得出结论:

   

    特征值化是为了计算机更好的理解data

 

 2、sklearn特征抽取API

  sklearn.feature_extraction

      特征 feature     抽取 extraction

 

2、字典特征抽取

1、 DictVectorizer   

   类:sklearn.feature_extraction.DictVectorizer   

                             字典 Dict   数字化 Vectorizer   

  作用:对字典数据进行特征值化

 

  DictVectorizer语法:    

     

  流程:

    

input: list类型
    [{'city': '北京','temperature':100}
    ,{'city': '上海','temperature':60}
    ,{'city': '深圳','temperature':30}]

return sparse矩阵

 

2、代码demo

from sklearn.feature_extraction import DictVectorizer  # 字典抽取类
 
def dictVec():
    """
    字典data抽取
    :return:
    """
    # 实例化DictVectorizer
    dict = DictVectorizer()
    # dict = DictVectorizer(sparse=False)

    # 调用fit_transform方法输入data并transform
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    res = dict.fit_transform(data)

    # 打印结果
    print(dict.get_feature_names())   # return 类别名称

    print(res)

    return None

if __name__ == '__main__':
    dictVec()

'''
['city=上海', 'city=北京', 'city=深圳', 'temperature']

[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

  (0, 1)    1.0
  (0, 3)    100.0
  (1, 0)    1.0
  (1, 3)    60.0
  (2, 2)    1.0
  (2, 3)    30.0
'''

 分析:

    sparse=True 默认 

      sparse矩阵  

      节约内存,方便read处理

          

    sparse=False 

       ndarray类型  二维array

      

 

        dict.get_feature_names() # return 类别名称.

      

 

3、字典抽取总结

    dcit抽取:把dict中一些类别的data分别转换成特征

    数组形式、有类别的这些特征、首先要转换成dict data

  

可以舍弃某些data

    if pclass 为n+1的话,这类data可以舍弃

     

 

4、one-hot编码

  为每个类别生成 bool列

    

 

目的

  数组形式、有类别的这些特征  --->首先要转换成dict data  ----> one-hot编码

 

 3、文本特征抽取

1、what is 文本特征抽取?

    文本 --> number

 

2、方法

    Count

    tf * idf

 

3、用途

  文本分类、情感分析

 

3.1 count

1、text.CountVectorizer

 类:sklearn.feature_extraction.text.CountVectorizer

 作用:对文本数据进行特征值化

 语法:

  

  

流程:

  1.实例化类CountVectorizer

  2.调用fit_transform方法输入data并转换

  

2、代码demo

from sklearn.feature_extraction.text import CountVectorizer  # 文本抽取类 count

def countVect():
    """
    文本data抽取
    :return: None
    """
    # 1. 实例化
    cv = CountVectorizer()

    # 2.调用fit_transform转换data
    text1 = ["life is short,i like python", "life is too long,i dislike python"]
    text = ["生活很短,我喜欢python", "生活太久了,我不喜欢python"]
    data = cv.fit_transform(text)

    # 3.print result
    print(cv.get_feature_names())  # return list of word
    print(data.toarray())   # sparse矩阵 转换成 array二维
    # print(cv.inverse_transform(data))    # 基本用不到
 
if __name__ == '__main__':
    countVect()

 

 

 result:

    英文 

     中文 

 

   两个 is

    

    

 分析:

     

    对于单个英文字母不统计:没有分类依据(无情感、不反映主题)

    

3、jieba分词:中文文本

1.如何去对中文文本特征值化?

  中文分词---> 特征提取

result:

  

  

  空格分开

  不支持单个中文字!

 

2. jieba分词

  

 

   流程:

    

 

4、代码:中文特征抽取

from sklearn.feature_extraction.text import CountVectorizer  # 文本抽取类 count
import jieba  # jieba 中文分词

def zhCNVect():
    """
    中文特征值化
    :return: None
    """
    c1,c2,c3 = cutWord()

    # 实例化CountVectorizer
    ch_v = CountVectorizer()

    # fit_transfrom 文本转换成num
    data = ch_v.fit_transform([c1,c2,c3])

    # print result
    print(ch_v.get_feature_names())
    print(data.toarray())


def cutWord():
    # jieba.cut 分词
    input1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
    input2 ="我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
    input3 ="如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"

    con1 = jieba.cut(input1)
    con2 = jieba.cut(input2)
    con3 = jieba.cut(input3)

    # 转换成list
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # list转换成str
    c1 = " ".join(content1)
    c2 = " ".join(content2)
    c3 = " ".join(content3)
    print(c1,c2,c3)
    return c1,c2,c3

if __name__ == '__main__':
    # dictVec()
    # countVect()
    zhCNVect()

result:

  

 

3.2 tfidf 重要性程度

1、 如何通过词语占比判定文章类型?

  NO!中性词的次数,我们,明天等

 

2、tf * idf 重要性程度

  朴素贝叶斯

tf: term frequency  词的频率 

   (出现的count)

idf: inverse document frequency  逆文档频率 

   log(总文档数量/该词出现的文档数量)

        log(数值):输入的值越小,结果越小

         

tf * idf 重要性程度

 

 

3、text.TfidfVectorizer 

 类:sklearn.feature_extracion.text.TfidfVectorizer 

 语法:

  

  代码:   

from sklearn.feature_extraction.text import TfidfVectorizer  # 文本抽取类 tf*idf
import jieba  # jieba 中文分词

def cutWord():
    # jieba.cut 分词
    input1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
    input2 ="我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
    input3 ="如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"

    con1 = jieba.cut(input1)
    con2 = jieba.cut(input2)
    con3 = jieba.cut(input3)

    # 转换成list
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # list转换成str
    c1 = " ".join(content1)
    c2 = " ".join(content2)
    c3 = " ".join(content3)
    print(c1,c2,c3)
    return c1,c2,c3

def tfidfvec():
    """
    中文特征值化
    :return:
    """
    c1,c2,c3 = cutWord()

    # 实例化CountVectorizer
    tf = TfidfVectorizer()

    # fit_transfrom 文本转换成num
    data = tf.fit_transform([c1,c2,c3])

    # print result
    print(tf.get_feature_names())
    print(data.toarray())


if __name__ == '__main__':
    tfidfvec()

 

   重要性

  

4、why need TfidfVectorizer?

  

 

   图片的分类  后面讲

 

   

 

posted @ 2019-04-16 09:54  一分耕耘一分收获  阅读(255)  评论(0编辑  收藏  举报