magnitude
Magnitude 是一款专为机器学习设计的高性能向量嵌入工具库,由 Plasticity 团队开发。它提供了一套高效的 Python 接口和专用的向量存储文件格式,旨在帮助开发者快速加载、查询和使用词向量等嵌入数据。
在自然语言处理等任务中,传统工具(如 Gensim)在处理大规模预训练模型时,往往面临加载速度慢、内存占用高或查询效率低的问题。Magnitude 通过优化的底层存储结构和算法,显著提升了向量检索速度,并支持流式加载超大模型,有效解决了这些性能瓶颈。此外,它还具备独特的“未登录词”处理能力,即使遇到拼写错误或训练集中不存在的词汇,也能智能生成近似向量,增强了模型的鲁棒性。
这款工具非常适合人工智能研究员、数据科学家以及后端工程师使用。无论是需要快速验证想法的学术研究者,还是致力于构建高并发生产系统的开发人员,都能从中受益。Magnitude 不仅兼容 Keras、PyTorch 等主流深度学习框架,还支持通过 HTTP 远程流式传输模型,让资源受限的环境也能轻松调用巨型嵌入模型。如果你正在寻找一个比传统方案更轻量、更快速的向量管理方案,Magnitude 值得尝试。
使用场景
某电商公司的 NLP 团队正在构建一个实时商品评论情感分析系统,需要快速加载包含数百万词汇的预训练词向量模型以支持高并发查询。
没有 magnitude 时
- 启动缓慢:加载巨大的 Word2Vec 或 GloVe 文本文件需耗时数分钟,导致服务重启或扩容时等待时间过长。
- 内存爆炸:传统库(如 Gensim)往往需要将整个向量矩阵载入内存,极易触发 OOM(内存溢出)错误,迫使团队升级昂贵的高配服务器。
- 查词僵化:遇到用户评论中的拼写错误或未登录词(OOV)时,系统直接返回空值,导致情感判断准确率大幅下降。
- 并发瓶颈:在高并发请求下,简单的键值查询响应延迟高,难以满足实时性要求。
使用 magnitude 后
- 秒级启动:利用 magnitude 专有的二进制文件格式,百万级向量模型可实现毫秒级加载,服务部署效率提升数十倍。
- 内存友好:支持内存映射(Memory Mapping)技术,仅按需读取数据,大幅降低内存占用,使模型能在普通配置服务器上流畅运行。
- 智能容错:内置模糊匹配算法,能自动处理拼写错误和未登录词,通过近似向量推算出合理结果,显著提升了鲁棒性。
- 高速查询:针对查询操作进行了底层优化,即使在多线程高并发场景下,也能保持极低的延迟,确保实时分析流畅无阻。
magnitude 通过高效的存储格式和智能查询机制,将沉重的向量加载与检索任务变得轻量、快速且健壮,是生产级 NLP 应用的理想加速器。
运行环境要求
- Linux
- macOS
- Windows
未说明
最低需求极低(测试显示仅 18KB - 342KB),支持内存映射处理超出物理内存的大型模型

快速开始

由 Plasticity 开发的多功能 Python 软件包及向量存储文件格式,旨在以快速、高效且简便的方式在机器学习模型中使用向量嵌入。它主要作为 Gensim 的更简单、更快替代方案而设计,但也可用作自然语言处理以外领域的通用键-向量存储。该库提供诸如 未登录词查询 和 通过 HTTP 流式传输大型模型 等独特功能。相关研究成果已发表于 EMNLP 2018,并可在 arXiv 上查阅。
目录
- 安装
- 动机
- 基准测试与特性
- 热门嵌入模型的预转换 Magnitude 格式
- 使用该库
- 并发与并行处理
- 文件格式与转换器
- 远程加载
- 通过 HTTP 远程流式传输
- 其他文档
- 其他语言
- 其他编程语言
- 其他领域
- 贡献
- 路线图
- 其他值得关注的项目
- 引用本仓库
- 许可与署名
安装
您可以通过 pip 安装本软件包:
pip install pymagnitude # Python 2.7
pip3 install pymagnitude # Python 3
由于依赖冲突,Google Colaboratory 在安装 Magnitude 时可能会遇到一些问题。您可以在 Google Colab 中使用以下代码片段来安装 Magnitude:
# 在 Google Colab 上安装 Magnitude
! echo "正在安装 Magnitude.... (请稍候,可能需要一段时间)"
! (curl https://raw.githubusercontent.com/plasticityai/magnitude/master/install-colab.sh | /bin/bash 1>/dev/null 2>/dev/null)
! echo "Magnitude 安装完成。"
动机
向量空间嵌入模型在机器学习中日益普及,传统上主要用于自然语言处理任务。然而,目前仍缺乏一种快速轻量级的工具来高效地使用这些庞大的向量空间嵌入模型。
Magnitude 向量嵌入文件格式(.magnitude)旨在成为一种更高效的通用向量嵌入格式,支持延迟加载以加快开发环境中的冷启动速度,采用 LRU 内存缓存机制以提升生产环境下的性能,支持多键查询、直接为神经网络输入添加特征、高效进行相似度计算,并具备处理未登录词或拼写错误等边缘情况以及合并多个向量模型等功能。此外,该格式还适用于无法完全加载到内存中的大型向量模型。
Magnitude 使用 SQLite,一种快速且流行的嵌入式数据库,作为其底层数据存储。它利用索引实现快速键值查找,并通过内存映射、SIMD 指令和空间索引技术,在磁盘外的向量空间中实现高效的相似度搜索,同时保持良好的内存性能,即使在多个进程之间也能维持高效运行。更重要的是,内存映射会在不同运行之间被缓存,因此即使关闭进程后,性能优势仍然得以保留。
基准测试与特性
| 指标 | 轻量级 | 中量级 | 重量级 | 流式传输 |
|---|---|---|---|---|
| 首次加载时间 | 0.7210秒 | ━ 1 | ━ 1 | 7.7550秒 |
| 冷启动单键查询 | 0.0001秒 | ━ 1 | ━ 1 | 1.6437秒 |
| 温启动单键查询 (与冷启动查询相同的键) |
0.00004秒 | ━ 1 | ━ 1 | 0.0004秒 |
| 冷启动多键查询 (n=25) |
0.0442秒 | ━ 1 | ━ 1 | 1.7753秒 |
| 温启动多键查询 (n=25, 键与冷启动查询相同) |
0.00004秒 | ━ 1 | ━ 1 | 0.0001秒 |
第一次 most_similar 搜索查询 (n=10, 最坏情况) |
247.05秒 | ━ 1 | ━ 1 | - |
第一次 most_similar 搜索查询 (n=10, 平均情况, 使用磁盘持久化缓存) |
1.8217秒 | ━ 1 | ━ 1 | - |
后续 most_similar 搜索 (n=10, 键与第一次查询不同) |
0.2434秒 | ━ 1 | ━ 1 | - |
温启动后续 most_similar 搜索 (n=10, 键与第一次查询相同) |
0.00004秒 | 0.00004秒 | 0.00004秒 | - |
第一次 most_similar_approx 搜索查询 (n=10, effort=1.0, 最坏情况) |
不适用 | 不适用 | 29.610秒 | - |
第一次 most_similar_approx 搜索查询 (n=10, effort=1.0, 平均情况, 使用磁盘持久化缓存) |
不适用 | 不适用 | 0.9155秒 | - |
后续 most_similar_approx 搜索 (n=10, effort=1.0, 键与第一次查询不同) |
不适用 | 不适用 | 0.1873秒 | - |
后续 most_similar_approx 搜索 (n=10, effort=0.1, 键与第一次查询不同) |
不适用 | 不适用 | 0.0199秒 | - |
温启动后续 most_similar_approx 搜索 (n=10, effort=1.0, 键与第一次查询相同) |
不适用 | 不适用 | 0.00004秒 | - |
| 文件大小 | 4.21GB | 5.29GB | 10.74GB | 0.00GB |
| 进程内存(RAM)占用 | 18KB | ━ 1 | ━ 1 | 1.71MB |
| 执行100次键查询后的进程内存(RAM)占用 | 168KB | ━ 1 | ━ 1 | 1.91MB |
| 执行100次键查询及相似度搜索后的进程内存(RAM)占用 | 342KB2 | ━ 1 | ━ 1 | |
| 完整性检查和测试 | ✅ | ✅ | ✅ | ✅ |
支持 word2vec(.txt、.bin)、GloVe(.txt)、fastText(.vec)和 ELMo(.hdf5)之间的通用格式,并配备转换工具 |
✅ | ✅ | ✅ | ✅ |
| 简洁的 Python 式接口 | ✅ | ✅ | ✅ | ✅ |
| 依赖项较少 | ✅ | ✅ | ✅ | ✅ |
| 支持超出内存容量的模型 | ✅ | ✅ | ✅ | ✅ |
| 尽可能采用懒加载以提升速度和性能 | ✅ | ✅ | ✅ | ✅ |
针对 threading 和 multiprocessing 进行优化 |
✅ | ✅ | ✅ | ✅ |
| 支持批量和多键查找,包括填充、截断、占位符和特征化功能 | ✅ | ✅ | ✅ | ✅ |
| 可将多个向量模型拼接在一起 | ✅ | ✅ | ✅ | ✅ |
| 基本的未登录词键查找 (字符 n-gram 特征哈希) |
✅ | ✅ | ✅ | ✅ |
| 高级的未登录词键查找,支持拼写错误 (字符 n-gram 特征哈希映射到相似的已登录词键) |
❌ | ✅ | ✅ | ✅ |
| 使用 annoy 索引进行近似最相似搜索 | ❌ | ❌ | ✅ | ✅ |
| 内置新模型训练功能 | ❌ | ❌ | ❌ | ❌ |
1: 与前一列相同
2: 使用 mmap 从磁盘读取,因此在内存可用时操作系统仍会分配内存页,但这些内存页可以在进程间共享,并且对于超大文件来说无需在每个进程中单独管理,从而带来性能优势
*: 所有基准测试均在 Google News 预训练词向量 (GoogleNews-vectors-negative300.bin) 上进行,使用的设备为 MacBook Pro (Retina, 15 英寸,2014 年中旬款),配备 2.2GHz 四核 Intel Core i7 处理器和 16GB RAM,存储介质为 SSD,在可行的情况下取多次试验的平均值。
流行嵌入模型的预转换 Magnitude 格式
流行的嵌入模型已被预先转换为 .magnitude 格式,可供立即下载和使用:
| 贡献者 | 数据 | 轻量级 (对未登录词的基本支持) |
中量级 (推荐) (对未登录词的高级支持) |
重量级 (对未登录词的高级支持以及更快的 most_similar_approx) |
|---|---|---|---|---|
| Google - word2vec | Google News 100B | 300D | 300D | 300D |
| Stanford - GloVe | Wikipedia 2014 + Gigaword 5 6B | 50D, 100D, 200D, 300D | 50D, 100D, 200D, 300D | 50D, 100D, 200D, 300D |
| Stanford - GloVe | Wikipedia 2014 + Gigaword 5 6B (经Plasticity词形还原) |
50D, 100D, 200D, 300D | 50D, 100D, 200D, 300D | 50D, 100D, 200D, 300D |
| Stanford - GloVe | Common Crawl 840B | 300D | 300D | 300D |
| Stanford - GloVe | Twitter 27B | 25D, 50D, 100D, 200D | 25D, 50D, 100D, 200D | 25D, 50D, [100D](http://magnitude.plasticity.ai/glove/heavy/glove.twitter.27B.100d.dema… |
以下是将任何 .bin、.txt、.vec 或 .hdf5 文件转换为 .magnitude 文件的说明 如下。
使用该库
构建 Magnitude 对象
您可以按以下方式创建一个 Magnitude 对象:
from pymagnitude import *
vectors = Magnitude("/path/to/vectors.magnitude")
如果需要,为了方便起见,您也可以直接使用 Magnitude 打开 .bin、.txt、.vec 或 .hdf5 文件。不过,这种方法效率较低,对于大型模型来说速度非常慢,因为它会在首次运行时将文件转换为临时目录中的 .magnitude 文件。临时目录不一定会保留,并且在计算机重启后也不会保留。通常,为了提高速度,您应该先使用 python -m pymagnitude.converter 将 .bin、.txt、.vec 或 .hdf5 文件预先转换为 .magnitude 格式,但此功能对于一次性使用场景仍然很有用。当直接使用 .bin、.txt、.vec 或 .hdf5 文件实例化 Magnitude 对象时,会生成警告信息。您可以通过将构造函数中的 supress_warnings 参数设置为 True 来抑制这些警告。
- 默认情况下,惰性加载已启用。您可以向构造函数传递一个可选的
lazy_loading参数,其值可以是-1(禁用惰性加载并预加载所有向量到内存中,类似于 Gensim)、0(默认值,启用无限制的内存 LRU 缓存的惰性加载),或大于零的整数X(启用惰性加载,并使用一个仅保留最近使用过的X个向量的 LRU 缓存)。 - 如果您希望在初始化时就提前加载
most_similar函数所需的数据,请将eager参数设置为True。 - 请注意,即使将
lazy_loading设置为-1或将eager设置为True,数据仍会在后台线程中预加载到内存中,以避免构造函数因大型模型而阻塞几分钟。如果您确实希望阻塞式行为,可以将blocking参数设置为True。 - 默认情况下,返回的是单位长度归一化向量,除非您正在加载 ELMo 模型。如果您希望接收原始的未归一化向量,请将可选参数
normalized设置为False。 - 默认情况下,查询结果以 NumPy 数组形式返回。如果您希望接收 Python 列表而不是 NumPy 数组,可以将可选参数
use_numpy设置为False。 - 默认情况下,键的查询区分大小写。如果您希望进行不区分大小写的搜索,请将可选参数
case_insensitive设置为True。 - 您可以选择包含
pad_to_length参数,该参数用于指定在传入多个示例时,所有示例应被填充到的长度。超过填充长度的示例将会被截断。 - 如果指定了
pad_to_length,并且某个示例的长度超过了该值,您可以将truncate_left参数设置为True,以截断每个示例中键列表的开头部分,而不是结尾部分。 - 您可以选择将
pad_left参数设置为True,使填充出现在列表的开头而不是默认的结尾。 - 您可以选择传递
placeholders参数,该参数会将每个向量的维度增加placeholders的数量,并用零填充这些额外的维度。如果您计划向向量中添加其他值和信息,并希望预先为这些内容分配空间以提高效率,此选项将非常有用。 - 您可以选择传递
language参数,并提供一个 ISO 639-1 语言代码。如果您将 Magnitude 用于词向量,则此参数可确保库尊重该语言的词干提取和其他特定于语言的功能。默认值为en,表示英语。如果您不将 Magnitude 用于词向量,也可以将此参数设置为None。 - 您可以选择传递
dtype参数,以控制 Magnitude 返回的 NumPy 数组的数据类型。 - 您可以选择传递
devices参数,以控制底层模型支持 GPU 使用时的 GPU 设备使用情况。该参数应为一个整数列表,其中每个整数代表 GPU 设备编号(0、1等)。 - 您可以选择传递
temp_dir参数,以控制 Magnitude 将使用的临时目录的位置。 - 您可以选择传递
log参数,使 Magnitude 在执行耗时操作时将进度记录到标准错误流中。
查询
你可以这样查询文件中向量的总数:
len(vectors)
你可以这样查询向量的维度:
vectors.dim
你可以这样检查某个键是否在词汇表中:
"cat" in vectors
你可以这样遍历所有的键和向量:
for key, vector in vectors:
...
你可以这样查询某个键对应的向量:
vectors.query("cat")
你可以通过索引获取第 n 个键和向量:
vectors[42]
你可以这样查询多个键的向量:
vectors.query(["I", "read", "a", "book"])
将返回一个二维数组(键对应向量)。
你可以这样查询多个例句的向量:
vectors.query([["I", "read", "a", "book"], ["I", "read", "a", "magazine"]])
将返回一个三维数组(例句 × 键 × 向量)。如果未指定 pad_to_length,且每个例句的长度不一致,则会按最长例句的长度进行填充。
你可以通过索引获取多个位置的键和向量:
vectors[:42] # 切片表示法
vectors[42, 1337, 2001] # 元组表示法
你可以这样查询两个或多个键之间的距离:
vectors.distance("cat", "dog")
vectors.distance("cat", ["dog", "tiger"])
你可以这样查询两个或多个键之间的相似度:
vectors.similarity("cat", "dog")
vectors.similarity("cat", ["dog", "tiger"])
你可以这样查询给定键与一组键中最相似的键:
vectors.most_similar_to_given("cat", ["dog", "television", "laptop"]) # dog
你可以这样查询给定键与一组键中不匹配的键:
vectors.doesnt_match(["breakfast", "cereal", "dinner", "lunch"]) # cereal
你可以这样查询最相似的键(近邻):
vectors.most_similar("cat", topn = 100) # 按键最相似
vectors.most_similar(vectors.query("cat"), topn = 100) # 按向量最相似
你还可以选择性地为 most_similar 传递一个 min_similarity 参数,其值范围为 [-1.0, 1.0]。
你也可以通过提供正例和负例来查询最相似的键(这实际上可以解决类比问题):
vectors.most_similar(positive = ["woman", "king"], negative = ["man"]) # queen
类似于 vectors.most_similar,还有一个 vectors.most_similar_cosmul 函数,它使用 Levy and Goldberg 提出的 3CosMul 方法:
vectors.most_similar_cosmul(positive = ["woman", "king"], negative = ["man"]) # queen
你还可以使用近似最近邻索引快速查询最相似的键,虽然速度更快,但不能保证完全准确的结果:
vectors.most_similar_approx("cat")
vectors.most_similar_approx(positive = ["woman", "king"], negative = ["man"])
你还可以选择性地为 most_similar_approx 函数传递一个 effort 参数,其值范围为 [0.0, 1.0],以调整运行时间和准确性。默认值为 1.0,此时耗时最长,但结果最准确。
你可以这样查询所有与某个键的距离比另一个键更近的键:
vectors.closer_than("cat", "rabbit") # ["dog", ...]
你可以访问模型中所有的底层向量,它们存储在一个大小为 (len(vectors) x vectors.emb_dim) 的大型 numpy.memmap 数组中:
vectors.get_vectors_mmap()
你可以清理所有相关资源、打开的文件和数据库连接:
vectors.close()
基本的未登录词处理
对于词向量表示而言,处理未登录词非常重要,这有助于应对训练数据中未出现的新词、拼写错误和打字错误,并总体上提高基于词向量表示模型的鲁棒性。
未登录词的处理方式是为其分配一个随机向量值。然而,这种随机性是确定性的:如果两次遇到 相同 的未登录词,它会被赋予相同的随机向量值,以便能够对这些未登录词进行训练。此外,如果两个未登录词具有相似的字符 n-gram(例如“uberx”和“uberxl”),即使它们都不在词汇表中,也会被放置在彼此附近:
vectors = Magnitude("/path/to/GoogleNews-vectors-negative300.magnitude")
"uberx" in vectors # False
"uberxl" in vectors # False
vectors.query("uberx") # array([ 5.07109939e-02, -7.08248823e-02, -2.74812328e-02, ... ])
vectors.query("uberxl") # array([ 0.04734962, -0.08237578, -0.0333479, -0.00229564, ... ])
vectors.similarity("uberx", "uberxl") # 0.955000000200815
高级的未登录词处理
如果使用支持高级未登录词处理的 Magnitude 文件(Medium 或 Heavy 版本),未登录词还会被嵌入到与其相似的已登录词附近,这些相似性是根据字符串相似度判断的:
vectors = Magnitude("/path/to/GoogleNews-vectors-negative300.magnitude")
"uberx" in vectors # False
"uberification" in vectors # False
"uber" in vectors # True
vectors.similarity("uberx", "uber") # 0.7383483267618451
vectors.similarity("uberification", "uber") # 0.745452837882727
处理拼写错误和打字错误
这也使得 Magnitude 对许多拼写错误具有较强的鲁棒性:
vectors = Magnitude("/path/to/GoogleNews-vectors-negative300.magnitude")
"missispi" in vectors # False
vectors.similarity("missispi", "mississippi") # 0.35961736624824003
"discrimnatory" in vectors # False
vectors.similarity("discrimnatory", "discriminatory") # 0.8309152561753461
"hiiiiiiiiii" in vectors # False
vectors.similarity("hiiiiiiiiii", "hi") # 0.7069775034853861
为了实现未登录词的这一效果,使用了字符 n-gram 技术。该功能的灵感来源于 Facebook AI Research 的论文 Enriching Word Vectors with Subword Information,但与原文不同的是,这里并非在训练时利用字符 n-gram,而是在推理时使用字符 n-gram,从而在一些较旧的模型(如 word2vec 和 GloVe)中部分地复现了这一效果(尽管无法完全复制)。
多模型的拼接
可选地,你可以将多个模型的向量组合起来,以便向机器学习模型提供更丰富的信息,如下所示:
from pymagnitude import *
word2vec = Magnitude("/path/to/GoogleNews-vectors-negative300.magnitude")
glove = Magnitude("/path/to/glove.6B.50d.magnitude")
vectors = Magnitude(word2vec, glove) # 将 word2vec 与 glove 的向量拼接在一起
vectors.query("cat") # 返回一个 350 维的 NumPy 数组(来自 word2vec 的“cat”与来自 glove 的“cat”拼接而成)
vectors.query(("cat", "cats")) # 返回一个 350 维的 NumPy 数组(来自 word2vec 的“cat”与来自 glove 的“cats”拼接而成)
你还可以拼接两个以上的向量模型,只需在构造函数中传入更多参数即可。
额外的特征化(词性等)
你可以使用 FeaturizerMagnitude 类,自动从你可能拥有的额外特征中创建向量,例如词性、句法依存关系或其他任何信息:
from pymagnitude import *
pos_vectors = FeaturizerMagnitude(100, namespace = "PartsOfSpeech")
pos_vectors.dim # 4 - 由 Magnitude 根据 100 这个值自动确定的维度数
pos_vectors.query("NN") # - array([ 0.08040417, -0.71705252, 0.61228951, 0.32322192])
pos_vectors.query("JJ") # - array([-0.11681135, 0.10259253, 0.8841201 , -0.44063763])
pos_vectors.query("NN") # - array([ 0.08040417, -0.71705252, 0.61228951, 0.32322192])(由于采用确定性哈希,对于相同的键每次都会返回相同的值)
dependency_vectors = FeaturizerMagnitude(100, namespace = "SyntaxDependencies")
dependency_vectors.dim # 4 - 由 Magnitude 根据 100 这个值自动确定的维度数
dependency_vectors.query("nsubj") # - array([-0.81043793, 0.55401352, -0.10838071, 0.15656626])
dependency_vectors.query("prep") # - array([-0.30862918, -0.44487267, -0.0054573 , -0.84071788])
Magnitude 内部会使用 特征哈希技巧,直接利用特征值的哈希来为该特征值创建唯一的向量。
FeaturizerMagnitude 的第一个参数应为该特征可能取值数量的近似上限。由于 词性标签和 句法依存关系的数量均少于 100 种,因此我们在上述示例中都选择了 100。所选值将决定 Magnitude 自动为特定的 FeaturizerMagnitude 对象分配多少维度,以降低哈希冲突的概率。namespace 参数可以是任何描述你所添加特征的字符串,它是可选的,但强烈建议使用。
随后,你可以将这些特征与标准的 Magnitude 对象拼接在一起,以供使用:
from pymagnitude import *
word2vec = Magnitude("/path/to/GoogleNews-vectors-negative300.magnitude")
pos_vectors = FeaturizerMagnitude(100, namespace = "PartsOfSpeech")
dependency_vectors = FeaturizerMagnitude(100, namespace = "SyntaxDependencies")
vectors = Magnitude(word2vec, pos_vectors, dependency_vectors) # 将 word2vec 与词性和依存关系的向量拼接在一起
vectors.query([
("I", "PRP", "nsubj"),
("saw", "VBD", "ROOT"),
("a", "DT", "det"),
("cat", "NN", "dobj"),
(".", ".", "punct")
]) # 一个大小为 5 x (300 + 4 + 4),即 5 x 308 的数组
# 或者为以下句子中的每一个“buffalo”获取唯一的向量:
# “Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo”
# (https://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo)
vectors.query([
("Buffalo", "JJ", "amod"),
("buffalo", "NNS", "nsubj"),
("Buffalo", "JJ", "amod"),
("buffalo", "NNS", "nsubj"),
("buffalo", "VBP", "rcmod"),
("buffalo", "VB", "ROOT"),
("Buffalo", "JJ", "amod"),
("buffalo", "NNS", "dobj")
]) # 一个大小为 8 x (300 + 4 + 4),即 8 x 308 的数组
有了这样的输出,机器学习模型现在不仅可以访问词向量信息,还可以获得词性和句法依存关系等额外信息。在这种情况下,这些额外的信息可以为神经网络提供更强的语义信号,并减少对训练数据的需求。
在机器学习库中使用 Magnitude
Magnitude 通过处理大量预处理代码,将文本数据集(或键)转换为向量,从而使得构建和迭代需要使用向量表示的模型变得非常容易。此外,它还能使这些模型对 未登录词 和 拼写错误 具有更强的鲁棒性。
下面是一些流行的机器学习库中,使用 Magnitude 构建针对 ATIS(航空公司旅行信息系统)数据集(训练集/测试集)的意图分类模型的示例代码。该数据集常用于聊天机器人或对话式界面。
Keras
你可以在这个 Google Colaboratory Python 笔记本中找到使用 Magnitude 与 Keras(支持 TensorFlow、Theano、CNTK)的指南。
PyTorch
PyTorch 指南即将推出。
TFLearn
TFlearn 指南即将推出。
工具类
您可以使用 MagnitudeUtils 类,以便便捷地访问在构建机器学习模型时可能用到的函数。
您可以按如下方式导入 MagnitudeUtils:
from pymagnitude import MagnitudeUtils
您也可以从远程源下载 Magnitude 模型,如下所示:
vecs = Magnitude(MagnitudeUtils.download_model('word2vec/heavy/GoogleNews-vectors-negative300'))
默认情况下,download_model 会从 http://magnitude.plasticity.ai 下载文件,并将其保存到自动创建的 ~/.magnitude 文件夹中。如果文件已下载,则不会再次下载。您可以通过可选的 download_dir 参数更改本地下载文件夹的路径。此外,还可以通过可选的 remote_path 参数更改模型的下载域名。
您还可以使用 batchify 创建 X 和 y 数据的批次生成器,如下所示:
X = [.3, .2, .7, .8, .1]
y = [0, 0, 1, 1, 0]
batch_gen = MagnitudeUtils.batchify(X, y, 2)
for X_batch, y_batch in batch_gen:
print(X_batch, y_batch)
# 输出:
# 第1轮:X_batch = [.3, .2], y_batch = [0, 0]
# 第2轮:X_batch = [.7, .8], y_batch = [1, 1]
# 第3轮:X_batch = [.1], y_batch = [0]
# 后续轮次:无限循环...
您还可以使用 class_encoding 将类别标签编码为整数并解码回标签,如下所示:
add_class, class_to_int, int_to_class = MagnitudeUtils.class_encoding()
add_class("cat") # 返回:0
add_class("dog") # 返回:1
add_class("cat") # 返回:0
class_to_int("dog") # 返回:1
class_to_int("cat") # 返回:0
int_to_class(1) # 返回:“dog”
int_to_class(0) # 返回:“cat”
您还可以使用 to_categorical 将带有类别整数的分类数据转换为独热编码的 NumPy 数组,如下所示:
y = [1, 5, 2]
MagnitudeUtils.to_categorical(y, num_classes=6) # num_classes 为可选参数
# 输出:
# array([[0., 1., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0., 1.],
# [0., 0., 1., 0., 0., 0.]])
您还可以使用 from_categorical 将独热编码的 NumPy 数组转换回包含类别整数的 1D NumPy 数组,如下所示:
y_c = [[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1.]]
MagnitudeUtils.from_categorical(y_c)
# 输出:
# array([1., 5.])
并发与并行性
该库是线程安全的(每个线程使用不同的底层存储连接),并且是只读的,永远不会向文件写入数据。由于内存占用较低,您也可以在多个进程(或使用 multiprocessing)中运行它,每个进程拥有独立的地址空间,而无需像其他库那样在内存中复制数据,也无需创建多进程共享变量,因为数据是从磁盘读取的,且每个进程维护自己的 LRU 内存缓存。对于较重的操作,例如 most_similar,会创建一个共享内存映射文件,以实现进程间内存共享。
文件格式与转换工具
Magnitude 包采用 .magnitude 文件格式,而不是其他向量模型(如 word2vec、GloVe、fastText 和 ELMo)所使用的 .bin、.txt、.vec 或 .hdf5 格式。该软件包附带了一个命令行工具,用于将 word2vec、GloVe、fastText 和 ELMo 文件转换为 Magnitude 文件。
您可以按如下方式进行转换:
python -m pymagnitude.converter -i <待转换文件路径> -o <Magnitude 文件输出路径>
输入文件的格式将根据其扩展名或内容自动确定。通常只需对某个模型执行一次转换即可。转换完成后,Magnitude 文件格式保持静态,不会被修改或写入,从而确保并发读取的安全性。
pymagnitude.converter 的可用标志如下:
- 使用
-h标志可获取帮助并列出所有标志。 - 使用
-p <精度>标志可以指定保留的小数位数(选择较小的数值会生成更小的文件)。实际底层值以整数形式存储,而非浮点数,因此这本质上是一种量化技术,用于减小模型的体积。 - 使用
-a标志可以为文件添加近似最近邻索引(会增加文件大小),从而启用most_similar_approx函数。配合-a标志使用时,还可以通过-t <树的数量>控制近似最近邻索引中的树数量(树越多,精度越高)。若未指定树的数量,则会自动确定。 - 使用
-s标志可以禁用向文件中添加子词信息(从而减小文件大小),但同时也会禁用对词汇表外关键词的高级支持。 - 如果要转换的模型没有词汇表(如 ELMo),可以在提供路径的同时使用
-v标志,并指定一个您希望从中继承词汇表的 Magnitude 文件。
此外,您还可以批量转换文件,只需分别指定输入文件夹和输出文件夹,而无需逐个指定输入和输出文件。输入文件夹中的所有 .txt、.bin、.vec 和 .hdf5 文件都将被转换为输出文件夹中的 .magnitude 文件。在执行批量转换之前,输出文件夹必须已经存在。
远程加载
您可以指示 Magnitude 从其远程仓库下载并打开模型,而无需指定本地文件路径。首次运行时,文件会自动下载到 ~/.magnitude/ 目录下;后续运行时,如果本地已存在该文件,则会跳过下载步骤。
vecs = Magnitude('http://magnitude.plasticity.ai/word2vec/heavy/GoogleNews-vectors-negative300.magnitude') # 完整 URL
vecs = Magnitude('word2vec/heavy/GoogleNews-vectors-negative300') # 或者使用 URL 的简写形式
如需更精细地控制远程下载域名和本地下载目录,请参阅如何使用 MagnitudeUtils.download_model。
通过 HTTP 远程流式传输
Magnitude 模型通常是大型文件(多个 GB),会占用大量磁盘空间,尽管 .magnitude 格式使得向量的利用非常快速。Magnitude 提供了一个选项,可以通过 HTTP 流式传输这些大文件。
这与远程加载功能有明显区别,因为模型甚至完全不需要下载。您可以立即开始查询模型,而无需占用任何磁盘空间。
vecs = Magnitude('http://magnitude.plasticity.ai/word2vec/heavy/GoogleNews-vectors-negative300.magnitude', stream=True) # 完整 URL
vecs = Magnitude('word2vec/heavy/GoogleNews-vectors-negative300', stream=True) # 或者使用 URL 的简写形式
vecs.query("king") # 返回结果:即使没有下载本地模型文件,也能快速返回“king”的向量
您可以在 Google Colaboratory Python 笔记本 中体验此演示。
如果您的计算环境资源有限(内存和磁盘空间不足),或者您希望在不下载和设置大型模型文件的情况下快速尝试向量,又或者您正在训练一个小模型,那么此功能将非常有用。
虽然由于数据是流式传输的,会增加一些网络延迟,但 Magnitude 仍会使用由 lazy_loading 构造函数参数指定的内存缓存。由于语言通常遵循 齐夫定律,在缓存被少量查询预热后,网络延迟通常不会成为问题。
它们将直接从静态 HTTP Web 服务器上通过 HTTP Range Request 头进行查询。所有 Magnitude 方法都支持流式传输,然而,most_similar 和 most_similar_approx
可能会较慢,因为它们目前尚未针对流式传输进行优化 [#路线图]。您可以在【基准测试与功能】中查看当前流式模式的性能表现,不过随着我们未来对其进行优化[#路线图],其速度将会更快!
其他文档
目前暂无其他文档。如果您需要了解某个方法的参数详情或查看所有支持的功能,可以直接查阅源代码文件(注释较为详尽)。
其他语言
目前,本页面仅提供预先转换为 .magnitude 格式的英语词向量模型。不过,您仍然可以使用 Magnitude 来处理其他语言的词向量。Facebook 已经训练了多种语言的 fastText 向量。您可以下载所需语言的 .vec 文件,然后使用【文件格式与转换器】中的工具将其转换为 .magnitude 格式。
其他编程语言
目前,读取 Magnitude 文件仅支持 Python,因为 Python 已成为机器学习领域的事实标准语言。对于大多数应用场景来说,这已经足够。将文件格式扩展到其他语言并不困难,因为 SQLite 有原生的 C 实现,并且在大多数语言中都有绑定。此外,该文件格式以及读取和搜索协议本身也非常简单,只需阅读本仓库的源代码即可理解。
其他领域
目前,自然语言处理是使用预训练向量嵌入模型进行词向量表示的最热门领域。不过,也有一些其他领域,例如计算机视觉,开始使用类似 Deep1B 的预训练向量嵌入模型来表示图像。本库旨在保持对各个领域的中立性,提供一个适用于所有领域的通用键值存储和接口。
贡献
该项目的主要仓库位于 GitLab 上。GitHub 仓库仅为镜像。欢迎在 GitLab 上提交更多测试、改进错误检查、修复 bug、提升性能、完善文档,或添加额外工具/功能的拉取请求。
您可以通过 opensource@plasticity.ai 与我们联系。
路线图
- 对远程流式传输进行速度优化,并公开流式缓存配置选项
- 使
most_similar_approx也针对流式传输进行优化 - 除了“轻量”、“中量”和“重量”三种规格外,新增“超重量”规格,文件体积更大,但可消除最初
most_similar查询较慢的限制。 - 添加对 Google BERT 的支持
- 支持 fastText
.bin格式
其他知名项目
- spotify/annoy - 使用随机投影树和分层二均值算法,为 Magnitude 中的
most_similar_approx提供近似最近邻算法的支持。感谢作者 Erik Bernhardsson 在 Magnitude 与 Annoy 集成细节方面提供的帮助。
引用本仓库
如果您想引用我们在 EMNLP 2018 上发表的论文,请使用以下 BibTeX 引用:
@inproceedings{patel2018magnitude,
title={Magnitude: 一种快速高效的通用向量嵌入工具包},
author={Patel, Ajay and Sands, Alexander and Callison-Burch, Chris and Apidianaki, Marianna},
booktitle={2018 年自然语言处理经验方法会议系统演示文集},
pages={120--126},
year={2018}
}
或者访问 Google Scholar 链接 查看其他引用方式。
点击徽章将跳转至页面,帮助您生成正确的 BibTeX 引用、JSON-LD 引用以及其他引用格式。
许可证与署名
本仓库采用 此处 所列许可证授权。
图标“Seismic”由 JohnnyZi 来自 The Noun Project 创作。
版本历史
0.1.1432020/05/250.1.1422020/05/250.1.1402020/05/250.1.1392020/05/250.1.1382020/05/250.1.1372020/05/250.1.1362020/05/250.1.1352020/05/250.1.1322020/05/250.1.1312020/05/250.1.1302020/05/250.1.1292020/05/250.1.1282020/05/250.1.1272020/05/240.1.1262020/05/240.1.1252020/05/240.1.1242020/05/240.1.1232020/05/240.1.1222020/05/240.1.1212020/05/24常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器