NLP:词中的数学( 七 )


对于自然语言文档向量空间 , 向量空间的维数是整个语料库中出现的不同词的数量 。 对于TF(和后面的TF-IDF) , 有时我们会用一个大写字母K , 称它为K维空间 。 上述在语料库中不同的词的数量也正好是语料库的词汇量的规模 , 因此在学术论文中 , 它通常被称为|V| 。 然后可以用这个K维空间中的一个K维向量来描述每篇文档 。 在前面3篇关于Harry和Jill的文档语料库中 , K = 18 。 因为人类无法轻易地对三维以上的空间进行可视化 , 所以我们接下来把大部分的高维空间放在一边 , 先看一下二维空间 , 这样我们就能在当前正在阅读的平面上看到向量的可视化表示 。 因此 , 在图3-2中 , 我们给出了18维Harry和Jill文档向量空间的二维视图 , 此时K被简化为2 。
NLP:词中的数学文章插图
图3-2 二维词项频率向量
K维向量和一般向量的工作方式是完全一样的 , 只是不太容易地对其进行可视化而已 。 既然现在已经有了每个文档的表示形式 , 并且知道它们共享公共空间 , 那么接下来可以对它们进行比较 。 我们可以通过向量相减 , 然后计算结果向量的大小来得到两个向量之间的欧几里得距离 , 也称为2范数距离 。 这是“乌鸦”从一个向量的顶点位置(头)到另一个向量的顶点位置飞行的(直线)距离 。 读者可以查看一下关于线性代数的附录C , 了解为什么欧几里得距离对词频(词项频率)向量来说不是一个好方法 。
如果两个向量的方向相似 , 它们就“相似” 。 它们可能具有相似的大小(长度) , 这意味着这两个词频(词项频率)向量所对应的文档长度基本相等 。 但是 , 当对文档中词的向量表示进行相似度估算时 , 我们是否会关心文档长度?恐怕不会 。 我们在对文档相似度进行估算时希望能够找到相同词的相似使用比例 。 准确估算相似度会让我们确信 , 两篇文档可能涉及相似的主题 。
余弦相似度仅仅是两个向量夹角的余弦值 , 如图3-3所示 , 可以用欧几里得点积来计算:
NLP:词中的数学文章插图
余弦相似度的计算很高效 , 因为点积不需要任何对三角函数求值 。 此外 , 余弦相似度的取值范围十分便于处理大多数机器学习问题:?1到+1 。
NLP:词中的数学文章插图
图3-3 二维向量的夹角
在Python中 , 可以使用
a.dot(b) == np.linalg.norm(a) * np.linalg.norm(b) / np.cos(theta)求解cos(theta)的关系 , 得到如下余弦相似度的计算公式:
NLP:词中的数学文章插图
或者可以采用纯Python(没有numpy)中的计算方法 , 如代码清单3-1所示 。
代码清单3-1 Python中的余弦相似度计算
>>> import math>>> def cosine_sim(vec1, vec2):...""" Let's convert our dictionaries to lists for easier matching."""...vec1 = [val for val in vec1.values()]...vec2 = [val for val in vec2.values()]......dot_prod = 0...for i, v in enumerate(vec1):...dot_prod += v * vec2[i]......mag_1 = math.sqrt(sum([x**2 for x in vec1]))...mag_2 = math.sqrt(sum([x**2 for x in vec2]))......return dot_prod / (mag_1 * mag_2)所以 , 我们需要将两个向量中的元素成对相乘 , 然后再把这些乘积加起来 , 这样就可以得到两个向量的点积 。 再将得到的点积除以每个向量的模(大小或长度) , 向量的模等于向量的头部到尾部的欧几里得距离 , 也就是它的各元素平方和的平方根 。 上述归一化的点积(normalized dot product)的输出就像余弦函数一样取?1到1之间的值 , 它也是这两个向量夹角的余弦值 。 这个值等于短向量在长向量上的投影长度占长向量长度的比例 , 它给出的是两个向量指向同一方向的程度 。


推荐阅读