赞
踩
使用到的API
DictVectorizer(sparse=True)
from sklearn.feature_extraction import DictVectorizer
sparse默认是True,返回一个稀疏矩阵。
该api作用是对数据生成一个one-hot编码.
下面用一个例子来看下api具体的用法。
from sklearn.feature_extraction import DictVectorizer
data = [
{"name":"张三","score":80},
{"name":"李四","score":85},
{"name":"王五","score":90}
]
model = DictVectorizer()
res = model.fit_transform(data)
#获取数据的特征名称
print(model.get_feature_names())
print(res)
以(0, 3) 80.0
为例,是指坐标为(0,3)的对应值是80。这种方式读取效率较高。同时我们也可以让数据以one-hot编码的形式展示出来。
这里有两种方式,一种是在DictVectorizer默认sparse=True的情况下,结果用toarray()
函数。
另一种是sparse=False,此时结果没有toarray()
函数.
data = [
{"name":"张三","score":80},
{"name":"李四","score":85},
{"name":"王五","score":90}
]
model = DictVectorizer(sparse=False)
res = model.fit_transform(data)
print(model.get_feature_names())
#使用toarray(),sparse=True的情况
#print(res.toarray())
#sparse=False的情况
print(res)
这里我们分为英文文本和中文文本两块进行讨论。
使用到的API
CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
CountVectorizer里面含有的参数较多,感兴趣的可以详细了解一下
CountVectorizer(input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None,
token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.int64'>)
这里介绍一下stop_words停词器的作用:
输入一个参数列表,在文本统计时,列表中的文字将不参与统计计算。
下面我们来看下具体的示例
from sklearn.feature_extraction.text import CountVectorizer
data = ["I like Python",
"Python is best language",
"I am study Python,i love Python very much"
]
#没有sparse参数
model = CountVectorizer()
res = model.fit_transform(data)
print(model.get_feature_names())
print(res.toarray())
特征信息展示的是所有的信息,放在一个列表里面。而最后的结果,我们可以看到是一个 3 X 11的二维矩阵。其中每一行中的数值就是统计的每一句话中对应单词的个数。
需要注意的是:1、CountVectorizer没有sparse参数 ;2、单个单词不会进入统计例如:a,b,c,d。
之所以要把中文文本单独拿出来讨论,是因为中文的特殊性,在进行特征统计之前,需要先对文本进行分词。这里我们可以用jieba
分词器来实现分词。可以通过 pip install jieba进行下载。
我们先演示下分词器的使用:
import jieba
text = "我爱你中国"
#此时输出的是一个地址值
jieba.cut(text)
结果:
<generator object Tokenizer.cut at 0x0000024D3D42F468>
我们可以把结果转为为一个list,此时就可以以列表的形式输出。
list(jieba.cut(text))
#结果:['我爱你', '中国']
实现示例:
导入的库: from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
data = [
"我正在学习机器学习中文本特征提取",
"我爱中国",
"你的梦想是什么"
]
words = []
for word in data:
words.append(list(jieba.cut(word)))
#对值进行转换
model = CountVectorizer()
res = model.fit_transform(words)
res.toarray()
分词后的结果为一个二维数组,如果对这个二维数组使用CountVectorizer
会报错:AttributeError: ‘list’ object has no attribute ‘lower’
之所以会报这个错误,是因为CountVectorizer
需要的是一个可迭代的string类型的数值。我们在前面对英文文本使用该api的时候,需注意到,因为英文文本单词之间默认是使用空格分开的,而中文中没有这种要求。所以此时我们需要对分词后的中文词语,彼此之间也用空格进行分隔,同时转换为成一维。
首先定义一个分词方法,便于我们后续的使用。
import jieba
def cut_word(text):
return " ".join(list(jieba.cut(text)))
from sklearn.feature_extraction.text import CountVectorizer
data = [
"我正在学习机器学习中文本特征提取",
"我爱中国",
"你的梦想是什么"
]
words = []
for word in data:
words.append(cut_word(word))
#值的转换
model = CountVectorizer()
res = model.fit_transform(words)
res.toarray()
除了上面介绍的文本特征提取还,还有一个Tfidf文本特征提取方法,它是用来评估一个词语对一个文本的重要程度,即一个词语在文章中出现的概率。
使用到的API:
TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
我们还是以上面的文本为例:
from sklearn.feature_extraction.text import TfidfVectorizer def cut_word(text): return " ".join(list(jieba.cut(text))) data = [ "我正在学习机器学习中文本特征提取", "我爱中国", "你的梦想是什么" ] words = [] for word in data: #words.append(list(jieba.cut(word))) words.append(cut_word(word)) tfidf = TfidfVectorizer() res = tfidf.fit_transform(words) print(tfidf.get_feature_names()) print(res.toarray())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。