赞
踩
文本表示是用用计算机对自然语言(这里特定指文本)进行处理,处理后的结果做到能够为计算机所识别,直接运用,直接计算,例如用于计算文本之间的预先相似度或者字面相似度。
备注:
本质是将文本表示为向量,而且每一个维度都表示一个特征。
这里的特征可以理解为单词出现的频数,或者是单词出现的位置。(亦或是有其他的相同点也可以作为特征)
概念:one-hot向量,即为用一个词表大小确定的向量去表示一个词,(词表的向量为V,词表的长度为)将词表中的第i个词语表示为向量。而且该词表的第i个词语在第i维设置为1,其他维度均为0。
具体如图所示。
处理语义相似的词语的时候效果较差,比如美好和美丽的余弦相似度为0。对数据处理的时候未能考虑到语义相似度。
出现数据稀疏性(Data Sparsity)问题。(向量中容易出现几乎都是0的情况)
引入一些其他的特征,比如引入WordNet语义特点的同义词的特征(共同语义信息),缓解one-hot编码中的缺点。
分布式表示即为通过分布式语义假设(运用上下文词语分布去表示一个词语的意思),而且确定好分词之后我们就可以构建词语共线频次表。(两个词语在同一行出现的频次,而且默认对角线为0),下面我们利用这个表格进行优化分布式表示。具体如图所示。(在后续的计算PMI有用到)
高频无关词语提高了相似度。在构建向量的时候可能会影响词义的计算。
无法通过推导得到另外的关系,术语为共线频次无法反映词语之间的高阶关系。(A与B共线,B与C共线,无法判断A与C共线关系)
用点互信息(Pointwise Mutual Information)(PMI)去缓解高频词语对于词的向量效果构建影响。(通过对高的词语赋予低权重,对出现次数少的词语赋予高权重),而且运用(PMI/PPMI)去衡量词语的权重信息,公式以及推导如图所示。
备注:PMI更好的保留了特征,减少了其他高频词影响。
备注:p(w,c)是w和c共现的频率,p(w)和p(c)是w出现的概率和c出现的概率。
为了方便python计算数据,我们运用了极大似然估计(MLE)去计算相关的概率值。具体公式如下。相关的数据介绍也如图所示。这里的图指的是上文所提及的词语共线频次表,而且为矩阵。
为了缓解词语出现共线次数较低从而导致PMI出现负值,我们通常采用PPMI去计算。
备注:PPMI只是将计算结果跟0(极小值)做对比,如果为小于极小值,就设置为极小值。
具体公式如下。目的是保证PPMI大于等于0。
- import numpy as np
- # 这里的M是一个(V,C)的矩阵,而且V为词表大小,C为全部上下文,Mij为词Wi在上下文Cj中共线的次数
- M = np.array([
- [0, 2, 1, 1, 1, 1, 1, 2, 1, 3],
- [2, 0, 1, 1, 1, 0, 0, 1, 1, 2],
- [1, 1, 0, 1, 1, 0, 0, 0, 0, 1],
- [1, 1, 1, 0, 1, 0, 0, 0, 0, 1],
- [1, 1, 1, 1, 0, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 1],
- [2, 1, 0, 0, 0, 1, 1, 0, 1, 1],
- [1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
- [3, 2, 1, 1, 1, 1, 1, 2, 1, 0]])
- def pmi(M, positive=True):
- col_totals = M.sum(axis=0) # 按列求和
- row_totals = M.sum(axis=1) # 按行求和
- total = col_totals.sum() # 总频数
- excepted = np.outer(row_totals, col_totals) / total # 获得每个元素的分子
- M = M / excepted
- with np.errstate(divide='ignore'):# 不显示log(0)的警告
- M = np.log(M)
- M[np.isinf(M)] = 0.0 # 将log(0) 放置为0
- if positive:
- M[M < 0] = 0.0
- return M
- M_pmi = pmi(M)
- np.set_printoptions(precision=2)
- print(M_pmi)
此外,TF-IDF也可以实现环境多频次词语的影响。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。