机器学习 sklearn 数据的特征抽取

备注:刷视频记录一下,以防以后相关知识点又忘记了。

数据的特征抽取

引入:通常我们通过爬虫爬到的数据往往是非连续的,例如:文本,图像等。当我们需要对这些数据做特征表述时,首先想到的是能不能将这些数据转化为数值型?那么处理起来就爽多了,这就需要引入特征抽取。

这里sklearn.feature_extraction提供了许多特征提取的方法。

分类特征变量提取

名称比较绕,其实就是一个字典数据,思考一下,一个数据集,X轴其实就是特征名,Y轴是一条一条的数据,分类特征变量==特征名。这里我们使用城市,环境来测试一下。(字典有点像java 的map,字典用{}表示)

from sklearn.feature_extraction import DictVectorizer

def dictvec():
    """
    字典数据抽取

    :return: None
    """
    #实例化
    dict = DictVectorizer(sparse = False)

    #调用fit_transform

    data  = dict.fit_transform([{'city': '北京', 'temperature':100}, {'city':'上海', 'temperature':50}, {'city':'深圳', 'temperature':30}])

    print(dict.get_feature_names())

    print(dict.inverse_transform(data))

    print(data)

    return None

从特征上面看出,城市所对应特征的特征值为1。

文本特征提取(只限于英文)

我们使用的是sklearn自带的CountVectorizer方法,比较辣鸡,处理的数据需要手动的用空格分开,一点都不智能,下面使用的jieba就吊多了。

from sklearn.feature_extraction.text import CountVectorizer

def countvec():

    """
    对文本进行特征值化
    :return:None
    """

    cv = CountVectorizer()
    #1.列表统计所有文章中所有的词,重复的只看做一次 词的列表
    #2.对每篇文章,在词的列表里统计每个词出现的次数
    #3.单个字母不统计
    #data = cv.fit_transform(["life is is short, i like python", "life is too long ,i dislike python"])
    data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用python"])

    print(cv.get_feature_names())
    #print(data)

    print(data.toarray())
    return  None

在上面二维的list里面,第一行的1表示特征在第一句话出现过,第二行表示在第二句出现过。

使用 jieba 对中文数据进行特征值化

jieba是个专门对中文进行特征处理的工具,一般结合sklearn的CountVectorizer或者TfidfVectorizer方法使用。

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba


def cutword():
    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)

    #print(c1, "\n", c2,"\n", c3)

    return c1,c2,c3



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

    print(c1, c2, c3)


    cv = CountVectorizer()
    data = cv.fit_transform([c1, c2, c3])

    print(cv.get_feature_names())

    print(data.toarray())
    return  None


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

    print(c1, c2, c3)

    tf = TfidfVectorizer()

    data = tf.fit_transform([c1, c2, c3])

    #print(tf.get_feature_names())
    #print(data)
    print(data.toarray())
    return  None

处理后的结果如下:分别是统计词频,统计逆文本频率指数,IDF中数值大的某几个值可以表示某篇文章的主旨。

CountVectorizer:统计单词出现的次数。

TfidfVectorizer引入:当我们对文本进行分类的时候,根据词频的大小来判定文章的类别,这里往往不准确,原因是文章中出现无意义的词过多,例如:但是,如果,好像,虽然...等等。这些词都不能表示文章的主旨。

TF意思是词频(Term Frequency)IDF意思是逆文本率指数(Inverse Documet Frequency)。

IDF计算公式:log(总文档数量/当前文档中 改词出现的数量)。

这里为了避免分母为0,通常log(总文档数量/当前文档中 改词出现的数量 + 1) 在分母中+1。

猜你喜欢

转载自blog.csdn.net/Rand_C/article/details/85688418
今日推荐