NLP:词中的数学( 六 )


>>> from collections import OrderedDict>>> zero_vector = OrderedDict((token, 0) for token in lexicon)>>> zero_vectorOrderedDict([(',', 0),('.', 0),('and', 0),('as', 0),('faster', 0),('get', 0),('got', 0),('hairy', 0),('harry', 0),('home', 0),('is', 0),('jill', 0),('not', 0),('store', 0),('than', 0),('the', 0),('to', 0),('would', 0)])接下来可以对上述基本向量进行复制 , 更新每篇文档的向量值 , 然后将它们存储到数组中:
>>> import copy>>> doc_vectors = []>>> for doc in docs:...vec = copy.copy(zero_vector)?---copy.copy()构建了完全独立的副本 , 即0向量的一个独立的实例 , 而非复用一个指针指向原始对象的内存位置 , 否则 , 就会在每次循环中用新值重写相同的zero_vector , 从而导致每次循环都没有使用新的零向量...tokens = tokenizer.tokenize(doc.lower())...token_counts = Counter(tokens)...for key, value in token_counts.items():...vec[key] = value / len(lexicon)...doc_vectors.append(vec)现在每篇文档对应一个向量 , 我们有3个向量 。 那接下来怎么办?我们能对它们做些什么?实际上 , 这里的文档词频向量能够做任意向量能做的所有有趣的事情 , 因此 , 接下来我们首先学习一些有关向量和向量空间的知识[3] 。
向量空间向量是线性代数或向量代数的主要组成部分 。 它是一个有序的数值列表 , 或者说这些数值是向量空间中的坐标 。 它描述了空间中的一个位置 , 或者它也可以用来确定空间中一个特定的方向和大小或距离 。 空间(space)是所有可能出现在这个空间中的向量的集合 。 因此 , 两个值组成的向量在二维向量空间中 , 而3个值组成的向量在三维向量空间中 , 以此类推 。
一张作图纸或者图像中的像素网格都是很好的二维向量空间 。 我们可以看到这些坐标顺序的重要性 。 如果把作图纸上表示位置的x坐标和y坐标倒转 , 而不倒转所有的向量计算 , 那么线性代数问题的所有答案都会翻转 。 由于x坐标和y坐标互相正交 , 因此作图纸和图像是直线空间或者欧几里得空间的例子 。 我们在本章中讨论的向量都是直线空间 , 或者欧几里得空间 。
地图或地球仪上的经纬度算什么呢?地图或地球仪绝对是一个二维向量空间 , 因为它是经度和纬度两个数值的有序列表 。 但是每个经纬度对都描述了一个近似球面、凹凸不平的表面(地球的表面)上的一个点 。 经纬度坐标不是精确正交的 , 所以经纬度构成的向量空间并不是直线空间 。 这意味着我们计算像二维经纬度向量一样的向量对或者非欧几里得空间下的向量对所表示的两点之间的距离或相似度时 , 必须十分小心 。 设想一下如何基于经纬度坐标计算波特兰和纽约之间的距离[4] 。
图3-1给出了二维向量(5, 5)、(3, 2)和(?1, 1)的一种图示方法 。 向量的头部(箭头的尖)用于表示向量空间中的一个位置 。 因此 , 图中3个向量的头部对应了3组坐标 。 位置向量的尾部(有向线段的尾部)总是在坐标原点(0, 0) 。
NLP:词中的数学文章插图
图3-1 二维向量
如果是三维向量空间应该怎么办?我们生活的三维物理世界中的位置和速度可以用三维向量的坐标xyz来表示 。 或者 , 由所有经度-纬度-高度三元组形成的曲面空间可以描述近地球表面的位置 。
但是 , 我们不仅仅局限于三维空间 。 我们可以有5维、10维、5000维等各种维度的空间 。 线性代数对它们的处理方式都是一样的 。 随着维数的增加 , 我们可能需要更加强大的算力 。 大家将会遇到所谓的“维数灾难”[5]问题 , 但是我们会到最后一章(即第13章)再处理这个问题 。


推荐阅读