返回介绍

第 10 章 序列的修改、散列和切片

发布于 2024-02-05 21:59:47 字数 1085 浏览 0 评论 0 收藏 0

不要检查它是不是鸭子、它的叫声像不像鸭子、它的走路姿势像不像鸭子,等等。具体检查什么取决于你想使用语言的哪些行为。(comp.lang.python,2000 年 7 月 26 日)

——Alex Martelli

本章将以第 9 章定义的二维向量 Vector2d 类为基础,向前迈出一大步,定义表示多维向量的 Vector 类。这个类的行为与 Python 中标准的不可变扁平序列一样。Vector 实例中的元素是浮点数,本章结束后 Vector 类将支持下述功能:

基本的序列协议—— __len__ 和 __getitem__

正确表述拥有很多元素的实例

适当的切片支持,用于生成新的 Vector 实例

综合各个元素的值计算散列值

自定义的格式语言扩展

此外,我们还将通过 __getattr__ 方法实现属性的动态存取,以此取代 Vector2d 使用的只读特性——不过,序列类型通常不会这么做。

在大量代码之间,我们将穿插讨论一个概念:把协议当作正式接口。我们将说明协议和鸭子类型之间的关系,以及对自定义类型的实际影响。

我们开始吧!

三维以上向量的应用

谁需要 1000 维向量呢?提示:不是 3D 艺术家!不过,信息检索领域经常使用 n 维向量(n 是很大的数),查询的文档和文本使用向量表示,一个单词一个维度。这叫向量空间模型。在这个模型中,一个关键的相关指标是余弦相关性(即查询向量与文档向量夹角的余弦)。夹角越小,余弦值越趋近于 1,文档与查询的相关性就越大。

不过,本章定义的 Vector 类是为了教学而举的例子,不会涉及很多数学原理。我们的目的是以序列类型为背景说明 Python 的几个特殊方法。

如果在实际使用中需要做向量运算,应该使用 NumPy 和 SciPy。Radim Rehurek 开发的 PyPI 包 gensim 使用 NumPy 和 SciPy 实现了用于处理自然语言和检索信息的向量空间模型。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文