学渣的逆袭のPython机器学习--Day_03
Posted 学渣逆袭之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学渣的逆袭のPython机器学习--Day_03相关的知识,希望对你有一定的参考价值。
前几次有几篇没有声明原创,重新发布一下......
4.2特征提取
4.2.2.1中文文本
如果按照之前处理英文文本类型的思路来处理中文,可能达不到理想的效果,因为python处理中文文本时默认特征是汉字,但我们可能需要的是某个词语作为特征出现。这里将呈现较为常见的两种处理方法。
案例1:
说明:处理字典类型与文本类型方法的不同细节
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def 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 None
count_ch_demo()
输出结果:
data_new:
[ ]
[ ]]
特征名字:
[ ]
这里操作与上篇英文文本类型处理相同,注意到txtnew.toarray()这个方法。我们之前处理字典类型的时候,可以设置sparse=false将“稀疏矩阵”转换成我们需要的多维矩阵,但是在文本类型下,这个方法不再适用。在文本类型(无论中文还是英文),我们采用将最后得到的特征矩阵进行“强制转换”,即通过txt_new.toarray()可以得到与处理字典类型时相同的效果。
对比试验:
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def 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 None
count_ch_demo()
输出结果:
data_new:
(0, 1) 1
(1, 0) 1
特征名字:
['你爱我吗', '我爱你']
案例2:
涉及方法1:jieba分词
首先,我们定义一个函数,这个函数用来“切割”我们需要处理的字符串。然后,我们接下来的操作步骤与之前处理英文文本的时候相同。
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
text = " ".join(list(jieba.cut(text)))
return text
def 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 TfidfVectorizer
def cut_word(text):
text = " ".join(list(jieba.cut(text)))
return text
def 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的主要内容,如果未能解决你的问题,请参考以下文章
中二青年付杰的逆袭故事:从二本生到 ICLR 杰出论文奖,我用了20年