sklearn (scikit-learn) 是基于 Python 语言的机器学习工具,建立在 NumPy、SciPy 和 matplotlib 上,可在各种环境中重复使用。
import sklearn
特征抽取:对文本等数据进行特征值化,让计算机(在后续的机器学习中)更好地理解数据。
import sklearn.feature_extraction
1. 特征抽取
1.1 字典特征数据抽取
from sklearn.feature_extraction import DictVectorizer
DictVectorizer(sparse=False, ...) sparse=False返回为array数组形式,True则返回稀疏矩阵坐标和值对应的形式
DictVectorizer.fit_transform(dict) 将字典转换为特征值
DictVectorizer.inverse_transform(sparse) 给定矩阵,返回原先字典
DictVectorizer.get_feature_names() 获取特征类别名称
流程:
1. 实例化类DictVectorizer
2. 调用fit_transform方法输入数据并转换
其中,字符串会转化为one-hot编码形式,矩阵中对应的字符串属性项为1,其他为0。
给定字典列表:
[{'city': '北京', 'aqi': 100}, {'city': '上海', 'aqi': 60}, {'city': '深圳', 'aqi': 30}]
from sklearn.feature_extraction import DictVectorizer
dict_ = DictVectorizer(sparse=False)
data = dict_.fit_transform(
[{'city': '北京', 'aqi': 100}, {'city': '上海', 'aqi': 60}, {'city': '深圳', 'aqi': 30}])
print(dict_.get_feature_names())
print(dict_.inverse_transform(data))
print(data)
输出:
['aqi', 'city=上海', 'city=北京', 'city=深圳']
[{'aqi': 100.0, 'city=北京': 1.0}, {'aqi': 60.0, 'city=上海': 1.0}, {'aqi': 30.0, 'city=深圳': 1.0}]
[[100. 0. 1. 0.]
[ 60. 1. 0. 0.]
[ 30. 0. 0. 1.]]
1.2 文本特征数据抽取
from sklearn.feature_extraction.text import CountVectorizer
CountVectorizer()
CountVectorizer.fit_transform(str_list) 将文本转换为特征值
CountVectorizer.inverse_transform(sparse) 给定矩阵,返回原先文本
CountVectorizer.get_feature_names() 获取特征类别名称
流程:
1. 实例化类CountVectorizer
2. 调用fit_transform方法输入数据并转换
3. 利用.toarray()将返回的稀疏矩阵转换为array数组
给定文本:
["life is short, i like python python", "life is too long, i dislike python"]
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
data = cv.fit_transform(["life is short, i like python python", "life is too long, i dislike python"])
print(cv.get_feature_names())
print(data.toarray())
输出:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 2 1 0]
[1 1 1 0 1 1 0 1]]
该运算统计文章中所有的词,重复的算1次;对每篇文章,在词的列表里面进行统计每个词出现的次数;单个字母不统计。
对于中文的字符串,需要使用jieba分词
import jieba
jieba.cut("中文字符串")
返回值:词语生成器
给定中文:
"今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。" "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。" "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"
import jieba
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, c2, c3)
输出:
今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
这样,我们就可以使用CountVectorizer进行特征值提取了。
2. TF-IDF分析问题
TF-IDF是一种针对关键词的统计分析方法,用于评估一个词对一个文件集或者一个语料库的重要程度。如果某个词在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF:Term Frequency 词的频率
IDF:Inverse Document Frequency逆文档频率
from sklearn.feature_extraction.text import TfidfVectorizer
TfidfVectorizer()
TfidfVectorizer.fit_transform(str_list) 将文本转换为权重矩阵
TfidfVectorizer.inverse_transform(sparse) 给定权重矩阵,返回原先文本
TfidfVectorizer.get_feature_names() 获取特征类别名称
以上个例子中的三个中文字符串为例输入:
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
输出:
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0. 0. 0.21821789 0. 0. 0.
0.43643578 0. 0. 0. 0. 0.
0.21821789 0. 0.21821789 0. 0. 0.
0. 0.21821789 0.21821789 0. 0.43643578 0.
0.21821789 0. 0.43643578 0.21821789 0. 0.
0. 0.21821789 0.21821789 0. 0. 0. ]
[0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 0.
0. 0. 0. 0. 0. 0.2410822
0.55004769 0. 0. 0. 0. 0.2410822
0. 0. 0. 0. 0.48216441 0.
0. 0. 0. 0. 0.2410822 0.2410822 ]
[0.15698297 0.15698297 0. 0. 0.62793188 0.47094891
0. 0. 0. 0. 0.15698297 0.15698297
0. 0.15698297 0. 0.15698297 0.15698297 0.
0.1193896 0. 0. 0.15698297 0. 0.
0. 0.15698297 0. 0. 0. 0.31396594
0.15698297 0. 0. 0.15698297 0. 0. ]]
数值较大的项代表这个词更重要,更具有代表性,可以对文本进行分类。