scikit-learn工具可以做:数据的特征抽取、特征预处理、降维。
数据的特征抽取:将文本等数据进行特征值化(转换成计算机可以理解的数字类型)
demo.py(字典数据抽取,字典类型的数据转换成数字类型,DictVectorizer,one-hot编码):
from sklearn.feature_extraction import DictVectorizer # 需要pip3安装scikit-learn。依赖Numpy,pandas等模块
# 字典数据抽取(将字典类型的数据转换成数字类型)
# 实例化DictVectorizer
dict = DictVectorizer(sparse=False) # sparse=False表示返回矩阵形式(默认True)。(sparse表示稀疏,矩阵形式浪费内存)
# 调用fit_transform (fit_transform()等同于fit()填充数据 + tansform()转换数据)(tansform转换器转换数据时所依赖的均值、标准差等取决于fit()填充的数据)
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(dict.get_feature_names()) # ['city=上海', 'city=北京', 'city=深圳', 'temperature']
print(data) # 第一列表示是否是"上海",第二列表示是否是"北京",最后一列表示"temperature"(本身是数值类型,不需要转换)。 参考get_feature_names()的返回值。
'''
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
'''
# 将数字类型转换成字典类型
print(dict.inverse_transform(data)) # [{'city=北京': 1.0, 'temperature': 100.0}, {'temperature': 60.0, 'city=上海': 1.0}, {'temperature': 30.0, 'city=深圳': 1.0}]
demo.py(文本数据抽取,字符串类型转换成数字类型,方式一:CountVectorizer):
from sklearn.feature_extraction.text import CountVectorizer
# 文本数据抽取(将字符串类型的数据转换成数字类型)
cv = CountVectorizer()
data = cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])
# 提取的所有特征名就是所有文章中出现过的所有单词(单个字母除外)
print(cv.get_feature_names()) # ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
print(data.toarray()) # toarray()表示转换成数组(矩阵)类型。
'''
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
'''
# 提取的数据data就是每篇文章中特征词出现的次数。
demo.py(文本数据抽取,中文文本抽取,jieba分词,方式一:CountVectorizer):
from sklearn.feature_extraction.text import CountVectorizer
import jieba # 中文分词 需要pip3安装
# 文本数据抽取(将字符串类型的数据转换成数字类型)
# 三个样本(中文文章) jieba分词
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表转换成字符串 (CountVectorizer默认以空格进行分词,单个字母或汉字会忽略)
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
# 特征抽取,特征值化
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names()) # ['一种', '不会', '不要', ... , '美好', '联系', '过去', '这样']
print(data.toarray())
'''
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
[1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
'''
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。(tf*idf:词的频率 × log(总文档数/出现该词的文档数))
demo.py(文本数据抽取,字符串类型转换成数字类型,方式二:TfidfVectorizer):
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba # 中文分词
# 文本数据抽取(将字符串类型的数据转换成数字类型)
# 三个样本(中文文章) jieba分词
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表转换成字符串 (TfidfVectorizer默认以空格进行分词,单个字母或汉字会忽略)
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
# 特征抽取,特征值化
tf = TfidfVectorizer() # stop_words=None可以指定排除的关键词
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names()) # ['一种', '不会', '不要', '之前', ... , '美好', '联系', '过去', '这样']
print(data.toarray()) # 数字越大表示重要程度越高(tf*idf:词的频率 × log(总文档数/出现该词的文档数))
'''
[[0. 0. 0.21821789 ... 0. 0. 0. ]
[0. 0. 0. ... 0. 0.2410822 0.2410822 ]
[0.15698297 0.15698297 0. ... 0.15698297 0. 0. ]]
'''