sense2vec

GitHub
1.7k 238 简单 1 次阅读 1周前MIT开发框架语言模型
AI 解读 由 AI 自动生成,仅供参考

sense2vec 是 word2vec 的进阶版本,由 Explosion AI 开发,旨在生成更具语境感知能力的词向量。传统的词嵌入模型往往无法区分多义词在不同场景下的含义,而 sense2vec 巧妙地将词的词性(如名词、动词)和实体标签融入向量表示中。例如,它能精准区分作为“银行”的金融机构和作为“河岸”的地理概念,从而让计算机更准确地理解词语在特定上下文中的语义。

这一特性有效解决了自然语言处理中常见的歧义问题,显著提升了短语相似度计算、语义搜索及实体关联分析的准确性。sense2vec 特别适合 NLP 开发者、数据科学家及人工智能研究人员使用。它不仅能作为独立库加载和查询预训练模型,还能无缝集成到流行的 spaCy 管道中,通过扩展属性直接获取文本片段的向量和相似词推荐。

其技术亮点在于支持基于词性和实体标签的多词短语查询,并允许用户利用原始文本结合 fastText 或 GloVe 训练自定义向量。此外,它还提供了与 Prodigy 标注工具配合的食谱,方便用户快速构建规则或引导命名实体识别任务。无论是想要探索海量评论数据的语义结构,还是希望为垂直领域模型注入更细腻的语义理解能力,sense2vec 都是一个高效且灵活的选择。

使用场景

某电商公司的数据团队正在构建一个智能客服系统,需要从海量用户评论中自动识别并关联具体的产品功能问题。

没有 sense2vec 时

  • 一词多义导致误判:传统词向量无法区分"苹果"是指水果还是手机品牌,导致将“屏幕碎了”错误关联到水果类目。
  • 短语语义丢失:模型只能处理单个词汇,无法理解“电池续航”或“快充技术”等多词短语的整体含义,检索结果支离破碎。
  • 上下文感知缺失:无法根据词性(如名词 vs 动词)调整语义表示,难以精准匹配用户描述的具体故障场景。
  • 冷启动效率低:面对新出现的产品术语(如“潜望式镜头”),需要大量标注数据重新训练模型才能识别相似概念。

使用 sense2vec 后

  • 精准消歧:sense2vec 通过“词 + 词性/实体标签”(如 apple|ORG)的键值结构,完美区分不同语境下的同一词汇,确保故障归类准确。
  • 原生支持短语:直接为“电池续航 |NOUN"等多词短语生成独立向量,能一次性召回“耗电快”、“充电慢”等语义高度相关的用户反馈。
  • 上下文动态感知:利用 spaCy 管道组件自动解析句子结构,让向量表示随上下文动态变化,显著提升了对复杂投诉句子的理解力。
  • 快速迁移学习:基于预训练的 Reddit 大规模语料库,无需从零训练即可识别新兴科技词汇,大幅缩短了新产品的模型上线周期。

sense2vec 通过将上下文信息注入词向量,彻底解决了传统 NLP 模型在处理多义词和复合短语时的语义模糊难题。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明

内存

未说明 (预训练向量文件最大约 4GB,加载需相应内存)

依赖
notes该工具主要作为 spaCy v3 的管道组件使用。预训练向量文件较大(最大分卷包约 4GB),需手动下载并解压后通过 from_disk 加载。支持独立使用或集成到 spaCy 流程中。若使用多部分压缩的大型向量文件,需在 Linux/macOS 下使用 cat 命令合并后再解压。
python未说明
spacy>=3.0
numpy
streamlit (可选,用于演示)
sense2vec hero image

快速开始

sense2vec:基于上下文的词向量

sense2vec(Trask 等人, 2015)是对 word2vec 的一种巧妙改进,能够学习到更加丰富和细致的词向量。本库是一个简单的 Python 实现,用于加载、查询和训练 sense2vec 模型。更多详情请参阅 我们的博客文章。若想探索 2015 年和 2019 年所有 Reddit 评论之间的语义相似性,请访问 交互式演示

🦆 版本 2.0(适用于 spaCy v3)现已发布! 请在此处阅读发行说明。

测试 当前发布版本 PyPI 版本 代码风格:black

✨ 功能特性

  • 基于词性标注和实体标签,查询多词短语的向量
  • spaCy 管道组件扩展属性
  • 完全可序列化,因此您可以轻松地将 sense2vec 向量与您的 spaCy 模型包一起分发。
  • 可选的最近邻缓存,以实现超快速的“最相似”查询。
  • 使用预训练的 spaCy 模型、原始文本以及通过 fastText 提供的 GloVe 或 Word2Vec, 训练您自己的向量详情)。
  • Prodigy 注释配方,用于评估模型、创建相似的多词短语列表,并将其转换为匹配模式,例如用于基于规则的 NER 或启动 NER 注释工作(详情及示例)。

🚀 快速入门

独立使用

from sense2vec import Sense2Vec

s2v = Sense2Vec().from_disk("/path/to/s2v_reddit_2015_md")
query = "natural_language_processing|NOUN"
assert query in s2v
vector = s2v[query]
freq = s2v.get_freq(query)
most_similar = s2v.most_similar(query, n=3)
# [('machine_learning|NOUN', 0.8986967),
#  ('computer_vision|NOUN', 0.8636297),
#  ('deep_learning|NOUN', 0.8573361)]

作为 spaCy 管道组件使用

⚠️ 请注意,此示例描述的是与 spaCy v3 的用法。若要与 spaCy v2 配合使用,请下载 sense2vec==1.0.3 并查看此仓库的 v1.x 分支。

import spacy

nlp = spacy.load("en_core_web_sm")
s2v = nlp.add_pipe("sense2vec")
s2v.from_disk("/path/to/s2v_reddit_2015_md")

doc = nlp("A sentence about natural language processing.")
assert doc[3:6].text == "natural language processing"
freq = doc[3:6]._.s2v_freq
vector = doc[3:6]._.s2v_vec
most_similar = doc[3:6]._.s2v_most_similar(3)
# [(('machine learning', 'NOUN'), 0.8986967),
#  (('computer vision', 'NOUN'), 0.8636297),
#  (('deep learning', 'NOUN'), 0.8573361)]

交互式演示

要试用我们在 Reddit 评论上训练的预训练向量,请访问 交互式 sense2vec 演示

该仓库还包含一个 Streamlit 演示脚本,用于探索向量和最相似的短语。安装 streamlit 后,您可以通过运行 streamlit run 命令,并在命令行中提供 一个或多个预训练向量的路径作为位置参数来运行该脚本。例如:

pip install streamlit
streamlit run https://raw.githubusercontent.com/explosion/sense2vec/master/scripts/streamlit_sense2vec.py /path/to/vectors

预训练向量

要使用这些向量,您需要下载归档文件,并将解压后的目录传递给 Sense2Vec.from_diskSense2VecComponent.from_disk。向量文件已附加到 GitHub 发布页面。较大的文件已被拆分为多部分下载。

向量 大小 描述 📥 下载(压缩包)
s2v_reddit_2019_lg 4 GB Reddit 评论 2019(01–07) 第1部分, 第2部分, 第3部分
s2v_reddit_2015_md 573 MB Reddit 评论 2015 第1部分

要合并多部分归档文件,您可以运行以下命令:

cat s2v_reddit_2019_lg.tar.gz.* > s2v_reddit_2019_lg.tar.gz

⏳ 安装与设置

sense2vec 的发布版本可在 PyPI 上获取:

pip install sense2vec

要使用预训练向量,您需要下载 其中一个向量包,解压 .tar.gz 归档文件,并将 from_disk 指向解压后的数据目录:

from sense2vec import Sense2Vec
s2v = Sense2Vec().from_disk("/path/to/s2v_reddit_2015_md")

👩‍💻 使用方法

与 spaCy v3 的使用

使用该库和向量的最简单方法是将其集成到你的 spaCy 管道中。sense2vec 包公开了一个 Sense2VecComponent,它可以使用共享词汇表进行初始化,并作为自定义管道组件添加到你的 spaCy 管道中。默认情况下,组件会被添加到管道的_末尾_,这也是推荐的位置,因为该组件需要访问依存句法分析结果,以及命名实体(如果有的话)。

import spacy
from sense2vec import Sense2VecComponent

nlp = spacy.load("en_core_web_sm")
s2v = nlp.add_pipe("sense2vec")
s2v.from_disk("/path/to/s2v_reddit_2015_md")

该组件会为 spaCy 的 TokenSpan 对象添加若干 扩展属性和方法,使你可以检索向量和频率,以及找到最相似的术语。

doc = nlp("A sentence about natural language processing.")
assert doc[3:6].text == "natural language processing"
freq = doc[3:6]._.s2v_freq
vector = doc[3:6]._.s2v_vec
most_similar = doc[3:6]._.s2v_most_similar(3)

对于实体,实体标签会被用作“语义”(而不是词性的标签):

doc = nlp("A sentence about Facebook and Google.")
for ent in doc.ents:
    assert ent._.in_s2v
    most_similar = ent._.s2v_most_similar(3)

可用属性

以下扩展属性通过 ._ 属性在 Doc 对象上暴露:

名称 属性类型 类型 描述
s2v_phrases 属性 列表 给定 Doc 中所有与 sense2vec 兼容的短语(名词短语、命名实体)。

以下属性可通过 TokenSpan 对象的 ._ 属性访问——例如 token._.in_s2v

名称 属性类型 返回类型 描述
in_s2v 属性 布尔值 键是否存在于向量映射中。
s2v_key 属性 Unicode 给定对象的 sense2vec 键,例如 "duck NOUN"
s2v_vec 属性 ndarray[float32] 给定键的向量。
s2v_freq 属性 整数 给定键的频率。
s2v_other_senses 属性 列表 可用的其他语义,例如对于 "duck|NOUN""duck|VERB"
s2v_most_similar 方法 列表 获取最相似的 n 个术语。返回一个 ((word, sense), score) 元组列表。
s2v_similarity 方法 浮点数 计算与另一个 TokenSpan 的相似度。

⚠️ 关于 span 属性的说明: 在底层,doc.ents 中的实体实际上是 Span 对象。这就是为什么管道组件也会为 spans 而不是仅 tokens 添加属性和方法的原因。然而,不建议对文档的任意切片使用 sense2vec 属性,因为模型很可能没有对应文本的键。此外,Span 对象也没有词性标签,因此如果没有实体标签,则“语义”会默认为根节点的词性标签。

将 sense2vec 添加到训练好的管道

如果你正在训练并打包一个 spaCy 管道,并希望在其中包含 sense2vec 组件,可以通过训练配置中的 [initialize]加载数据:

[initialize.components]

[initialize.components.sense2vec]
data_path = "/path/to/s2v_reddit_2015_md"

独立使用

你也可以直接使用底层的 Sense2Vec 类,并使用 from_disk 方法加载向量。可用的 API 方法见下文。

from sense2vec import Sense2Vec
s2v = Sense2Vec().from_disk("/path/to/reddit_vectors-1.1.0")
most_similar = s2v.most_similar("natural_language_processing|NOUN", n=10)

⚠️ 重要提示: 要在向量表中查找条目,键必须遵循 phrase_text|SENSE 的格式(注意使用 _ 而不是空格,以及在标签或类别前使用 |),例如 machine_learning|NOUN。另外请注意,底层向量表是区分大小写的。

🎛 API

Sense2Vec

独立的 Sense2Vec 对象,用于存储向量、字符串和频率。

方法 Sense2Vec.__init__

初始化 Sense2Vec 对象。

参数 类型 描述
shape 元组 向量形状。默认值为 (1000, 128)
strings spacy.strings.StringStore 可选的字符串存储。如果不存在,则会自动创建。
senses 列表 可选的全部可用语义列表。用于生成最佳语义或其他语义的方法中。
vectors_name Unicode 可选的向量表名称,用于避免冲突。默认值为 "sense2vec"
overrides 字典 可选的自定义函数,映射到注册表中已注册的名称,例如 {"make_key": "custom_make_key"}
返回值 Sense2Vec 新构造的对象。
s2v = Sense2Vec(shape=(300, 128), senses=["VERB", "NOUN"])

方法 Sense2Vec.__len__

向量表中的行数。

参数 类型 描述
返回值 整数 向量表中的行数。
s2v = Sense2Vec(shape=(300, 128))
assert len(s2v) == 300

方法 Sense2Vec.__contains__

检查键是否存在于向量表中。

参数 类型 描述
key unicode / int 要查找的键。
返回值 bool 键是否在表中。
s2v = Sense2Vec(shape=(10, 4))
s2v.add("avocado|NOUN", numpy.asarray([4, 2, 2, 2], dtype=numpy.float32))
assert "avocado|NOUN" in s2v
assert "avocado|VERB" not in s2v

方法 Sense2Vec.__getitem__

根据给定的键检索向量。如果键不在表中,则返回 None。

参数 类型 描述
key unicode / int 要查找的键。
返回值 numpy.ndarray 向量或 None
vec = s2v["avocado|NOUN"]

方法 Sense2Vec.__setitem__

为给定的键设置向量。如果键不存在,则会引发错误。要添加新条目,请使用 Sense2Vec.add

参数 类型 描述
key unicode / int 键。
vector numpy.ndarray 要设置的向量。
vec = s2v["avocado|NOUN"]
s2v["avacado|NOUN"] = vec

方法 Sense2Vec.add

向表中添加一个新的向量。

参数 类型 描述
key unicode / int 要添加的键。
vector numpy.ndarray 要添加的向量。
freq int 可选的频率计数。用于找到最佳匹配的词义。
vec = s2v["avocado|NOUN"]
s2v.add("🥑|NOUN", vec, 1234)

方法 Sense2Vec.get_freq

获取给定键的频率计数。

参数 类型 描述
key unicode / int 要查找的键。
default - 如果未找到频率,则返回的默认值。
返回值 int 频率计数。
vec = s2v["avocado|NOUN"]
s2v.add("🥑|NOUN", vec, 1234)
assert s2v.get_freq("🥑|NOUN") == 1234

方法 Sense2Vec.set_freq

为给定的键设置频率计数。

参数 类型 描述
key unicode / int 要设置频率的键。
freq int 频率计数。
s2v.set_freq("avocado|NOUN", 104294)

方法 Sense2Vec.__iter__, Sense2Vec.items

遍历向量表中的条目。

参数 类型 描述
产出 tuple 表中的字符串键和向量对。
for key, vec in s2v:
    print(key, vec)

for key, vec in s2v.items():
    print(key, vec)

方法 Sense2Vec.keys

遍历表中的键。

参数 类型 描述
产出 unicode 表中的字符串键。
all_keys = list(s2v.keys())

方法 Sense2Vec.values

遍历表中的向量。

参数 类型 描述
产出 numpy.ndarray 表中的向量。
all_vecs = list(s2v.values())

属性 Sense2Vec.senses

表中可用的词义,例如 "NOUN""VERB"(在初始化时添加)。

参数 类型 描述
返回值 list 可用的词义。
s2v = Sense2Vec(senses=["VERB", "NOUN"])
assert "VERB" in s2v.senses

属性 Sense2vec.frequencies

表中键的频率,按降序排列。

参数 类型 描述
返回值 list 按频率降序排列的 (key, freq) 元组。
most_frequent = s2v.frequencies[:10]
key, score = s2v.frequencies[0]

方法 Sense2vec.similarity

对两个键或两组键进行语义相似度估计。默认估计是使用向量平均值的余弦相似度。

参数 类型 描述
keys_a unicode / int / iterable 字符串或整数键。
keys_b unicode / int / iterable 另一组字符串或整数键。
返回值 float 相似度分数。
keys_a = ["machine_learning|NOUN", "natural_language_processing|NOUN"]
keys_b = ["computer_vision|NOUN", "object_detection|NOUN"]
print(s2v.similarity(keys_a, keys_b))
assert s2v.similarity("machine_learning|NOUN", "machine_learning|NOUN") == 1.0

方法 Sense2Vec.most_similar

获取表中最相似的条目。如果提供了多个键,则使用向量的平均值。为了加快此方法的速度,可以参考 预计算缓存的脚本,以预先计算最近邻节点。

参数 类型 描述
keys unicode / int / iterable 要比较的字符串或整数键。
n int 返回的相似键数量。默认为 10
batch_size int 使用的批量大小。默认为 16
返回值 list 最相似向量的 (key, score) 元组。
most_similar = s2v.most_similar("natural_language_processing|NOUN", n=3)


# [('machine_learning|NOUN', 0.8986967),
#  ('computer_vision|NOUN', 0.8636297),

#  ('深度学习|名词', 0.8573361)]

方法 Sense2Vec.get_other_senses

查找同一单词但具有不同语义的其他条目,例如针对 "duck|NOUN""duck|VERB"

参数 类型 描述
key unicode / int 要检查的键。
ignore_case bool 检查大写、小写和首字母大写形式。默认值为 True
返回值 list 具有不同语义的其他条目的字符串键。
other_senses = s2v.get_other_senses("duck|NOUN")
# ['duck|VERB', 'Duck|ORG', 'Duck|VERB', 'Duck|PERSON', 'Duck|ADJ']

方法 Sense2Vec.get_best_sense

根据可用的语义和频率计数,为给定单词找到最佳匹配的语义。如果没有找到匹配项,则返回 None

参数 类型 描述
word unicode 需要检查的单词。
senses list 可选的语义列表,用于限制搜索范围。如果未设置或为空,则使用向量中的所有语义。
ignore_case bool 检查大写、小写和首字母大写形式。默认值为 True
返回值 unicode 最佳匹配的键,或 None
assert s2v.get_best_sense("duck") == "duck|NOUN"
assert s2v.get_best_sense("duck", ["VERB", "ADJ"]) == "duck|VERB"

方法 Sense2Vec.to_bytes

Sense2Vec 对象序列化为字节串。

参数 类型 描述
exclude list 要排除的序列化字段名称。
返回值 bytes 序列化的 Sense2Vec 对象。
s2v_bytes = s2v.to_bytes()

方法 Sense2Vec.from_bytes

从字节串中加载 Sense2Vec 对象。

参数 类型 描述
bytes_data bytes 要加载的数据。
exclude list 要排除的序列化字段名称。
返回值 Sense2Vec 加载后的对象。
s2v_bytes = s2v.to_bytes()
new_s2v = Sense2Vec().from_bytes(s2v_bytes)

方法 Sense2Vec.to_disk

Sense2Vec 对象序列化到一个目录中。

参数 类型 描述
path unicode / Path 目标路径。
exclude list 要排除的序列化字段名称。
s2v.to_disk("/path/to/sense2vec")

方法 Sense2Vec.from_disk

从目录中加载 Sense2Vec 对象。

参数 类型 描述
path unicode / Path 要从中加载的路径
exclude list 要排除的序列化字段名称。
返回值 Sense2Vec 加载后的对象。
s2v.to_disk("/path/to/sense2vec")
new_s2v = Sense2Vec().from_disk("/path/to/sense2vec")

Sense2VecComponent

用于将 sense2vec 添加到 spaCy 管道中的管道组件。

方法 Sense2VecComponent.__init__

初始化管道组件。

参数 类型 描述
vocab Vocab 共享的 Vocab。主要用于共享的 StringStore
shape 元组 向量形状。
merge_phrases 布尔值 是否将 sense2vec 短语合并为一个标记。默认为 False
lemmatize 布尔值 如果向量中存在词元,则始终查找词元,否则使用原始词。默认为 False
overrides 可选的自定义函数,映射到通过注册表注册的名称,例如 {"make_key": "custom_make_key"}
返回值 Sense2VecComponent 新创建的对象。
s2v = Sense2VecComponent(nlp.vocab)

类方法 Sense2VecComponent.from_nlp

从 nlp 对象初始化组件。主要用于入口点的组件工厂(参见 setup.cfg),以及通过 @spacy.component 装饰器自动注册。

参数 类型 描述
nlp Language nlp 对象。
**cfg - 可选配置参数。
返回值 Sense2VecComponent 新创建的对象。
s2v = Sense2VecComponent.from_nlp(nlp)

方法 Sense2VecComponent.__call__

使用该组件处理 Doc 对象。通常仅作为 spaCy 管道的一部分被调用,而不直接调用。

参数 类型 描述
doc Doc 要处理的文档。
返回值 Doc 处理后的文档。

方法 Sense2Vec.init_component

在此处注册组件特定的扩展属性,且仅在组件被添加到管道并使用时才会注册;否则,即使组件仅被创建而未添加到管道,标记仍会获得这些属性。

方法 Sense2VecComponent.to_bytes

将组件序列化为字节串。当组件被添加到管道并运行 nlp.to_bytes 时也会调用此方法。

参数 类型 描述
返回值 字节 序列化的组件。

方法 Sense2VecComponent.from_bytes

从字节串加载组件。当运行 nlp.from_bytes 时也会调用此方法。

参数 类型 描述
bytes_data 字节 要加载的数据。
返回值 Sense2VecComponent 加载后的对象。

方法 Sense2VecComponent.to_disk

将组件序列化到目录中。当组件被添加到管道并运行 nlp.to_disk 时也会调用此方法。

参数 类型 描述
path unicode / Path 路径。

方法 Sense2VecComponent.from_disk

从目录中加载 Sense2Vec 对象。当运行 nlp.from_disk 时也会调用此方法。

参数 类型 描述
path unicode / Path 要加载的路径
返回值 Sense2VecComponent 加载后的对象。

class registry

函数注册表(由 catalogue 提供支持)用于轻松自定义生成键和短语的函数。它允许你为自定义函数添加装饰器并命名,替换这些函数,并在保存模型时序列化自定义名称。以下是可用的注册表选项:

名称 描述
registry.make_key 给定一个 wordsense,返回键的字符串形式,例如 "word|sense"
registry.split_key 给定一个字符串键,返回一个 (word, sense) 元组。
registry.make_spacy_key 给定一个 spaCy 对象(TokenSpan)以及一个布尔类型的 prefer_ents 关键字参数(是否优先使用单个标记的实体标签),返回一个 (word, sense) 元组。该函数用于扩展属性中,为标记和跨度生成键。
registry.get_phrases 给定一个 spaCy Doc,返回用于 sense2vec 短语的 Span 对象列表(通常为名词短语和命名实体)。
registry.merge_phrases 给定一个 spaCy Doc, 获取所有 sense2vec 短语并将它们合并为单个标记。

每个注册表都提供一个 register 方法,可以用作函数装饰器,并接受一个参数,即自定义函数的名称。

from sense2vec import registry

@registry.make_key.register("custom")
def custom_make_key(word, sense):
    return f"{word}###{sense}"

@registry.split_key.register("custom")
def custom_split_key(key):
    word, sense = key.split("###")
    return word, sense

在初始化 Sense2Vec 对象时,现在可以传入一个包含自定义注册函数名称的覆盖字典。

overrides = {"make_key": "custom", "split_key": "custom"}
s2v = Sense2Vec(overrides=overrides)

这使得尝试不同的策略变得容易,并且可以将这些策略序列化为普通字符串(而无需传递或 pickle 函数本身)。

🚂 训练你自己的 sense2vec 向量

/scripts 目录包含用于文本预处理和训练你自己的向量的命令行工具。

要求

要训练你自己的 sense2vec 向量,你需要以下内容:

  • 一个 非常大 的原始文本源(理想情况下比用于 word2vec 的数据量还要多,因为语义会使词汇表更加稀疏)。我们建议至少 10 亿词。
  • 一个 预训练的 spaCy 模型,能够分配词性标签、依存关系和命名实体,并填充 doc.noun_chunks。如果你需要的语言没有内置的 名词短语语法迭代器,则需要自己编写。(doc.noun_chunksdoc.ents 是 sense2vec 用来确定什么是短语的关键部分。)
  • 已安装并构建好的 GloVefastText。你应该能够克隆仓库并在相应目录中运行 make 命令。

分步流程

训练过程被拆分为多个步骤,以便您可以在任何时刻从中断处继续。处理脚本设计为对单个文件进行操作,从而便于并行化工作。此仓库中的脚本需要使用 GlovefastText,您需要先克隆这些仓库并执行 make 命令来编译。

对于 FastText,脚本需要指定生成的二进制文件路径。如果您在 Windows 上工作,可以使用 cmake 进行编译,或者直接使用这个提供 Windows 版 FastText 二进制构建的非官方仓库中的 .exe 文件:https://github.com/xiamx/fastText/releases。

脚本 描述
1. 01_parse.py 使用 spaCy 解析原始文本,并输出 Doc 对象的二进制集合(参见 DocBin)。
2. 02_preprocess.py 加载上一步生成的已解析 Doc 对象集合,输出 sense2vec 格式的文本文件(每行为一个句子,合并带有语义的短语)。
3. 03_glove_build_counts.py 使用 GloVe 构建词汇表和词频统计。如果您使用的是通过 FastText 实现的 Word2Vec,则可跳过此步骤。
4. 04_glove_train_vectors.py
04_fasttext_train_vectors.py
使用 GloVeFastText 训练词向量。
5. 05_export.py 加载词向量和词频,并输出一个 sense2vec 组件,可通过 Sense2Vec.from_disk 加载。
6. 06_precompute_cache.py 可选: 预计算词汇表中每个条目的近邻查询,以加快 Sense2Vec.most_similar 的速度。

如需更详细的脚本说明,请查看源代码或运行脚本时添加 --help 参数。例如,python scripts/01_parse.py --help

🍳 Prodigy 配方

本包还与标注工具 Prodigy 无缝集成,并提供了利用 sense2vec 向量快速生成多词短语列表以及启动 NER 标注的配方。要使用这些配方,sense2vec 需安装在与 Prodigy 相同的环境中。有关实际应用场景的示例,请参阅此 NER 项目,其中包含可下载的数据集。

以下是可用的配方——更多详细文档请见下文。

配方 描述
sense2vec.teach 使用 sense2vec 启动术语列表。
sense2vec.to-patterns 将短语数据集转换为基于标记的匹配模式。
sense2vec.eval 通过询问短语三元组来评估 sense2vec 模型。
sense2vec.eval-most-similar 通过纠正最相似的条目来评估 sense2vec 模型。
sense2vec.eval-ab 对两个预训练的 sense2vec 向量模型进行 A/B 评估。

配方 sense2vec.teach

使用 sense2vec 启动术语列表。Prodigy 会根据 sense2vec 中最相似的短语建议相关术语,随着您标注并接受相似短语,建议也会相应调整。对于每个种子术语,将采用 sense2vec 向量所确定的最佳匹配语义。

prodigy sense2vec.teach [数据集] [向量路径] [--seeds] [--threshold]
[--n-similar] [--batch-size] [--resume]
参数 类型 描述
数据集 必填位置参数 用于保存标注结果的数据集。
向量路径 必填位置参数 预训练 sense2vec 向量的路径。
--seeds, -s 可选参数 一个或多个用逗号分隔的种子短语。
--threshold, -t 可选参数 相似度阈值,默认为 0.85
--n-similar, -n 可选参数 每次获取的相似项数量。
--batch-size, -b 可选参数 提交标注的批次大小。
--resume, -R 标志 从现有短语数据集中续接。

示例

prodigy sense2vec.teach tech_phrases /path/to/s2v_reddit_2015_md
--seeds "自然语言处理, 机器学习, 人工智能"

recipe sense2vec.to-patterns

将使用 sense2vec.teach 收集的短语数据集转换为基于标记的匹配模式,这些模式可以与 spaCy 的 EntityRuler 或类似 ner.match 的配方一起使用。如果未指定输出文件,则模式会写入标准输出。示例会被分词,以便多标记术语能够正确表示,例如: {"label": "SHOE_BRAND", "pattern": [{ "LOWER": "new" }, { "LOWER": "balance" }]}

prodigy sense2vec.to-patterns [dataset] [spacy_model] [label] [--output-file]
[--case-sensitive] [--dry]
参数 类型 描述
dataset 必需位置参数 要转换的短语数据集。
spacy_model 必需位置参数 用于分词的 spaCy 模型。
label 必需位置参数 应用于所有模式的标签。
--output-file, -o 可选参数 可选的输出文件。默认为标准输出。
--case-sensitive, -CS 标志 使模式区分大小写。
--dry, -D 标志 执行试运行,不输出任何内容。

示例

prodigy sense2vec.to-patterns tech_phrases en_core_web_sm TECHNOLOGY
--output-file /path/to/patterns.jsonl

recipe sense2vec.eval

通过询问短语三元组来评估 sense2vec 模型:单词 A 更类似于单词 B,还是更类似于单词 C?如果人类的判断大多与模型一致,则该向量模型表现良好。该配方只会询问具有相同语义的向量,并支持不同的示例选择策略。

prodigy sense2vec.eval [dataset] [vectors_path] [--strategy] [--senses]
[--exclude-senses] [--n-freq] [--threshold] [--batch-size] [--eval-whole]
[--eval-only] [--show-scores]
参数 类型 描述
dataset 必需位置参数 用于保存标注的数据集。
vectors_path 必需位置参数 预训练 sense2vec 向量的路径。
--strategy, -st 可选参数 示例选择策略。most similar(默认)或 random
--senses, -s 可选参数 以逗号分隔的语义列表,用于限制选择范围。若未设置,则会使用向量中的所有语义。
--exclude-senses, -es 可选参数 以逗号分隔的要排除的语义列表。默认值请参阅 prodigy_recipes.EVAL_EXCLUDE_SENSES
--n-freq, -f 可选参数 限制为出现频率最高的若干条目。
--threshold, -t 可选参数 考虑示例时使用的最小相似度阈值。
--batch-size, -b 可选参数 使用的批次大小。
--eval-whole, -E 标志 评估整个数据集,而不是当前会话。
--eval-only, -O 标志 不进行标注,仅评估当前数据集。
--show-scores, -S 标志 显示所有分数以供调试。

策略

名称 描述
most_similar 从随机语义中随机选取一个单词,获取其属于同一语义的最相似条目。然后询问该选择中最后一条和中间一条之间的相似性。
most_least_similar 从随机语义中随机选取一个单词,获取其最相似条目中最不相似的一条,然后再获取其中最相似的最后一条。
random 从同一个随机语义中随机选取 3 个单词作为样本。

示例

prodigy sense2vec.eval vectors_eval /path/to/s2v_reddit_2015_md
--senses NOUN,ORG,PRODUCT --threshold 0.5

sense2vec.eval 的 UI 预览图

recipe sense2vec.eval-most-similar

通过查看模型为随机短语返回的最相似条目,并剔除其中的错误项,来评估向量模型。

prodigy sense2vec.eval [数据集] [向量路径] [--senses] [--exclude-senses]
[--n-freq] [--n-similar] [--batch-size] [--eval-whole] [--eval-only]
[--show-scores]
参数 类型 描述
dataset 位置参数 用于保存标注的数据集。
vectors_path 位置参数 预训练 sense2vec 向量的路径。
--senses, -s 选项 以逗号分隔的词义列表,用于限制选择范围。若未设置,则会使用向量中的所有词义。
--exclude-senses, -es 选项 以逗号分隔的要排除的词义列表。默认值请参阅 prodigy_recipes.EVAL_EXCLUDE_SENSES
--n-freq, -f 选项 限制为出现频率最高的若干条目。
--n-similar, -n 选项 要检查的相似项数量。默认值为 10
--batch-size, -b 选项 使用的批次大小。
--eval-whole, -E 标志 对整个数据集进行评估,而不是仅对当前会话。
--eval-only, -O 标志 不进行标注,仅对当前数据集进行评估。
--show-scores, -S 标志 显示所有得分以供调试。
prodigy sense2vec.eval-most-similar vectors_eval_sim /path/to/s2v_reddit_2015_md
--senses NOUN,ORG,PRODUCT

recipe sense2vec.eval-ab

通过对两个预训练 sense2vec 向量模型为随机短语返回的最相似条目进行比较,执行 A/B 评估。界面会显示两个随机排列的选项,分别展示每个模型的最相似条目,并高亮显示不同的短语。在标注会话结束时,将显示总体统计信息和更优的模型。

prodigy sense2vec.eval [数据集] [向量路径_a] [向量路径_b] [--senses]
[--exclude-senses] [--n-freq] [--n-similar] [--batch-size] [--eval-whole]
[--eval-only] [--show-mapping]
参数 类型 描述
dataset 位置参数 用于保存标注的数据集。
vectors_path_a 位置参数 预训练 sense2vec 向量的路径。
vectors_path_b 位置参数 预训练 sense2vec 向量的路径。
--senses, -s 选项 以逗号分隔的词义列表,用于限制选择范围。若未设置,则会使用向量中的所有词义。
--exclude-senses, -es 选项 以逗号分隔的要排除的词义列表。默认值请参阅 prodigy_recipes.EVAL_EXCLUDE_SENSES
--n-freq, -f 选项 限制为出现频率最高的若干条目。
--n-similar, -n 选项 要检查的相似项数量。默认值为 10
--batch-size, -b 选项 使用的批次大小。
--eval-whole, -E 标志 对整个数据集进行评估,而不是仅对当前会话。
--eval-only, -O 标志 不进行标注,仅对当前数据集进行评估。
--show-mapping, -S 标志 在界面上显示哪个模型是选项 1,哪个是选项 2(用于调试)。
prodigy sense2vec.eval-ab vectors_eval_sim /path/to/s2v_reddit_2015_md /path/to/s2v_reddit_2019_md --senses NOUN,ORG,PRODUCT

sense2vec.eval-ab 的界面预览

预训练向量

预训练的 Reddit 向量支持以下“语义”,即词性标注或实体标签。更多详情请参阅 spaCy 的 标注方案概述

标签 描述 示例
ADJ 形容词 大的、旧的、绿色的
ADP 介词 在、向、在……期间
ADV 副词 非常、明天、向下、哪里
AUX 助动词 是、已经(完成)、将会(做)
CONJ 连词 和、或、但
DET 冠词 一个、一只、那
INTJ 感叹词 嘘、哎哟、好极了、你好
NOUN 名词 女孩、猫、树、空气、美丽
NUM 数词 1、2017年、一、七十七、MMXIV
PART 助词 ‘s、不
PRON 代词 我、你、他、她、我自己、某人
PROPN 专有名词 玛丽、约翰、伦敦、北约、HBO
PUNCT 标点符号 ,?()
SCONJ 从属连词 如果、当……时、那
SYM 符号 $、%、=、:)、😝
VERB 动词 跑、跑步、吃、吃了、正在吃
实体标签 描述
PERSON 人物,包括虚构人物。
NORP 国籍、宗教或政治团体。
FACILITY 建筑物、机场、高速公路、桥梁等。
ORG 公司、机构、组织等。
GPE 国家、城市、州。
LOC 非 GPE 地点,如山脉、水域等。
PRODUCT 物品、车辆、食品等(不包括服务)。
EVENT 有名称的飓风、战役、战争、体育赛事等。
WORK_OF_ART 书籍、歌曲等作品的标题。
LANGUAGE 任何有名称的语言。

版本历史

v2.0.22023/04/17
v2.0.12022/12/08
v2.0.02021/02/07
v1.0.32021/02/07
v1.0.22019/11/22
v1.0.12019/11/22
v1.0.02019/11/22
v1.0.0a102019/11/21
v1.0.0a92019/11/21
v1.0.0a82019/11/19
v1.0.0a72019/11/19
v1.0.0a62019/11/03
v1.0.0a52019/11/02
v1.0.0a42019/11/02
v1.0.0a32019/11/02
v1.0.0a22019/10/31
v1.0.0a12019/09/12
v1.0.0a02018/04/08

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

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 真正成长为懂上

153.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|3天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|4天前
插件Agent图像

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 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架