文本向量化(欧氏距离,哈夫曼距离,L1,L2,TF-IDF)
一、欧氏距离和哈夫曼距离
二、L1范数和L2范数归一化与正则化
1.归一化:该向量各个元素除以对应的范数
假设有向量X=(x1,x2,x2,...xn)
L1范数:向量各个元素的绝对值之和,即$\sum_{i=1}^{n}\left | x_{i} \right |$
L2范数:$\sqrt{\sum_{i=1}^{n}x_{i}^{2}}$
则可得L1、L2范数归一化公式为:$\frac{X(x_{1},x_{2},x_{3},...,x_{n})}{L1}$、$\frac{X(x_{1},x_{2},x_{3},...,x_{n})}{L2}$
特别的是经过L2范数归一化之后,欧式距离和余弦相似度可以等价,假设有X1,X2向量,他们的欧式距离为D(X1,X2),余弦相似度为Sim(X1,X2),转化公式为:$D\left( {{{\bf{X}}_{\rm{1}}},{{\bf{X}}_{\rm{2}}}} \right) = \sqrt {2 - 2Sim\left( {{{\bf{X}}_{\rm{1}}},{{\bf{X}}_{\rm{2}}}} \right)}$(转化公式推导由参考链接二得)
2.正则化:正则化(Regularization) 是机器学习中对原始损失函数引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数+额外项,常用的额外项一般有两种,称作L1正则化和L2正则化(实际是L2范数的平方)。
以线性回归为例,使用L1正则化的模型叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
线性回归L1正则化损失函数:$\min_w [\sum_{i=1}^{N}(w^Tx_i - y_i)^2 + \lambda \|w\|_1 ]$
线性回归L2正则化损失函数:$\min_w[\sum_{i=1}^{N}(w^Tx_i - y_i)^2 + \lambda\|w\|_2^2]$
深入了解见参考链接四
三、TF-IDF文本向量化
在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语${\displaystyle t_{i}}$来说,它的重要性可表示为:
${\displaystyle \mathrm {tf_{i,j}} ={\frac {n_{i,j}}{\sum _{k}n_{k,j}}}}$
以上式子中${\displaystyle n_{i,j}}$是该词在文件${\displaystyle d_{j}}$中的出现次数,而分母则是在文件${\displaystyle d_{j}}$中所有字词的出现次数之和。
逆向文件频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
${\displaystyle \mathrm {idf_{i}} =\lg {\frac {|D|}{|\{j:t_{i}\in d_{j}\}|}}}$
其中|D|:语料库中的文件总数 ${\displaystyle |\{j:t_{i}\in d_{j}\}|}$:包含词语${\displaystyle t_{i}}$的文件数目(即${\displaystyle n_{i,j}\neq 0}$的文件数目)如果词语不在资料中,就导致分母为零,因此一般情况下使用${\displaystyle 1+|\{j:t_{i}\in d_{j}\}|}$ 然后${\displaystyle \mathrm {tf{}idf_{i,j}} =\mathrm {tf_{i,j}} \times \mathrm {idf_{i}} }$ 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的tf-idf。因此,tf-idf倾向于过滤掉常见的词语,保留重要的词语。
python实现TF-IDF以sklearn为例,可以使用CountVectorizer()将语料转化为词频矩阵,再使用TfidfTransformer()重置词频矩阵的权重两函数的shape是一致的。另外可以使用TfidfVectorizer()一步到位,如下:
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'This is the first document',
'This document is the second document',
'And this is the third one',
'Is this the first document',
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
# print(X.toarray())
print(X.shape) # (4,9) 4个文档,共九个词语
参考:
https://zhuanlan.zhihu.com/p/45902017
https://www.cnblogs.com/Kalafinaian/p/11180519.html
https://zhuanlan.zhihu.com/p/137073968
https://www.cnblogs.com/zingp/p/10375691.html
https://zhuanlan.zhihu.com/p/97273457