机器学习-特征提取-字典特征提取-文本特征提取-TF-IDF

一、特征提取概要:

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

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

2、特征提取分类:
  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习介绍)
3、特征提取API:sklearn.feature_extraction

二、字典特征提取:

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

1、API:from sklearn.feature_extraction import DictVectorizer

2、sklearn.feature_extraction.DictVectorizer(sparse=True)解析:

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

3、流程分析:
(1)实例化类DictVectorizer。
(2)调用fit_transform方法输入数据并转换(注意返回格式)

4、代码分析🌰: 对字典类型的数据特征提取
[{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]

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


def dict_demo():
    """
    对字典类型的数据进行特征提取
    :return: None
    """
    # 1、获取数据
    data = [{'city': '北京', 'temperature': 100},
            {'city': '上海', 'temperature': 60},
            {'city': '深圳', 'temperature': 30}]

    # 2.字典特征提取
    # 2.1 实例化一个转换器
    # transfer = DictVectorizer(sparse=False)
    transfer = DictVectorizer(sparse=True)

    # 2.2 调用fit_transform进行转换
    new_data = transfer.fit_transform(data)
    print("字典特征提取-返回的转换结果:\n", new_data)

    # 2.3 打印特征名字:获取具体属性名
    names = transfer.get_feature_names()
    print("字典特征提取-特征名字是:\n", names)

    return None


if __name__ == '__main__':
    dict_demo()
   

5、运行结果:

sparse为True时运行结果.png

6、字典类型特征提取小结:对于特征当中存在类别信息的,我们都会做one-hot编码处理。

三、文本特征提取:

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

1、API:from sklearn.feature_extraction.text import CountVectorizer
2、sklearn.feature_extraction.text.CountVectorizer(stop_words=[])解析:
  • 返回词频矩阵。
  • CountVectorizer.fit_transform(X)
    (1) X:文本或者包含文本字符串的可迭代对象
    (2) 返回值:返回sparse矩阵
  • CountVectorizer.get_feature_names() 返回值:单词列表
3、sklearn.feature_extraction.text.fidfVectorizer
4、流程分析:

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

5、英文文本特征提取代码演示🌰:["life is short,i like python! Oh ", "life is too long,i dislike python"]
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba

def english_text_count_demo():
    """
    对文本进行特征提取,countvetorizer - 英文
    :return: None
    """
    # 1、获取数据集
    data = ["life is short,i like python! Oh ", "life is too long,i dislike python"]

    # 2、文本特征提取
    # 2.1 实例化一个转换器类
    # transfer = CountVectorizer(sparse=False)  # 注意,没有sparse这个参数
    transfer = CountVectorizer()
    transfer = CountVectorizer(stop_words=["oh"])  # 单个字母不统计,标点符号也不统计

    # 2.2 调用fit_transform
    new_data = transfer.fit_transform((data))
    print("英文文本特征提取的结果:\n", new_data.toarray())

    # 2.3 查看特征名字
    names = transfer.get_feature_names()
    print("英文文本特征提取-返回的特征名字:\n", names)
    # print(new_data.toarray)
    # print(new_data)


if __name__ == '__main__':
    english_text_count_demo()
  
5.1、英文特征提取代码运行结果:
英文特征提取代码运行结果.png
6、中文特征提取-01-不用jieba分词-代码🌰:text = ["人生苦短,我喜欢python,我喜欢python", "人生漫长,我不喜欢python!"]
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba

def chinese_text_count_demo1():
    """
    对文本进行特征提取,countvetorizer - 中文
    :return: None
    """
    # 1、获取数据集
    data = ["人生苦短,我喜欢python,我喜欢python", "人生漫长,我不喜欢python!"]

    # 2、文本特征提取
    # 2.1 实例化一个转换器类
    transfer = CountVectorizer()

    # 2.2 调用fit_transform
    new_data = transfer.fit_transform((data))
    print("中文文本特征提取的结果:\n", new_data.toarray())

    # 2.3 查看特征名字
    names = transfer.get_feature_names()
    print("中文文本特征提取-返回的特征名字:\n", names)
    # print(new_data.toarray)
    # print(new_data)


if __name__ == '__main__':
    chinese_text_count_demo1()
   
6.1、中文特征提取-01-不用jieba分词-代码运行结果:不支持单个中文字!
中文特征提取-01-不用jieba分词.png
7、中文特征提取-02-使用jieba分词:
7.1、jieba分词处理:

(1)、 jieba.cut() : 返回词语组成的生成器,需要安装jieba库
(2)、分析过程:

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

(3)、定义一个jieba分词方法-代码🌰:

def cut_word(text):
    """
    对中文进行分词
    "我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return: text
    """
    # 用结巴对中文字符串进行分词
    text = " ".join(list(jieba.cut(text)))
    # print(text)

    return text
7.2、中文特征提取-02-使用jieba分词代码🌰:
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba


def cut_word(text):
    """
    对中文进行分词
    "我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return: text
    """
    # 用结巴对中文字符串进行分词
    text = " ".join(list(jieba.cut(text)))
    # print(text)

    return text

def chinese_text_count_demo2():
    """
    对文本进行特征提取,countvetorizer - 中文
    :return: None
    """
    # 1、获取数据集
    data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
            "美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
            "阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]

    # 2.文章分割 - 将原始数据转换成分好词的形式
    text_list = []
    for temp in data:
        text_list.append(cut_word(temp))
    print(text_list)

    # 3.文本特征提取
    # 3.1 实例化一个转换器类 : 会搜索停用词列表:https://blog.csdn.net/u010533386/article/details/51458591粘贴到文档里
    transfer = CountVectorizer(stop_words=["一次", "一片"])

    # 3.2 调用fit_transform
    new_data = transfer.fit_transform((text_list))
    print("中文文本特征提取的结果:\n", new_data.toarray())

    # 3.3 查看特征名字
    names = transfer.get_feature_names()
    print("中文文本特征提取-返回的特征名字:\n", names)
    # print(new_data.toarray)
    # print(new_data)


if __name__ == '__main__':
    chinese_text_count_demo2()
    

7.3、中文特征提取-02-使用jieba分词代码运行结果:
中文特征提取-02-使用jieba分词代码运行结果.png

四、Tf-idf 文本特征提取:

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

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

4、Tf-idf的重要性:分类机器学习算法进行文章分类中前期数据处理方式。

5、Tf-idf 文本特征提取 的 API:from sklearn.feature_extraction.text import TfidfVectorizer

6、Tf-idf 文本特征提取代码实现🌰:

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


def dict_demo():
    """
    对字典类型的数据进行特征提取
    :return: None
    """
    # 1、获取数据
    data = [{'city': '北京', 'temperature': 100},
            {'city': '上海', 'temperature': 60},
            {'city': '深圳', 'temperature': 30}]

    # 2.字典特征提取
    # 2.1 实例化一个转换器
    # transfer = DictVectorizer(sparse=False)
    transfer = DictVectorizer(sparse=True)

    # 2.2 调用fit_transform进行转换
    new_data = transfer.fit_transform(data)
    print("字典特征提取-返回的转换结果:\n", new_data)

    # 2.3 打印特征名字:获取具体属性名
    names = transfer.get_feature_names()
    print("字典特征提取-特征名字是:\n", names)

    return None


def english_text_count_demo():
    """
    对文本进行特征提取,countvetorizer - 英文
    :return: None
    """
    # 1、获取数据集
    data = ["life is short,i like python! Oh ", "life is too long,i dislike python"]

    # 2、文本特征提取
    # 2.1 实例化一个转换器类
    # transfer = CountVectorizer(sparse=False)  # 注意,没有sparse这个参数
    transfer = CountVectorizer()
    transfer = CountVectorizer(stop_words=["oh"])  # 单个字母不统计,标点符号也不统计

    # 2.2 调用fit_transform
    new_data = transfer.fit_transform((data))
    print("英文文本特征提取的结果:\n", new_data.toarray())

    # 2.3 查看特征名字
    names = transfer.get_feature_names()
    print("英文文本特征提取-返回的特征名字:\n", names)
    # print(new_data.toarray)
    # print(new_data)


def cut_word(text):
    """
    对中文进行分词
    "我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return: text
    """
    # 用结巴对中文字符串进行分词
    text = " ".join(list(jieba.cut(text)))
    # print(text)

    return text


def chinese_text_count_demo1():
    """
    对文本进行特征提取,countvetorizer - 中文
    :return: None
    """
    # 1、获取数据集
    data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
            "美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
            "阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]

    # 2、文本特征提取
    # 2.1 实例化一个转换器类
    transfer = CountVectorizer()

    # 2.2 调用fit_transform
    new_data = transfer.fit_transform((data))
    print("中文文本特征提取的结果:\n", new_data.toarray())

    # 2.3 查看特征名字
    names = transfer.get_feature_names()
    print("中文文本特征提取-返回的特征名字:\n", names)
    # print(new_data.toarray)
    # print(new_data)


def chinese_text_count_demo2():
    """
    对文本进行特征提取,countvetorizer - 中文
    :return: None
    """
    # 1、获取数据集
    data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
            "美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
            "阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]

    # 2.文章分割 - 将原始数据转换成分好词的形式
    text_list = []
    for temp in data:
        text_list.append(cut_word(temp))
    print(text_list)

    # 3.文本特征提取
    # 3.1 实例化一个转换器类 : 会搜索停用词列表:https://blog.csdn.net/u010533386/article/details/51458591粘贴到文档里
    transfer = CountVectorizer(stop_words=["一次", "一片"])

    # 3.2 调用fit_transform
    new_data = transfer.fit_transform((text_list))
    print("中文文本特征提取的结果:\n", new_data.toarray())

    # 3.3 查看特征名字
    names = transfer.get_feature_names()
    print("中文文本特征提取-返回的特征名字:\n", names)
    # print(new_data.toarray)
    # print(new_data)


def tfidf_demo():
    """
    对文本进行特征提取,countvetorizer - 中文
    :return: None
    """
    # 1、获取数据集
    data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
            "美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
            "阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]

    # 2.文章分割 - 将原始数据转换成分好词的形式
    text_list = []
    for temp in data:
        text_list.append(cut_word(temp))
    print(text_list)

    # 3.文本特征提取
    # 3.1 实例化一个转换器类 : 会搜索停用词列表:https://blog.csdn.net/u010533386/article/details/51458591粘贴到文档里
    # transfer = CountVectorizer(stop_words= ["一次", "一片"])
    transfer = TfidfVectorizer()

    # 3.2 调用fit_transform
    new_data = transfer.fit_transform((text_list))
    print("中文文本特征提取的结果:\n", new_data.toarray())

    # 3.3 查看特征名字
    names = transfer.get_feature_names()
    print("中文文本特征提取-返回的特征名字:\n", names)


if __name__ == '__main__':
    # dict_demo()
    # english_text_count_demo()
    # chinese_text_count_demo1()
    # cut_word("我爱你python,人生苦短,我用python")
    # chinese_text_count_demo2()
    tfidf_demo()

7、TF-IDF运行结果:

TF-IDF运行结果.png

五、总结:

1、特征提取:将任意数据(如文本或图像)转换为可以用于机器学习的数字特征。
2、特征提取分类:

(1)字典特征提取(特征离散化)
(2)文本特征提取
(3)图像特征提取

3、字典特征提取:

(1)字典特征提取就是对类别型数据进行转换。

(2)api:sklearn.feature_extraction.DictVectorizer(sparse=True)

aparse:矩阵,1.节省内存; 2.提高读取效率
注意:对于特征当中存在类别信息的我们都会做one-hot编码处理

4、文本特征提取(英文):

(1)api : sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

stop_words -- 停用词
注意:没有sparse这个参数; 单个字母,标点符号不做统计。

5、文本特征提取(中文):

注意:

  • 1.在中文文本特征提取之前,需要对句子或文章进行分词(jieba分词)。
  • 2.里面依旧可以使用停用词,进行词语的限制。
6、TF-IDF:

(1)主要思想:

1、如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的权重。
2、 类别区分能力,适合用来分类。

(2)TF-IDF:

1、tf -- 词频
2、idf -- 逆向文档频率

(3) api : sklearn.feature_extraction.text.TfidfVectorizer
(4) 注意 :分类机器学习算法进行文章分类中前期数据处理方式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容