特征抽取

# coding=utf-8
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.dict_vectorizer import DictVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
'''
1、特征抽取:文本数据(对于单个字母不统计)
    特征抽取:就是对文本等数据进行特征值化,目的是让计算机更好的去计算
    接口:sklearn.feature_extraction.text import CountVectorizer
    方法:
          CountVectorizer.fit_transform()  
          CountVectorizer.get_feature_names()
    文本方向:
        1、文本分类 :Count计数分类
        2、情感分析
'''
def textVect():
    """
    文本特征提取
    :return: None
    """
    #实例化CountVectorizer
    vertor = CountVectorizer()

    #调用fit_transform输入并转换数据,1、统计文章当中所有的词,重复的只看作一次,作为词的列表(单个字母不统计)
    #对每篇文章,在词的列表里面进行统计每个词出现的次数
    res = vertor.fit_transform(['life is short,i like python','life is too long, i dislike python'])

    #打印结果
    print(vertor.get_feature_names())
    #  ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too'] 作为pandas的columns

    #res是sparse矩阵,需要使用toarray进行转化为pandas数据
    print(res.toarray())
    #[[0 1 1 1 0 1 1 0]
    # [1 1 1 0 1 1 0 1]]


'''
2、特征提取:字典数据
    字典特征抽取:对字典数据进行特征值化,把字典中一些类别数据(字符串类型),分别进行转换成特征(数字类型)
    而数组形式,有类别的这些特征,先要转换成字典形式
    接口:sklearn.feature_extraction.dict_vectorizer import DictVectorizer
    方法:
        DictVectorizer.fit_transform() 
        DictVectorizer.get_feature_names()
        DictVectorizer.inverse_transform()
'''
def dictVec():
    """
    字典数据抽取
    :return: None
    """
    #实例化对象,sparse=False表示不使用sparse数据格式
    dictVect = DictVectorizer(sparse=False)
    #调用fit_transform
    list_data = [{'city': '北京','temperature':100},
                {'city': '上海','temperature':60},
                {'city': '深圳','temperature':30}]


    data = dictVect.fit_transform(list_data)

    # 获取columns ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    print(dictVect.get_feature_names())

    print(data)
   # [[0.   1.   0. 100.]
     #[1.   0.   0.  60.]
     #[  0.   0.   1.  30.]]
'''
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
'''


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

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

    #把列表转为字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    return c1,c2,c3

def hanzivec():
    """
    中文特征值化
    :return:
    """
    c1,c2,c3 = cutword()
    print(c1,c2,c3)
    #实例化CountVectorizer
    vertor = CountVectorizer()

    #调用fit_transform输入并转换数据,1、统计文章当中所有的词,重复的只看作一次,作为词的列表(单个字母不统计)
    #对每篇文章,在词的列表里面进行统计每个词出现的次数
    res = vertor.fit_transform([c1,c2,c3])

    #打印结果
    print(vertor.get_feature_names())
    #  ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too'] 作为pandas的columns

    #res是sparse矩阵,需要使用toarray进行转化为pandas数据
    print(res.toarray())

'''
文本分类:
tf(term-frequency)词的频率: 统计词出现的频率

idf(inverser document frequency)逆文档频率: log(总文档数量/该词出现的文档数量)
    log(数值):输入的数值越小,结果越小

重要性程度  = tf*idf
'''
def TFIDFvec():
    """
    中文特征值化
    :return:
    """
    c1,c2,c3 = cutword()
    print(c1,c2,c3)
    #实例化CountVectorizer
    tf = TfidfVectorizer()

    #调用fit_transform输入并转换数据,1、统计文章当中所有的词,重复的只看作一次,作为词的列表(单个字母不统计)
    #对每篇文章,在词的列表里面进行统计每个词出现的次数
    res = tf.fit_transform([c1,c2,c3])

    #打印结果
    print(tf.get_feature_names())
    #  ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too'] 作为pandas的columns

    #res是sparse矩阵,需要使用toarray进行转化为pandas数据
    print(res.toarray())

if __name__ == '__main__':
    textVect()
    dictVec()
    #hanzivec()
    TFIDFvec()

 

posted @ 2019-05-10 22:47  小白啊小白,Fighting  阅读(370)  评论(0编辑  收藏  举报