机器学习一(2)特征提取(字典、中英文等)

- 目标

  • 应用DictVectorizer实现对类别特征进行数值化、离散化
    应用CountVectorizer实现对文本特征进行数值化
    应用TfidfVectorizer实现对文本特征进行数值化

2.1特征提取

2.2 字典特征提取

  • 作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True,)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    对字典类型的数据进行特征抽取
    :return: None
    """
     data=[{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
    transfer=DictVectorizer(sparse=False)
    print('data:\n', data, type(data))
    #data类型:<class 'list'>
    data_new=transfer.fit_transform(data)
            #transform后 FASLE时出现的情况:非稀疏矩阵——one hot编码///不写时默认为稀疏矩阵
            # [[0.   1.   0. 100.]
            #  [1.   0.   0.  60.]
            # [0.  0. 1.30.]] < class 'numpy.ndarray'>
            #numpy不能用.toarray()方法:  print("data_new:\n", data_new.toarray(), type(data_new))

            # true时出现的情况:稀疏矩阵
          #  data_new1:
        #     (0, 1)1.0
        #   (0, 3) 100.0
        #   (1, 0) 1.0
        #  (1, 3)  60.0
        #  (2, 2) 1.0
        # (2, 3) 30.0 < class 'scipy.sparse.csr.csr_matrix'>
         # 能用.toarray()方法:  print("data_new:\n", data_new.toarray(), type(data_new))


    print('data_new:\n',data_new.toarray(),type(data_new))
    print('特征名字:\n',transfer.get_feature_names())
    return None
  • 稀疏矩阵sparse
    将非零值 按位置表示出来
    节省内存 - 提高加载效率

  • 应用场景:
    1)pclass, sex 数据集当中类别特征比较多
    1、将数据集的特征-》字典类型
    2、DictVectorizer转换
    2)本身拿到的数据就是字典类型

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

2.3文本特征提取

  • 对文本数据进行特征值化,
  • 方法1:CountVectorizer
    统计每个样本特征词出现的个数
    stop_words停用的词表
    关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
  • 方法2:TfidfVectorizer
    TF-IDF - 重要程度
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

返回词频矩阵
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
sklearn.feature_extraction.text.TfidfVectorizer
  • 应用流程:实例化类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)
    transfer = CountVectorizer(stop_words=["is", "too"])
    # 2、调用fit_transform
    data = transfer.fit_transform(data)
    print("文本特征抽取的结果:\n", data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names())

    return None
**************************************************************
文本特征抽取的结果:
 [[0 1 2 0 1 1]
 [1 1 0 1 1 0]]
返回特征名字:
 ['dislike', 'life', 'like', 'long', 'python', 'short']
  • 上面结果注意:*英文默认以空格分词进行提取,一个字母不认为是单词

2.4中文分词提取(jieba)

  • jieba.cut()
    返回词语组成的生成器
    安装办法
    jieba分词详细使用方法
  • 分析流程
    准备句子,利用jieba.cut进行分词
    实例化CountVectorizer
    将分词结果变成字符串当作fit_transform的输入值
from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):

    return "_".join(list(jieba.cut(text))) 
    #通过_分隔符把list列表里面元素进行分隔,赋值给到函数返回
    def count_chinese_demo2():
    data=["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
      "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
      "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]#字典要一句句导入jieba分词
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None
***********************************************
data_new:
 [[0 1 0 1 0 1 1 0 1 0 0]
 [0 0 0 0 1 0 0 1 0 0 1]
 [1 0 1 0 0 0 0 0 0 1 0]]
特征名字:
 ['_了解_事物_真正_含义_的_秘密_取决于_如何_将_其_与_我们_所_了解_的_事物_相_联系_', '_但_绝对_大部分_是_死_在_明天_晚上_', '_你_就_不会_真正_了解_它_', '_后天_很_美好_', '_我们_是_在_看_它_的_过去_', '_所以_每个_人_不要_放弃_今天_', '_明天_更_残酷_', '_这样_当_我们_看到_宇宙_时_', '一种_还是_一种_今天_很_残酷_', '如果_只用_一种_方式_了解_某样_事物_', '我们_看到_的_从_很_远_星系_来_的_光是在_几百万年_之前_发出_的_']

2.5Tf-idf文本特征提取

  • 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
    TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
  • 公式
    词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:tfidf公式最终得出结果可以理解为重要程度。
  • 例如·注:假如一篇文件的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
  • 实际案例TfidfVectorizer
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.        ]]
返回特征名字:
 ['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值