学渣的逆袭のPython机器学习--Day_03

Posted 学渣逆袭之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学渣的逆袭のPython机器学习--Day_03相关的知识,希望对你有一定的参考价值。

前几次有几篇没有声明原创,重新发布一下......


4.2特征提取

4.2.2.1中文文本

如果按照之前处理英文文本类型的思路来处理中文,可能达不到理想的效果,因为python处理中文文本时默认特征是汉字,但我们可能需要的是某个词语作为特征出现。这里将呈现较为常见的两种处理方法。

案例1:


说明:处理字典类型与文本类型方法的不同细节

from sklearn.feature_extraction.text import CountVectorizerimport jiebadef count_ch_demo(): txt = ["我爱你","你爱我吗"] #1.实例化一个转换器类    transfer = CountVectorizer() #2.调用fit_transform txt_new = transfer.fit_transform(txt)    print("data_new:\n",txt_new.toarray())  #有集合转数组的方法 print("特征名字:\n",transfer.get_feature_names()) return Nonecount_ch_demo()

输出结果:

data_new: [[0 1] [1 0]]特征名字: ['你爱我吗', '我爱你']

这里操作与上篇英文文本类型处理相同,注意到txtnew.toarray()这个方法。我们之前处理字典类型的时候,可以设置sparse=false将“稀疏矩阵”转换成我们需要的多维矩阵,但是在文本类型下,这个方法不再适用。在文本类型(无论中文还是英文),我们采用将最后得到的特征矩阵进行“强制转换”,即通过txt_new.toarray()可以得到与处理字典类型时相同的效果。

对比试验:

from sklearn.feature_extraction.text import CountVectorizerimport jiebadef count_ch_demo(): txt = ["我爱你","你爱我吗"] #1.实例化一个转换器类    transfer = CountVectorizer() #2.调用fit_transform txt_new = transfer.fit_transform(txt) print("data_new:\n",txt_new) #没有集合转数组的方法 print("特征名字:\n",transfer.get_feature_names()) return Nonecount_ch_demo()

输出结果:

data_new: (0, 1) 1 (1, 0) 1特征名字: ['你爱我吗', '我爱你']

案例2:


涉及方法1:jieba分词

首先,我们定义一个函数,这个函数用来“切割”我们需要处理的字符串。然后,我们接下来的操作步骤与之前处理英文文本的时候相同。

from sklearn.feature_extraction.text import CountVectorizerimport jiebadef cut_word(text): text = " ".join(list(jieba.cut(text))) return textdef count_ch_demo(): data = ["BBC提到","截至当地时间3月5日","英国境内新冠病毒确诊人数达到了116人","在24小时内增加了30多个","而《卫报》则称","与两天前的51例相比","确诊人数在48小时内已经翻了一倍以上"] # #0.将中文文本进行分词 data_new = [] for data in data:        data_new.append(cut_word(data)) # #1.实例化一个转换器类 transfer = CountVectorizer() # #2.调用fit_transform data_final = transfer.fit_transform(data_new)    print("data_final:\n",data_final.toarray())  #有集合转数组的方法 print("特征名字:\n",transfer.get_feature_names())count_ch_demo()

涉及方法2:Tf-idf

from sklearn.feature_extraction.text import TfidfVectorizerdef cut_word(text): text = " ".join(list(jieba.cut(text))) return textdef tf_idf_demo(): data = ["BBC提到,截至当地时间3月5日,英国境内新冠病毒确诊人数达到了116人,在24小时内增加了30多个。而《卫报》则称,与两天前的51例相比,确诊人数在48小时内已经翻了一倍以上。"] # #0.将中文文本进行分词 data_new = [] for sent in data: data_new.append(cut_word(sent)) # print(data_new) # #1.实例化一个转换器类 transfer = TfidfVectorizer() # #2.调用fit_transform data_final = transfer.fit_transform(data_new) print("data_final:\n",data_final.toarray()) #有集合转数组的方法 print("特征名字:\n",transfer.get_feature_names())tf_idf_demo()

这里的操作与案例2的步骤、调用如出一辙,不过我们换了个调用方法TfidfVectorizer。之所以这样处理,是因为不同文本中“关键词”出现的频率不一样,而jieba分词往往不能将关键词准确找出来,因此TfidfVectorizer得到了很好地应用。

输出结果对比:

案例2方法1--输出结果:

data_final: [[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0] [1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1] [0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0] [0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0]]特征名字: ['116', '24', '30', '48', '51', 'bbc', '一倍', '两天', '人数', '以上', '卫报', '境内', '增加', '多个', '小时', '已经', '当地', '截至', '提到', '新冠', '时间', '病毒', '相比', '确诊', '英国', '达到']

案例2方法2--输出结果:

>data_final: [[0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.57735027 0.57735027 0. 0. 0.57735027 0. 0. 0. 0. 0. ] [0.36815285 0. 0. 0. 0. 0. 0. 0. 0.30559848 0. 0. 0.36815285 0. 0. 0. 0. 0. 0. 0. 0.36815285 0. 0.36815285 0. 0.30559848 0.36815285 0.36815285] [0. 0.46180424 0.46180424 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.46180424 0.46180424 0.38333718 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0.57735027 0. 0. 0.57735027 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.57735027 0. 0. 0. ] [0. 0. 0. 0.40598355 0. 0. 0.40598355 0. 0.33700121 0.40598355 0. 0. 0. 0. 0.33700121 0.40598355 0. 0. 0. 0. 0. 0. 0. 0.33700121 0. 0. ]]特征名字: ['116', '24', '30', '48', '51', 'bbc', '一倍', '两天', '人数', '以上', '卫报', '境内', '增加', '多个', '小时', '已经', '当地', '截至', '提到', '新冠', '时间', '病毒', '相比', '确诊', '英国', '达到']

**************************************************************************


以上是关于学渣的逆袭のPython机器学习--Day_03的主要内容,如果未能解决你的问题,请参考以下文章

第1次作业:学渣的心理变化

中二青年付杰的逆袭故事:从二本生到 ICLR 杰出论文奖,我用了20年

怎么学习人工智能?

从开始学习爬虫到真正赚钱只用了一个月——一个普通大专生的逆袭之路

普通程序员的逆袭:如何学习数据挖掘与人工智能

女程序员的逆袭