应用DictVectorizer实现对类别特征进行数值化、离散化
应用CountVectorizer实现对文本特征进行数值化
应用TfidfVectorizer实现对文本特征进行数值化
说出两种文本特征提取的方式区别
特征提取是将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值化是为了计算机更好的去理解数据
sklearn.feature_extraction
作用:对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器,返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
- DictVectorizer.get_feature_names() 返回类别名称
我们对以下数据进行特征提取
[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]
def dictvec():
# 实例化dict
dict = DictVectorizer(sparse=False)
my_dict_list = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
# 调用 fit_transform方法输入数据并转换(注意返回格式)
data = dict.fit_transform(my_dict_list)
# 打印每一个列的名称
print(dict.get_feature_names())
print(data)
return None
注意观察没有加上sparse=False参数的结果
这个结果并不是我们想要看到的,所以加上参数,得到想要的结果,在这里我们把这个处理数据的技巧用专业的称呼"one-hot"编码。
对于特征当中存在类别信息的我们都会做one-hot编码处理
作用:对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- 返回词频矩阵
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
- CountVectorizer.get_feature_names() 返回值:单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
我们对以下数据进行特征提取
["life is short,i like python",
"life is too long,i dislike python"]
def countvec():
# 实例化conunt
count = CountVectorizer()
data = count.fit_transform(["life is is short,i like python", "life is too long,i dislike python"])
# 内容
print(count.get_feature_names())
# 利用toarray()进行sparse矩阵转换array数组
print(data.toarray())
return None
"人生苦短,我喜欢Python" "生活太长久,我不喜欢Python"
那么最终得到的结果是
为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理
- jieba.cut()
- 返回词语组成的生成器
需要安装下jieba库
pip install jieba
对以下三句话进行特征值化
今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。
如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
- 分析
- 准备句子,利用jieba.cut进行分词
- 实例化CountVectorizer
- 将分词结果变成字符串当作fit_transform的输入值
def cutword():
# 将三个句子用jieba.cut处理
contetn1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
contetn2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
contetn3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 先将着三个转换成列表
c1 = ' '.join(list(contetn1))
c2 = ' '.join(list(contetn2))
c3 = ' '.join(list(contetn3))
return c1, c2, c3
def chvec():
# 实例化conunt
count = CountVectorizer(stop_words=['不要', '我们', '所以'])
# 定义一个分词的函数
c1, c2, c3 = cutword()
data = count.fit_transform([c1, c2, c3])
# 内容
print(count.get_feature_names())
print(data.toarray())
return None
问题:该如何处理某个词或短语在多篇文章中出现的次数高这种情况?
最终得出结果可以理解为重要程度。
注:假如一篇文件的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
def tfidfvec():
# 实例化conunt
tfidf = TfidfVectorizer()
# 定义一个分词的函数
c1, c2, c3 = cutword()
data = tfidf.fit_transform([c1, c2, c3])
# 内容
print(tfidf.get_feature_names())
print(data.toarray())
return None
分类机器学习算法进行文章分类中前期数据处理方式