一、特征提取
字典加载特征:DictVectorizer
文本特征提取:词频向量(CountVectorizer) TF-IDF向量(TfidfVectorizer FfidfTransformer) 特征哈希向量(HashingVectorizer)
图像特征的提取:提取像素矩阵边缘和兴趣点
1.1,字典加载特征
用python中的字典存储特征是一种常用的做法,其优点是容易理解,但是sklearn的输入特征必须是numpy或Scipy的数组。可以用DictVectorizer从字典加载特征转化成numpy,并且对分类特征会采用独热编码。
我=(
{& # 39;城市# 39;:& # 39;迪拜# 39;,& # 39;温度# 39;:33。},
{& # 39;城市# 39;:& # 39;伦敦# 39;,& # 39;温度# 39;:12。},
{& # 39;城市# 39;:& # 39;圣弗朗西斯科# 39;,& # 39;温度# 39;:18。}
) 从sklearn
。feature_extraction进口DictVectorizer
vec=DictVectorizer ()
打印(vec.fit_transform(我).toarray ())
vec.get_feature_names ()
[[1。0. 0. 33。)
[0。1. 0. 12。)
[0。0. 1. 18岁。]]
1.2,字频向量
词库模型(Bag-of-words模型)是文字模型化最常用的方法,它为每个单词设值一个特征值,依据是用类似单词的文章意思也差不多
CountVectorizer类会将文档全部转化成小写,然后把句子分割成块或有意义的字母序列,并统计他们出现的次数
可以使用stop_words选项排除一些常用的但没有意义的助词。
从sklearn.feature_extraction。文本导入CountVectorizer
有限公司=(
& # 39; UNC在篮球# 39;杜克,
& # 39;杜克大学失去了篮球比赛,比赛在# 39;,
& # 39;我吃了三明治# 39;
) vec=
CountVectorizer (stop_words=& # 39;英语# 39;)
打印(vec.fit_transform (co) .todense ())
打印(vec.vocabulary_)
#三行数据
[[0 1 1 0 0 1 0 1]
[0 1 1 2 1 0 0 0]
[1 0 0 0 0 0 1 0]]
{& # 39; unc # 39;: 7日& # 39;玩# 39;:5 & # 39;杜克# 39;:2 & # 39;篮球# 39;:1 & # 39;失去# 39;:4日& # 39;游戏# 39;:3, & # 39;吃# 39;:0,& # 39;三明治# 39;:6}
进口jieba从sklearn.feature_extraction
。文本导入CountVectorizer
语料库=(
& # 39;朋友,小红是我的& # 39;,
& # 39;小明对小红说:“小红,我们还是不是朋友”& # 39;,
& # 39;小明与小红是朋友& # 39;
)
cutcorpus=[“/? join (jieba.cut (x)) x在语料库)
vec==CountVectorizer (stop_words=[& # 39;好的& # 39;,& # 39;是的& # 39;])
数量=vec.fit_transform (cutcorpus) .todense ()
打印(计数)
#查看映射字典
打印(vec.vocabulary_)
可以用词频向量的欧式距离(L2范数)来衡量两个文档之间的距离(距离越小越相似)
从sklearn.feature_extraction。文本导入CountVectorizer
#计算欧式距离
从sklearn.metrics。成对进口euclidean_distances
vectorizer=CountVectorizer ()
x, y [[0, 1], [0, 2], [1、2]]:
dist=euclidean_distances(计数[x], [y])计数
打印(& # 39;文档{}与文档{}的距离{}& # 39;.format (x, y, dist))
1.3, Tf-idf权重向量
从sklearn.feature_extraction。文本导入TfidfTransformer
变压器=TfidfTransformer (smooth_idf=False)
数量=[[3,0,1],
(2, 0, 0),
(3, 0, 0),
(4, 0, 0),
[3 2 0],
[3 0 2]]
tfidf=transformer.fit_transform(计数)
tfidf.toarray ()
阵列([[0.81940995,0。
0.57320793),[1。, 0。, 0。),
[1。, 0。, 0。),
[1。, 0。, 0。),
(0.47330339, 0.88089948, 0。),
0.58149261, 0。,0.81355169]])
从sklearn.feature_extraction。文本导入TfidfVectorizer
vectorizer=TfidfVectorizer ()
vectorizer.fit_transform (cutcorpus) .toarray ()
vectorizer.vocabulary_
{& # 39;小明& # 39;:0,& # 39;小红& # 39;:1 & # 39;我们& # 39;:2 & # 39;是不是& # 39;:3 & # 39;朋友& # 39;:4}
1.4,特征哈希值
词袋模型的方法很好用,也很直接,但在有些场景下很难使用,比如分词后的词汇字典表非常大, 达到100年万+,此时如果直接使用词频向量或Tf-idf权重向量的方法,将对应的样本对应特征矩阵载入内存,有可能将内存撑爆,在这种情况下我们该怎么办呢?