机器学习 -- 1 特征抽取

1 概述

使用Scikit-learn提供的特征抽取API进行特征的抽取

  • 字典特征抽取
from sklearn.feature_extraction import DictVectorizer


# 1 实例化DictVectorizer
def dicvec():
    # 实例化:
    # 默认sparse为True打印出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
    '''
    # false输出
    '''
    [[  0.   1.   0. 100.]
    [  1.   0.   0.  60.]
    [  0.   0.   1.  30.]]  
    '''
    dict = DictVectorizer(sparse=False)
    # 调用fit_transfom
    data = dict.fit_transform([{'city': '北京', 'temperature': 100},
                        {'city': '上海', 'temperature': 60},
                        {'city': '深圳', 'temperature': 30}])
    # 字典数据抽取
    # 把离散值每一个转化为多列 有多少种可能取值就有多少列  其值那一列为1 其余为0
    # 即符合 one-hot 编码
    # 连续值转化为 一列 输入数
    print(dict.get_feature_names())
    print(data)
    return None

if __name__=="__main__":
    dicvec()
  • 文本特征抽取(汉字使用jieba分词)
from sklearn.feature_extraction.text import CountVectorizer
import jieba

# CountVectorizer 返回词频矩阵
# 对文本进行特征值化
def CoubtVec():

    cv = CountVectorizer()
    data = cv.fit_transform(["life is short,i like python like","python is the thing for commom people"])
    # 按照字母顺序排列单词
    print(cv.get_feature_names())
    # 1- 统计文章中所有的词 重复的只看一次
    # 2- 对每篇文章统计每个单词出现的字数
    # 注意:单个字母不参与统计 默认直接放弃 一个英文字母对文章的分析用处不是很大 所以加以放弃
    # 在文本特征抽取时没有sparse=False选项
    # 但是给予sklearn就会有 .toarray()
    print(data.toarray())
    print('*'*50)
    # 对中文默认不支持
    data_zh = cv.fit_transform(["人生苦短,我用python","python太难,我学java"])
    print(cv.get_feature_names())
    # ['python太难', '人生苦短', '我学java', '我用python']
    print(data_zh)
    print("*"*50)

    return None
# 使用jieba分词
def cutWord(senten):
    # 返回的是词法生成器
    con = jieba.cut(senten)
    # 返回以空格隔开的字符串
    return ' '.join(list(con))

def hanzi():
    # 使用jieba分词结果:

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

    cv = CountVectorizer()
    data = cv.fit_transform([con1,con2,con3])
    print(cv.get_feature_names())
    print(data.toarray())

    return None

if __name__ == "__main__":
    CoubtVec()
    hanzi()

– 输出结果

['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0 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 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 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]]
  • tf idf
    tf: term frequency :词频
    idf inverse document frquency :逆文档频率
    公式: log(总文档/该词出现的文档数量)
    重要性程度: tf * idf
    TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
    TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
类:sklearn.feature_extraction.text.TfidfVectorizer
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

# 使用jieba分词
def cutWord(senten):
    # 返回的是词法生成器
    con = jieba.cut(senten)
    # 返回以空格隔开的字符串
    return ' '.join(list(con))

def tf_idfhanzi():
    seten1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
    seten2 = "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
    seten3 = "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"
    con1 = cutWord(seten1)
    con2 = cutWord(seten2)
    con3 = cutWord(seten3)
    tf = TfidfVectorizer()
    data = tf.fit_transform([con1,con2,con3])
    print(tf.get_feature_names())
    print(data.toarray())
    return None

if __name__ =="__main__":
    tf_idfhanzi()
  • 输出重要性矩阵
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0.         0.         0.21821789 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.        ]
 [0.         0.         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.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

猜你喜欢

转载自blog.csdn.net/qq_41009846/article/details/85139942
今日推荐