• sklearn.feature_extraction

字典特征抽取

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

类:sklearn.feature_extraction.DictVectorizer

DictVectorizer 语法

点此查看官方API

参数

  • dtype : callable, optional
    • 特征值的类型。传递给Numpy数组/scipy。稀疏矩阵构造函数作为dtype参数。
  • separator : string, optional
    • 隔符字符串用于构造用于一次热编码的新特性。
  • sparse : boolean, optional.
    • 转换是否应该生成scipy。稀疏矩阵。默认True。
  • sort : boolean, optional.
    • 是否应该在拟合时对feature_names_和vocabulary . _进行排序。默认True。

属性

  • vocabulary_ : dict
    • 将特征名映射到特征索引的字典
  • feature_names_ : list
    • 长度为n_features的列表,其中包含特性名称(例如,“f=ham”和“f=spam”)。

方法

fit(X[, y])
学习特性名称列表——>索引映射。
fit_transform(X[, y])
学习特性名称列表——>索引映射和转换X。
get_feature_names()
返回按索引顺序排列的特性名称列表。
get_params([deep])
获取此估计器的参数。
inverse_transform(X[, dict_type])
将数组或稀疏矩阵X转换回特征映射
restrict(support[, indices])
将特性限制为使用特性选择支持的特性
set_params(**params)
设置此估计器的参数。
transform(X)
转换特征->值dicts到数组或稀疏矩阵。

流程

  1. 实例化类DictVectorizer
  2. 调用fit_transform方法输入数据并转换 注意返回格式

示例代码

from sklearn.feature_extraction import DictVectorizer

def dictvec(data):
    '''
    字典数据抽取
    :return: result
    '''
    # 实例化
    dict = DictVectorizer()
    # dict = DictVectorizer(sparse=False) # 设置sparse为False
    # 调用fit_transform
    result = dict.fit_transform(data)
    # 输出类别名称
    print(dict.get_feature_names())
    return result
if __name__ == '__main__':
    # 数据
    data = [
        {'city': 'BeiJing','temperature':100},
        {'city': 'ShangHai', 'temperature': 60},
        {'city': 'ShenZhen', 'temperature': 30},
    ]
    # 打印结果
    print(dictvec(data))

# 运行结果
['city=BeiJing', 'city=ShangHai', 'city=ShenZhen', 'temperature']
  (0, 0)	1.0
  (0, 3)	100.0
  (1, 1)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0
# 设置sparse为False的结果
[[  1.   0.   0. 100.]
 [  0.   1.   0.  60.]
 [  0.   0.   1.  30.]]

文本特征抽取

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

类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer语法

流程

  1. 实例化类CountVectorizer
  2. 调用fit_transform方法输入数据并转换 注意返回格式,利用toarray()进行sparse矩阵转换array数组

示例代码

from sklearn.feature_extraction.text import CountVectorizer
def countvec(data):
    '''
    对文本进行特征值化
    '''
    cv = CountVectorizer()
    result = cv.fit_transform(data)
    # print(cv.get_feature_names())    # 输出类别名称
    # print(result.toarray())    # 转换array数组
    return result

if __name__ == '__main__':
    # 数据
    data = [
        "life is short,I like python",
        "life is too long,I dislike python"
    ]
    print(countvec(data))
# 运行结果
  (0, 5)	1
  (0, 3)	1
  (0, 6)	1
  (0, 1)	1
  (0, 2)	1
  (1, 0)	1
  (1, 4)	1
  (1, 7)	1
  (1, 5)	1
  (1, 1)	1
  (1, 2)	1
# 类别名称及array数组结果
''' 步骤分析:
    1.统计所有文章当中所有的词,重复的只当做一次   [词的列表]
    2.对每篇文章,在词的列表里面进行统计每个词的出现次数
'''
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

对中文文本特征抽取

  1. 使用jieba库对中文进行分词处理
  2. 将分词后的数据转换为列表,再将列表转换成字符串以空格分开 ‘ ‘.join()
  3. 将字符串当作fit_transform的输入值

代码示例

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cutword():

    con1 = jieba.cut("这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境。")
    con2 = jieba.cut("这个环境下,系统Python环境不受任何影响。")
    con3 = jieba.cut("完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。")
    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)
    # 把列表转换成字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    
    return c1,c2,c3

def countvec():
    '''
    中文特征值化
    :return:None
    '''
    c1,c2,c3 = cutword()
    print(c1,c2,c3)

    cv = CountVectorizer()

    result = cv.fit_transform([c1,c2,c3])
    print(cv.get_feature_names())
    print(result.toarray())
    return None

if __name__ == '__main__':
    countvec()
# 运行结果
这样 , 我们 就 得到 了 一个 不带 任何 第三方 包 的 “ 干净 ” 的 Python 运行 环境 。 这个 环境 下 , 系统 Python 环境 不 受 任何 影响 。 完全 可以 针对 每个 应用 创建 独立 的 Python 运行 环境 , 这样 就 可以 对 每个 应用 的 Python 环境 进行 隔离 。
['python', '一个', '不带', '任何', '创建', '可以', '完全', '干净', '应用', '影响', '得到', '我们', '每个', '独立', '环境', '第三方', '系统', '运行', '这个', '这样', '进行', '针对', '隔离']
[[1 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 0]
 [1 0 0 1 0 0 0 0 0 1 0 0 0 0 2 0 1 0 1 0 0 0 0]
 [2 0 0 0 1 2 1 0 2 0 0 0 2 1 2 0 0 1 0 1 1 1 1]]

发表回复