You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Spacy生成固定长度嵌入?求带参数封装方法及预处理说明

使用spaCy生成固定长度文本嵌入的实现方案

一、核心实现逻辑

spaCy预训练模型会为每个token生成固定维度的嵌入,但文本由多个token组成,要得到固定长度的文本级嵌入,核心是通过集成方法将所有token的嵌入聚合为单个向量,或直接使用Transformer模型的文档级池化输出。若需自定义嵌入长度(与模型默认维度不同),需额外加入降维步骤。

二、封装函数实现

以下是可配置的封装函数,支持自定义输入文本、嵌入长度(可选)和集成方法:

import spacy
from sklearn.decomposition import PCA
import numpy as np

def get_fixed_length_embedding(input_text, embedding_length=None, ensemble_method="mean"):
    # 加载spaCy模型(可替换为en_core_web_trf等Transformer模型)
    nlp = spacy.load("en_core_web_md")
    doc = nlp(input_text)
    
    # 过滤停用词和标点(可根据需求注释此段以保留全部token)
    filtered_tokens = [token for token in doc if not token.is_stop and not token.is_punct]
    
    # 无有效token时返回全零向量
    if not filtered_tokens:
        default_dim = nlp.vocab.vectors_length
        return np.zeros(embedding_length if embedding_length else default_dim)
    
    # 获取token嵌入矩阵
    token_embeddings = np.array([token.vector for token in filtered_tokens])
    
    # 应用集成方法生成文本嵌入
    if ensemble_method == "mean":
        text_embedding = np.mean(token_embeddings, axis=0)
    elif ensemble_method == "max":
        text_embedding = np.max(token_embeddings, axis=0)
    elif ensemble_method == "sum":
        text_embedding = np.sum(token_embeddings, axis=0)
    elif ensemble_method == "concat_first_last":
        text_embedding = np.concatenate([token_embeddings[0], token_embeddings[-1]]) if len(token_embeddings)>=2 else np.mean(token_embeddings, axis=0)
    else:
        raise ValueError(f"不支持的集成方法:{ensemble_method}")
    
    # 指定自定义长度时,用PCA降维
    if embedding_length and embedding_length != text_embedding.shape[0]:
        pca = PCA(n_components=embedding_length)
        text_embedding = pca.fit_transform(text_embedding.reshape(1, -1)).flatten()
    
    return text_embedding

参数说明

  • input_text: 待处理的输入文本
  • embedding_length: 可选,自定义嵌入向量长度;不指定则使用spaCy模型默认维度(如en_core_web_md为300维)
  • ensemble_method: 集成方法,支持mean(均值)、max(最大值)、sum(求和)、concat_first_last(首尾token拼接)

使用示例

input_text = "this is my example text !!. nothing serious about it."
# 生成默认300维均值嵌入
embedding = get_fixed_length_embedding(input_text, ensemble_method="mean")
print(f"默认嵌入维度:{embedding.shape[0]}")

# 生成自定义128维最大值嵌入
custom_embedding = get_fixed_length_embedding(input_text, embedding_length=128, ensemble_method="max")
print(f"自定义嵌入维度:{custom_embedding.shape[0]}")

三、预处理相关问题

  • 停用词/特殊字符处理:上述函数已加入停用词和标点过滤逻辑,可根据需求选择是否保留:
    • 若需保留停用词(部分场景下停用词携带语义),可注释过滤代码;
    • 特殊字符(如标点)通常无有效语义,建议过滤,spaCy的token.is_punct可直接识别。
  • 自动处理情况:spaCy默认模型不会自动过滤停用词和标点,需手动添加逻辑;若使用Transformer类模型(如en_core_web_trf),可直接通过doc._.trf_data.last_hidden_state.mean(axis=0)获取文档级嵌入,模型内部已完成基础预处理,但仍建议按需手动过滤无效token。

内容的提问来源于stack exchange,提问作者Bharat Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:32:50