精华内容
下载资源
问答
  • 文本特征提取

    千次阅读 2018-08-13 13:40:58
    注:翻译自scikit-learn的User Guide中关于文本特征提取部分。 1. ci’daThe Bag of Words representation

    注:翻译自 scikit-learn 的 User Guide 中关于文本特征提取部分。

    1. 词袋(Bag of Words)表示

    文本分析是机器学习的一大应用领域,但是长度不一的字符序列是无法直接作为算法的输入。为了解决这个问题,scikit-learn 提供了几个常用的文本特征提取的方法:

    • 将字符串切分(tokenize),比如利用空格和标点符号进行切分(中文需要额外的分词),并给每一个潜在的分词分配一个 ID
    • 统计分词在每一个文本中的出现的次数(count)
    • 对统计出的词频进行归一化(normalization)或者加权(weight)以消除常见词的影响。

    在这个框架下,特征和样本定义为:

    • 每个单词的(归一化的)词频作为特征
    • 对一篇给定的文档,由这个文档的词频构成的向量视为样本

    如此,一个预料库可以由一个矩阵表示,它的行代表了一篇文档,它的列则表示一个单词在这个文档中出现的频率。

    我们称这种将文本转换为数值特征向量的处理为向量化,这个策略(分词 tokenization、计数 counting 和归一化 normalization)称为词袋模型。词袋模型忽视了词与词之间的位置信息

    2. 稀疏性(Sparsity)

    大部分文档只使用了语料库中非常小的一部分单词,导致的结果就是矩阵中绝大部分(大于99%)的特征数值都是零。为了可以存储这个大型矩阵同时加速代数运算,我们必须采用稀疏表示,比如采用 scipy.sparse 包

    3. 常用向量化工具(Vectorizer)用法

    CountVectorizer 在一个类内实现了分词和计数

    from sklearn.feature_extraction.text import CountVectorizer

    CountVectorizer 有很多参数,但是默认参数是很合理的

    vectorizer = CountVectorizer()

    下面我们在一个小语料上,尝试下 CountVectorizer

    corpus = [
         'This is the first document.',
         'This is the second second document.',
         'And the third one.',
         'Is this the first document?',
         ]
    X = vectorizer.fit_transform(corpus)
    展开全文
  • 维吾尔文Bigram文本特征提取
  • 文章目录4.4 特征工程-特征提取1 特征提取1.1 定义1.2 特征提取API2 字典特征提取2.1 应用2.2 流程分析2.3 总结3 文本特征提取3.1 应用3.2 流程分析3.3 jieba分词处理3.4 案例分析3.5 Tf-idf文本特征提取3.5.1 公式...

    决策树算法

       朴素贝叶斯要求特征相互独立,只能处理文本这种,更好的分类要用到决策树,决策树后面还有更更好的随机森林属于集成学习 可以解决很多的事情

    学完决策树算法,您应该掌握

    • 掌握决策树实现过程
    • 知道信息熵的公式以及作用
    • 知道信息增益的作用
    • 知道信息增益率的作用
    • 知道基尼指数则作用
    • 知道id3,c4.5,cart算法的区别
    • 了解cart剪枝的作用
    • 应用DecisionTreeClassifier实现决策树分类

    四、特征工程-特征提取

    在这里插入图片描述
       把文本这种非结构化的数据转换成我们机器学习可以用的结构化数据

    什么是特征提取呢?
    在这里插入图片描述

    在这里插入图片描述

    1 特征提取

    1.1 定义

    将任意数据(如文本或图像)转换为可用于机器学习的数字特征

    注:特征值化是为了计算机更好的去理解数据

    • 特征提取分类:
      • 字典特征提取(特征离散化)   工作中使用较少
      • 文本特征提取   工作中使用较多
      • 图像特征提取(深度学习将介绍)   工作中使用较多

    1.2 特征提取API

    sklearn.feature_extraction
    

    2 字典特征提取

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

    - sklearn.feature_extraction.DictVectorizer(sparse=True,…)

    • DictVectorizer.fit_transform(X)
      • X:字典或者包含字典的迭代器返回值
      • 返回sparse矩阵
    • DictVectorizer.get_feature_names() 返回类别名称

    2.1 应用

    我们对以下数据进行特征提取

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

    在这里插入图片描述

    2.2 流程分析

    • 实例化类DictVectorizer
    • 调用fit_transform方法输入数据并转换(注意返回格式)
    from sklearn.feature_extraction import DictVectorizer
    
    def dict_demo():
        """
        对字典类型的数据进行特征抽取
        :return: None
        """
        data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
        # 1、实例化一个转换器类
        transfer = DictVectorizer(sparse=False)
        # 2、调用fit_transform
        data = transfer.fit_transform(data)
        print("返回的结果:\n", data)
        # 打印特征名字
        print("特征名字:\n", transfer.get_feature_names())
    
        return None
    

    注意观察没有加上sparse=False参数的结果

    返回的结果:
       (0, 1)    1.0
      (0, 3)    100.0
      (1, 0)    1.0
      (1, 3)    60.0
      (2, 2)    1.0
      (2, 3)    30.0
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    

    这个结果并不是我们想要看到的,所以加上参数,得到想要的结果:

    返回的结果:
     [[   0.    1.    0.  100.]
     [   1.    0.    0.   60.]
     [   0.    0.    1.   30.]]
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    

    之前在学习pandas中的离散化的时候,也实现了类似的效果。

    我们把这个处理数据的技巧叫做”one-hot“编码:

    在这里插入图片描述

    转化为:

    在这里插入图片描述

    from sklearn.feature_extraction import DictVectorizer
    
    data = [{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
    
    data 
    
    # 哑变量矩阵
    
    #实例化转换器
    transfer = DictVectorizer(sparse=False)#如果输出为True就会返回稀疏矩阵
    #转换数据 提取字典特征
    res = transfer.fit_transform(data)
    res #哑变量矩阵 会自动把离散的特征做one_hot编码
    
    #获取列的名字 上海列只有在上海的样本里面标记为1
    transfer.get_feature_names()
    
    # 稀疏矩阵(更简洁)
    
    #实例化转换器
    transfer = DictVectorizer(sparse=True)#如果输出为True就会返回稀疏矩阵
    #转换数据 提取字典特征
    res = transfer.fit_transform(data)
    res #此时是稀疏变量矩阵 会自动把离散的特征做one_hot编码
    
    print(res)
    #坐标对应着数值 表示(0,1)这个位置的值是1,(0,3)这个位置的值是100 对应参考哑变量矩阵
    #稀疏矩阵:记录了所有非零元素的下标(位置)和对应的值
    #稀疏矩阵比较快速的得到哪些地方有值
    
    #稀疏矩阵转化为nd.array
    res.toarray()
    
    
    

    在这里插入图片描述
    在这里插入图片描述

    2.3 总结

    对于特征当中存在类别信息的我们都会做one-hot编码处理

    3 文本特征提取

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    作用:对文本数据进行特征值化

    • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
      • 返回词频矩阵
      • CountVectorizer.fit_transform(X)
        • X:文本或者包含文本字符串的可迭代对象
        • 返回值:返回sparse矩阵
      • CountVectorizer.get_feature_names() 返回值:单词列表
    • sklearn.feature_extraction.text.TfidfVectorizer

    3.1 应用

    我们对以下数据进行特征提取

    ["life is short,i like python",
    "life is too long,i dislike python"]
    

    在这里插入图片描述

    3.2 流程分析

    • 实例化类CountVectorizer
    • 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
    from sklearn.feature_extraction.text import CountVectorizer
    
    def text_count_demo():
        """
        对文本进行特征抽取,countvetorizer
        :return: None
        """
        data = ["life is short,i like like python", "life is too long,i dislike python"]
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
        transfer = CountVectorizer()
        # 2、调用fit_transform
        data = transfer.fit_transform(data)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    文本特征抽取的结果:
     [[0 1 1 2 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 #返回的值都是稀疏矩阵
    
    data = ['life is short, i am vicky' , 'vicky, i love you']#这就是两篇文章
    
    #实例化转换器
    transfer = CountVectorizer()
    
    #转换数据 提取文本特征 
    res = transfer.fit_transform(data)
    
    res#稀疏矩阵
    
    print(res)#每篇文章中每个词出现的次数都是1
    
    res.toarray()#每一行表示一个样本
    
    #获取名字,丢失了顺序,没丢失次数
    transfer.get_feature_names()
    

    问题:如果我们将数据替换成中文?

    "人生苦短,我喜欢Python","生活太长久,我不喜欢Python"
    
    

    那么最终得到的结果是
    在这里插入图片描述

    为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理
    在这里插入图片描述

    3.3 jieba分词处理

    • jieba.cut()
      • 返回词语组成的生成器

    需要安装下jieba库

    pip3 install jieba
    
    

    3.4 案例分析

    对以下三句话进行特征值化

    今天很残酷,明天更残酷,后天很美好,
    但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
    
    我们看到的从很远星系来的光是在几百万年之前发出的,
    这样当我们看到宇宙时,我们是在看它的过去。
    
    如果只用一种方式了解某样事物,你就不会真正了解它。
    了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
    
    
    • 分析
      • 准备句子,利用jieba.cut进行分词
      • 实例化CountVectorizer
      • 将分词结果变成字符串当作fit_transform的输入值
        在这里插入图片描述
    from sklearn.feature_extraction.text import CountVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_count_demo2():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = CountVectorizer()
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    
    

    返回结果:

    Building prefix dict from the default dictionary ...
    Dumping model to file cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
    Loading model cost 1.032 seconds.
    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
    Prefix dict has been built succesfully.
    文本特征抽取的结果:
     [[2 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 1 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 0 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 0]]
    返回特征名字:
     ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    
    

    但如果把这样的词语特征用于分类,会出现什么问题?

    请看问题:

    在这里插入图片描述

    该如何处理某个词或短语在多篇文章中出现的次数高这种情况
    分析:
    在这里插入图片描述
    在这里插入图片描述
    完整版:
    在这里插入图片描述
    在这里插入图片描述
    代码:

    中文分词词数统计

    ##########################
    #中文分词词数统计
    import jieba
    data = ['我将书抱下来准备擦书拒柜的顶层,谁知心急多抱了几本,结果因为太重抱不住,一摞书“哗啦啦”掉了下来','我是汪雯琦,今天是2020年3月3日,不知道什么时候疫情才能完全控制,摘下口罩出去外面玩呢']
    
    #中文分词
    def cut_words(s):
        return ' '.join(list(jieba.cut(s)))
    
    # 将data做分词,切完了再实例化和提取
    temp = []
    for i in data:
        temp.append(cut_words(i))
    
    #实例化转换器 现在可以处理已经切分过的中文的计数了!!!!!!!!!!!!!!!!!!
    transfer = CountVectorizer()
    #转换数据 提取字典特征 会自动把离散的特征做one_hot编码
    res = transfer.fit_transform(temp)
    
    res.toarray()
    
    #获取列的名字
    transfer.get_feature_names()
    

    3.5 Tf-idf文本特征提取

       计算词语对文章的重要性,也可以判断文章的类型
       tf就是词频值一个指定的词语在该文件中出现的频率,idf就是逆向文档频率,总文件数目除以包含该词语的文件的数目,再将得到的商取以10为底的对数

       10000的数量文章,出现汪雯琦的文章有1000个,就是log10为底(10000-1000)

    • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
    • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

    3.5.1 公式

    • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

    在这里插入图片描述

    最终得出结果可以理解为重要程度。

    举例:
    假如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。
    而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。
    所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,
    其逆向文件频率就是lg(10,000,000 / 1,0000)=3。
    最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
    
    
    tdidf的接口是from sklearn.feature_extraction.text import TfidfVectorizer

    3.5.2 案例

    from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_tfidf_demo():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    Building prefix dict from the default dictionary ...
    Loading model from cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
    Loading model cost 0.856 seconds.
    Prefix dict has been built succesfully.
    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
    文本特征抽取的结果:
     [[ 0.          0.          0.          0.43643578  0.          0.          0.
       0.          0.          0.21821789  0.          0.21821789  0.          0.
       0.          0.          0.21821789  0.21821789  0.          0.43643578
       0.          0.21821789  0.          0.43643578  0.21821789  0.          0.
       0.          0.21821789  0.21821789  0.          0.          0.21821789
       0.        ]
     [ 0.2410822   0.          0.          0.          0.2410822   0.2410822
       0.2410822   0.          0.          0.          0.          0.          0.
       0.          0.2410822   0.55004769  0.          0.          0.          0.
       0.2410822   0.          0.          0.          0.          0.48216441
       0.          0.          0.          0.          0.          0.2410822
       0.          0.2410822 ]
     [ 0.          0.644003    0.48300225  0.          0.          0.          0.
       0.16100075  0.16100075  0.          0.16100075  0.          0.16100075
       0.16100075  0.          0.12244522  0.          0.          0.16100075
       0.          0.          0.          0.16100075  0.          0.          0.
       0.3220015   0.16100075  0.          0.          0.16100075  0.          0.
       0.        ]]
    返回特征名字:
     ['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    

    3.6 Tf-idf的重要性

    分类机器学习算法进行文章分类中前期数据处理方式

    在这里插入图片描述
    在这里插入图片描述

    from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba
    data = ['走吧我们去复合去重蹈覆辙互相折磨 但我更喜欢另一段话 算了吧 那段痛不欲生的日子 我好不容易熬过来的 所以 千万拜托你 别再来打扰我了 我还是很喜欢你 看到你的消息还是会心动 听你的语音还是会欢呼雀跃 但我真的该忘记你了','总有一天你会明白 你的委屈要自己消化 你的秘密不要逢人就讲 真正理解你的人没有几个 大多数人只会站在他们的立场 偷看你的笑话 你能做的就是 把秘密藏起来 然后一步一步的长大']
    
    # 中文分词
    def cut_words(s):
        return ' '.join(list(jieba.cut(s)))
    
    #把data做成数据分词
    temp = []
    for i in data:
        temp.append(cut_words(i))
        
    #实例化转换器 用tfidf
    transfer = TfidfVectorizer()
    #转换数据
    res = transfer.fit_transform(temp)#稀疏矩阵
    
    res.toarray()#稀疏矩阵转换成ndarray(一步对第一篇文章的重要性为0,重要性可以代替次数!!!!!!!!!!!!!!!!)
    
    
    #获取列名字
    transfer.get_feature_names()
    

    可以把每个词语转变成向量!!!!!!!!
    考虑到词语的意思相近的词语在空间中的距离近!!!!词嵌入 word2Vec(后面NLP会讲)
    这样损失的信息会更低!!!

    展开全文
  • 目录特征工程——特征提取1、特征提取1.1 定义1.2 特征提取API2、字典特征提取2.1 应用2.2 流程分析2.3 总结3、文本特征提取3.1 应用3.2 流程分析3.3 jieba分词处理3.4 案例分析3.5 Tf-idf文本特征提取3.5.1 公式...

    特征工程——特征提取

    特征提取是特征工程里面的一部分操作,下面开始介绍特征提取:

    什么是特征提取呢?
    在这里插入图片描述
    在这里插入图片描述

    1、特征提取

    1.1 定义

    将任意数据(如文本或图像)转换为可用于机器学习的数字特征

    注:特征值化是为了计算机更好的去理解数据

    • 特征提取分类:
      • 字典特征提取(特征离散化)
      • 文本特征提取
      • 图像特征提取(深度学习将介绍)

    1.2 特征提取API

    sklearn.feature_extraction
    

    2、字典特征提取

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

    sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    
    • DictVectorizer.fit_transform(X)

      • X:字典或者包含字典的迭代器返回值
      • 返回sparse矩阵
    • DictVectorizer.get_feature_names() 返回类别名称

    2.1 应用

    我们对以下数据进行特征提取:

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

    在这里插入图片描述

    2.2 流程分析

    • 实例化类DictVectorizer
    • 调用fit_transform方法输入数据并转换(注意返回格式)
    from sklearn.feature_extraction import DictVectorizer
    
    def dict_demo():
        """
        字典特征提取
        :return:None
        """
        # 1.获取数据
        data = [{'city': '北京', 'temperature': 100},
                {'city': '上海', 'temperature': 60},
                {'city': '深圳', 'temperature': 30}]
    
        # 2.字典特征提取
        # 2.1实例化
        transfer = DictVectorizer(sparse=True) # sparse好处是节省内存,提高访问效率
    
        # 2.2转换
        new_data = transfer.fit_transform(data)
        print(new_data)
    
        # 2.3获取具体属性名
        names = transfer.get_feature_names()
        print(names)
    
    if __name__ == "__main__":
        dict_demo()
    

    注意观察sparse=False参数的结果:

    返回的结果:
      (0, 1)    1.0
      (0, 3)    100.0
      (1, 0)    1.0
      (1, 3)    60.0
      (2, 2)    1.0
      (2, 3)    30.0
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    

    这个结果和我们平时的不一样,这个是稀疏矩阵的存储,那再看看sparse=True参数的结果:

    返回的结果:
     [[   0.    1.    0.  100.]
     [   1.    0.    0.   60.]
     [   0.    0.    1.   30.]]
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    

    我们把这个处理数据的技巧叫做”one-hot“编码:
    在这里插入图片描述
    转化为:
    在这里插入图片描述

    2.3 总结

    对于特征当中存在类别信息的我们都会做one-hot编码处理

    3、文本特征提取

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

    API:
    第一个:

    sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
    
    • stop_words:表示哪些词不用特征值化
    • 返回词频矩阵

    然后:

    • CountVectorizer.fit_transform(X)
      • X:文本或者包含文本字符串的可迭代对象
      • 返回值:返回sparse矩阵
    • CountVectorizer.get_feature_names() 返回值:单词列表

    第二个:

    sklearn.feature_extraction.text.TfidfVectorizer
    

    3.1 应用

    我们对以下数据进行特征提取:

    ["life is short,i like python",
    "life is too long,i dislike python"]
    

    在这里插入图片描述
    那怎么实现上面的编码呢?接着看:

    3.2 流程分析

    • 实例化类CountVectorizer
    • 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
    from sklearn.feature_extraction.text import CountVectorizer
    
    def text_count_demo():
        """
        对文本进行特征抽取,countvetorizer
        :return: None
        """
        data = ["life is short,i like like python", "life is too long,i dislike python"]
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
        transfer = CountVectorizer() # 注意:有stop_words=[]这个参数,
        # 2、调用fit_transform
        data = transfer.fit_transform(data)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    文本特征抽取的结果:
     [[0 1 1 2 0 1 1 0]
     [1 1 1 0 1 1 0 1]]
    返回特征名字:
     ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
    

    注意:返回的是特征名字出现的次数

    问题:如果我们将数据替换成中文?

    "人生苦短,我喜欢Python","生活太长久,我不喜欢Python"
    

    那么最终得到的结果是:

    在这里插入图片描述
    为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理。

    3.3 jieba分词处理

    • jieba.cut()
      • 返回词语组成的生成器

    需要安装下jieba库

    pip3 install jieba
    

    3.4 案例分析

    对以下三句话进行特征值化

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

    分析:

    • 准备句子,利用jieba.cut进行分词
    • 实例化CountVectorizer
    • 将分词结果变成字符串当作fit_transform的输入值

    在这里插入图片描述

    from sklearn.feature_extraction.text import CountVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用jieba对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_count_demo2():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = CountVectorizer()
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
    Prefix dict has been built succesfully.
    文本特征抽取的结果:
     [[2 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 1 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 0 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 0]]
    返回特征名字:
     ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    

    但如果把这样的词语特征用于分类,会出现什么问题?

    请看问题:
    在这里插入图片描述
    该如何处理某个词或短语在多篇文章中出现的次数高这种情况

    3.5 Tf-idf文本特征提取

    • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
    • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度

    3.5.1 公式

    • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
      在这里插入图片描述

    最终得出结果可以理解为重要程度。

    举例:
    假如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。
    而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。
    所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,
    其逆向文件频率就是lg(10,000,000 / 1,0000)=3。
    最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
    

    3.5.2 案例

    from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_tfidf_demo():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
    文本特征抽取的结果:
     [[ 0.          0.          0.          0.43643578  0.          0.          0.
       0.          0.          0.21821789  0.          0.21821789  0.          0.
       0.          0.          0.21821789  0.21821789  0.          0.43643578
       0.          0.21821789  0.          0.43643578  0.21821789  0.          0.
       0.          0.21821789  0.21821789  0.          0.          0.21821789
       0.        ]
     [ 0.2410822   0.          0.          0.          0.2410822   0.2410822
       0.2410822   0.          0.          0.          0.          0.          0.
       0.          0.2410822   0.55004769  0.          0.          0.          0.
       0.2410822   0.          0.          0.          0.          0.48216441
       0.          0.          0.          0.          0.          0.2410822
       0.          0.2410822 ]
     [ 0.          0.644003    0.48300225  0.          0.          0.          0.
       0.16100075  0.16100075  0.          0.16100075  0.          0.16100075
       0.16100075  0.          0.12244522  0.          0.          0.16100075
       0.          0.          0.          0.16100075  0.          0.          0.
       0.3220015   0.16100075  0.          0.          0.16100075  0.          0.
       0.        ]]
    返回特征名字:
     ['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    

    这里再解释一下文本特征提取的结果:返回的是tf-idf分数,也就是特征在每篇文章中的tf-idf分数,比如说:‘之前’这个特征在三篇文章中的tf-idf分数分别为0、0.2410822、0,那就说明在第二篇中的重要程度比其他两篇大。

    3.6 Tf-idf的重要性

    分类机器学习算法进行文章分类中前期数据处理方式

    4、总结:

    在这里插入图片描述

    若有用,欢迎点赞,若有错,请指正,谢谢!

    展开全文
  • 文章目录4.4 特征工程-特征提取学习目标1 特征提取1.1 定义1.2 特征提取API2 字典特征提取2.1 应用2.2 流程分析2.3 总结3 文本特征提取3.1 应用3.2 流程分析3.3 jieba分词处理3.4 案例分析3.5 Tf-idf文本特征提取...

    4.4 特征工程-特征提取

    学习目标

    • 了解什么是特征提取
    • 知道字典特征提取操作流程
    • 知道文本特征提取操作流程
    • 知道tfidf的实现思想

    什么是特征提取呢?

    在这里插入图片描述

    在这里插入图片描述

    1 特征提取

    1.1 定义

    将任意数据(如文本或图像)转换为可用于机器学习的数字特征

    注:特征值化是为了计算机更好的去理解数据

    • 特征提取分类:
      • 字典特征提取(特征离散化)
      • 文本特征提取
      • 图像特征提取(深度学习将介绍)

    1.2 特征提取API

    sklearn.feature_extraction
    

    2 字典特征提取

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

    • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
      • DictVectorizer.fit_transform(X)
        • X:字典或者包含字典的迭代器返回值
        • 返回sparse矩阵
      • DictVectorizer.get_feature_names() 返回类别名称

    2.1 应用

    我们对以下数据进行特征提取

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

    在这里插入图片描述

    2.2 流程分析

    • 实例化类DictVectorizer
    • 调用fit_transform方法输入数据并转换(注意返回格式)
      from sklearn.feature_extraction import DictVectorizer
        
        def dict_demo():
            """
            对字典类型的数据进行特征抽取
            :return: None
            """
            data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
            # 1、实例化一个转换器类
            transfer = DictVectorizer(sparse=False)
            # 2、调用fit_transform
            data = transfer.fit_transform(data)
            print("返回的结果:\n", data)
            # 打印特征名字
            print("特征名字:\n", transfer.get_feature_names())
        
            return None
    

    注意观察没有加上sparse=False参数的结果

    返回的结果:
       (0, 1)    1.0
      (0, 3)    100.0
      (1, 0)    1.0
      (1, 3)    60.0
      (2, 2)    1.0
      (2, 3)    30.0
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    

    这个结果并不是我们想要看到的,所以加上参数,得到想要的结果:

    返回的结果:
     [[   0.    1.    0.  100.]
     [   1.    0.    0.   60.]
     [   0.    0.    1.   30.]]
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    

    之前在学习pandas中的离散化的时候,也实现了类似的效果。

    我们把这个处理数据的技巧叫做”one-hot“编码:

    在这里插入图片描述

    转化为:

    在这里插入图片描述

    2.3 总结

    对于特征当中存在类别信息的我们都会做one-hot编码处理

    3 文本特征提取

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

    • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

      • 返回词频矩阵
      • CountVectorizer.fit_transform(X)
        • X:文本或者包含文本字符串的可迭代对象
        • 返回值:返回sparse矩阵
      • CountVectorizer.get_feature_names() 返回值:单词列表
    • sklearn.feature_extraction.text.TfidfVectorizer

    3.1 应用

    我们对以下数据进行特征提取

    ["life is short,i like python",
    "life is too long,i dislike python"]
    

    在这里插入图片描述

    3.2 流程分析

    • 实例化类CountVectorizer

    • 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)

      from sklearn.feature_extraction.text import CountVectorizer

      def text_count_demo():
      “”"
      对文本进行特征抽取,countvetorizer
      :return: None
      “”"
      data = [“life is short,i like like python”, “life is too long,i dislike python”]
      # 1、实例化一个转换器类
      # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
      transfer = CountVectorizer()
      # 2、调用fit_transform
      data = transfer.fit_transform(data)
      print(“文本特征抽取的结果:\n”, data.toarray())
      print(“返回特征名字:\n”, transfer.get_feature_names())

      return None
      

    返回结果:

    文本特征抽取的结果:
     [[0 1 1 2 0 1 1 0]
     [1 1 1 0 1 1 0 1]]
    返回特征名字:
     ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
    

    问题:如果我们将数据替换成中文?

    "人生苦短,我喜欢Python","生活太长久,我不喜欢Python"
    

    那么最终得到的结果是

    在这里插入图片描述

    为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理

    3.3 jieba分词处理

    • jieba.cut()
      • 返回词语组成的生成器

    需要安装下jieba库

    pip3 install jieba
    

    3.4 案例分析

    对以下三句话进行特征值化

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

      • 准备句子,利用jieba.cut进行分词
      • 实例化CountVectorizer
      • 将分词结果变成字符串当作fit_transform的输入值

      在这里插入图片描述

    from sklearn.feature_extraction.text import CountVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_count_demo2():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = CountVectorizer()
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    Building prefix dict from the default dictionary ...
    Dumping model to file cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
    Loading model cost 1.032 seconds.
    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
    Prefix dict has been built succesfully.
    文本特征抽取的结果:
     [[2 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 1 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 0 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 0]]
    返回特征名字:
     ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    

    但如果把这样的词语特征用于分类,会出现什么问题?

    请看问题:

    在这里插入图片描述

    该如何处理某个词或短语在多篇文章中出现的次数高这种情况

    3.5 Tf-idf文本特征提取

    • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
    • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

    3.5.1 公式

    • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

    在这里插入图片描述

    最终得出结果可以理解为重要程度。

    举例:
    假如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。
    而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。
    所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,
    其逆向文件频率就是lg(10,000,000 / 1,0000)=3。
    最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
    

    3.5.2 案例

    from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_tfidf_demo():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    

    返回结果:

    Building prefix dict from the default dictionary ...
    Loading model from cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
    Loading model cost 0.856 seconds.
    Prefix dict has been built succesfully.
    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
    文本特征抽取的结果:
     [[ 0.          0.          0.          0.43643578  0.          0.          0.
       0.          0.          0.21821789  0.          0.21821789  0.          0.
       0.          0.          0.21821789  0.21821789  0.          0.43643578
       0.          0.21821789  0.          0.43643578  0.21821789  0.          0.
       0.          0.21821789  0.21821789  0.          0.          0.21821789
       0.        ]
     [ 0.2410822   0.          0.          0.          0.2410822   0.2410822
       0.2410822   0.          0.          0.          0.          0.          0.
       0.          0.2410822   0.55004769  0.          0.          0.          0.
       0.2410822   0.          0.          0.          0.          0.48216441
       0.          0.          0.          0.          0.          0.2410822
       0.          0.2410822 ]
     [ 0.          0.644003    0.48300225  0.          0.          0.          0.
       0.16100075  0.16100075  0.          0.16100075  0.          0.16100075
       0.16100075  0.          0.12244522  0.          0.          0.16100075
       0.          0.          0.          0.16100075  0.          0.          0.
       0.3220015   0.16100075  0.          0.          0.16100075  0.          0.
       0.        ]]
    返回特征名字:
     ['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    

    3.6 Tf-idf的重要性

    分类机器学习算法进行文章分类中前期数据处理方式


    4 小结

    • 特征提取【了解】
      • 将任意数据(如文本或图像)转换为可用于机器学习的数字特征
    • 特征提取分类:【了解】
      • 字典特征提取(特征离散化)
      • 文本特征提取
      • 图像特征提取
    • 字典特征提取【知道】
      • 字典特征提取就是对类别型数据进行转换
      • api:sklearn.feature_extraction.DictVectorizer(sparse=True,…)
        • aparse矩阵
          • 1.节省内容
          • 2.提高读取效率
        • 注意:
          • 对于特征当中存在类别信息的我们都会做one-hot编码处理
    • 文本特征提取(英文)【知道】
      • api:sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
        • stop_words – 停用词
        • 注意:没有sparse这个参数
        • 单个字母,标点符号不做统计
    • 文本特征提取(中文)【知道】
      • 注意:
        • 1.在中文文本特征提取之前,需要对句子(文章)进行分词(jieba)
        • 2.里面依旧可以使用停用词,进行词语的限制
    • tfidf【知道】
      • 主要思想:
        • 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的
        • 类别区分能力,适合用来分类
      • tfidf
        • tf – 词频
        • idf – 逆向文档频率
      • api:sklearn.feature_extraction.text.TfidfVectorizer
      • 注意:
        • 分类机器学习算法进行文章分类中前期数据处理方式
    展开全文
  • 文本特征提取CountVectorizer属于机器学习特征工程中特征提取的一个tip,如果我们对一篇文章进行分类,用什么特征比较好呢(不单看文章的标题的话)?句子、短语、单词、字母中哪个合适一点呢,比较一下单词好一点。...
  • 机器学习文本数据特征提取相对数字要复杂很多,本质上就是做单词切分,有的切分超级简单,有的切分超级难。下面演示一个简单的例子,不同的单词当做一个新的...文本特征提取>>> hacker = [... {'name':'ai...
  • 文本特征提取方案汇总文本分析是机器学习算法的主要应用领域。但是,文本分析的原始数据无法直接丢给算法,这些原始数据是一组符号,因为大多数算法期望的输入是固定长度的数值特征向量而不是不同长度的文本文件。一...
  • 本文主要向大家介绍了机器学习入门之机器学习之路:python 文本特征提取 CountVectorizer, TfidfVectorizer,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。本特征提取:将文本数据转化成特征向量...
  • 文本特征提取方法研究一、课题背景概述文本挖掘是一门交叉性学科,涉及数据挖掘、机器学习、模式识别、人工智能、统计学、计算机语言学、计算机网络技术、信息学等多个领域。文本挖掘就是从大量的文档中发现隐含知识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,310
精华内容 1,324
关键字:

文本特征提取