文本向量化(欧氏距离,哈夫曼距离,L1,L2,TF-IDF)

一、欧氏距离和哈夫曼距离

假设有X = (x1,x2,...,xn)和Y = (y1,y2,...,yn)
欧式距离,即欧几里得距离,是最常见的两点之间的距离表示法,它定义在欧几里得空间中,欧式距离可表示为:
$sqrt{sum_{i=1}^{n}(x_{i} - y_{i})^{2}}$
曼哈顿距离,是欧几里得空间中两点之间的线段在坐标轴上的投影的距离的和,可以表示为:
$sqrt{sum_{i=1}^{n}left | x_{i} - y_{i} ight |}$
 

二、L1范数和L2范数归一化与正则化

1.归一化:该向量各个元素除以对应的范数

假设有向量X=(x1,x2,x2,...xn)

L1范数:向量各个元素的绝对值之和,即$sum_{i=1}^{n}left | x_{i} ight |$

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),转化公式为:$Dleft( {{{f{X}}_{ m{1}}},{{f{X}}_{ m{2}}}} ight) = sqrt {2 - 2Simleft( {{{f{X}}_{ m{1}}},{{f{X}}_{ m{2}}}} ight)}$(转化公式推导由参考链接二得)

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} eq 0}$的文件数目)如果词语不在资料中,就导致分母为零,因此一般情况下使用${displaystyle 1+|{j:t_{i}in d_{j}}|}$ 然后${displaystyle mathrm {tf{}idf_{i,j}} =mathrm {tf_{i,j}} imes 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

https://zh.wikipedia.org/wiki/Tf-idf

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html?highlight=tf%20idf#sklearn.feature_extraction.text.TfidfVectorizer

原文地址:https://www.cnblogs.com/100-rzsyztd/p/15364916.html