前言
本来在学习第二课,发现第二课电商应用推荐主要是关于一些机器学习推荐算法用神经网络实现或改造,因此决定学后面的课程,把这一刻放在最后学习
01.机器学习对词的表示方法
1.1 独热编码
独热编码(One-Hot Encoding),又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。即,只有一位是1,其余都是零值。如对六个状态进行编码:
000,001,010,011,100,101 //自然顺序码
000001,000010,000100,001000,010000,100000 //独热编码
- 优点:
- 独热编码简单清晰,无需解码
- 实施简单
- 缺点:
- 存储效率极低
- 没有考虑与其他单词的关系
可以使用skearn 0.20.0以上版本的preprocessing.OneHotEncoder
函数直接生成one-hot数据,也可以自己编写函数,比较简单。
1.2 全局统计量矩阵
1.2.1 基于SVD的词向量生成依赖于全局统计量矩阵X
(1) 首先遍历全部数据文本,统计不同单词同时出现的情况
(2)包含该统计量的矩阵X可以分为两种:
- 词-文矩阵
- 共生矩阵
(3)对X使用奇异值分解(SVD),得到左特征向量矩阵U
(4)U的每一行即可以作为全部数据文本对应的词向量
1.2.2 词-文矩阵的生成
基于一个假设:相关的单词在同一文本中出现的概率更高。
基本生成方法(英文直接用,中文先用分词包比如jieba分词后再使用):
- 使用
sklearn.feature_extraction.text
的CountVectorizer
对象 - 对于英文文本较为简单,可以直接使用
1.2.3 TF-IDF
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF是词频(Term Frequency),即一个文本里某个单词所出现的频次,IDF是逆文本频率指数(Inverse Document Frequency),即给定一个单词在所有的文本里出现的频次。在实际工作中会发现由于词频的巨大差异,直接使用词-文矩阵效果并不好,采用TF-IDF()方法对词频进行反向修正
- 低频词的信息增益更高:当一个低频词在一个文档中出现的时候,其信息含量很高,因此需要提高其权重;
- 反之对高频词需要减少其权重;
- TF-IDF可以用
sklearn.feature_extraction.text
的TfidfVectorizer
对象
1.2.4 共生矩阵的生成
相关的两个词,在同一个文本中经常同时出现,且出现的位置也临近。滑动窗口的共生矩阵因为包含了两个单词在一定相邻距离上同时出现的频次,因此反映了单词之间的相关程度。
共生矩阵则是统计在中心词(每一个待预测的单词)周边给定的移动窗口(离中心词的距离间隔)中,每个其他单词出现的频次
- 移动窗口可以大至全部文本,
- 遍历全部文本后就得到每个中心词与任意其他单词同时出现的频次
基本生成: - 首先把之前的分词操作封装为一个函数供后续分析使用
- 若窗口是全部文本,那么“共生矩阵”是“词-文矩阵”的内积。
- 如果需要指定窗口大小:
- 先使用一个双重list comprehension将中文单词依照单词表转换为下标
- 写一个移动窗口函数, 对于任意给定的单词(以下标index表示) , 在其左右给定窗口范围内获取邻近词
- 该操作可以使用如下的list comprehension操作实现
start = index - window_size
end = index + window_size + 1
neighbor_words = [words[i] for i in range(start, end) if 0 <= i < L and i != index]
1.2.5 SVD
SVD即奇异值分解,
SVD(X) = UN x P · SP x P · VP x PT
可被视为:
- 原始数据再低维度空间的投影。
- 基于在校二乘法的滤子
可视化程序一般在低维度空间显示投影: - 显示每个样本
- 聚类后显示类别中心点