备注:刷视频记录一下,以防以后相关知识点又忘记了。
数据的特征抽取
引入:通常我们通过爬虫爬到的数据往往是非连续的,例如:文本,图像等。当我们需要对这些数据做特征表述时,首先想到的是能不能将这些数据转化为数值型?那么处理起来就爽多了,这就需要引入特征抽取。
这里sklearn.feature_extraction提供了许多特征提取的方法。
分类特征变量提取
名称比较绕,其实就是一个字典数据,思考一下,一个数据集,X轴其实就是特征名,Y轴是一条一条的数据,分类特征变量==特征名。这里我们使用城市,环境来测试一下。(字典有点像java 的map,字典用{}表示)
from sklearn.feature_extraction import DictVectorizer
def dictvec():
"""
字典数据抽取
:return: None
"""
#实例化
dict = DictVectorizer(sparse = False)
#调用fit_transform
data = dict.fit_transform([{'city': '北京', 'temperature':100}, {'city':'上海', 'temperature':50}, {'city':'深圳', 'temperature':30}])
print(dict.get_feature_names())
print(dict.inverse_transform(data))
print(data)
return None
从特征上面看出,城市所对应特征的特征值为1。
文本特征提取(只限于英文)
我们使用的是sklearn自带的CountVectorizer方法,比较辣鸡,处理的数据需要手动的用空格分开,一点都不智能,下面使用的jieba就吊多了。
from sklearn.feature_extraction.text import CountVectorizer
def countvec():
"""
对文本进行特征值化
:return:None
"""
cv = CountVectorizer()
#1.列表统计所有文章中所有的词,重复的只看做一次 词的列表
#2.对每篇文章,在词的列表里统计每个词出现的次数
#3.单个字母不统计
#data = cv.fit_transform(["life is is short, i like python", "life is too long ,i dislike python"])
data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用python"])
print(cv.get_feature_names())
#print(data)
print(data.toarray())
return None
在上面二维的list里面,第一行的1表示特征在第一句话出现过,第二行表示在第二句出现过。
使用 jieba 对中文数据进行特征值化
jieba是个专门对中文进行特征处理的工具,一般结合sklearn的CountVectorizer或者TfidfVectorizer方法使用。
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
def cutword():
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但是绝大多数人死在明天晚上看不到后天的太阳")
con2 = jieba.cut("我们看到的星星也许是一百年前的, 甚至于看到的朋友都是零点几秒以前的")
con3 = jieba.cut("我们看到从春光明媚的山海关到白雪皑皑的嘉峪关,在四季景色的变化中展览信息 展览名称: 长城万里祖国同春刘松岩从艺七十年传统山水画展")
#转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
#print(c1, "\n", c2,"\n", c3)
return c1,c2,c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
return None
def tfidfvec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
#print(tf.get_feature_names())
#print(data)
print(data.toarray())
return None
处理后的结果如下:分别是统计词频,统计逆文本频率指数,IDF中数值大的某几个值可以表示某篇文章的主旨。
CountVectorizer:统计单词出现的次数。
TfidfVectorizer引入:当我们对文本进行分类的时候,根据词频的大小来判定文章的类别,这里往往不准确,原因是文章中出现无意义的词过多,例如:但是,如果,好像,虽然...等等。这些词都不能表示文章的主旨。
TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Documet Frequency)。
IDF计算公式:log(总文档数量/当前文档中 改词出现的数量)。
这里为了避免分母为0,通常log(总文档数量/当前文档中 改词出现的数量 + 1) 在分母中+1。