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

为何用set()和np.unique()提取唯一文本与嵌入结果长度不一致?

问题场景

拥有字符串列表titles,以及通过SentenceTransformer("all-mpnet-base-V2")生成的对应密集嵌入数组embeddings。分析时需基于唯一文本开展,因生成嵌入成本高,尝试用set()提取唯一字符串、np.unique(axis=0)提取对应嵌入,但两者结果长度不一致。已通过for循环实现需求,但效率低下,面临更大数据集时担心性能问题,同时顾虑信息丢失风险。

相关代码:

# 数据基本结构
titles = ["some text", "other text", ...]
embeddings = [Array1, Array2, ...]

# 尝试的去重方式
unique_titles = list(set(titles))
unique_embeddings = np.unique(embeddings, axis = 0)

# 长度不一致
len(unique_titles) == len(unique_embeddings)  # 返回False

# 替代的for循环实现
titles_unique = []
embeddings_unique = np.array([0 for i in range(embeddings.shape[1])])
for t, e in zip(titles, embeddings):
    if t not in titles_unique:
        titles_unique.append(t)
        embeddings_unique = np.vstack([embeddings_unique, e])

# 移除初始化的首行
embeddings_unique = np.delete(embeddings_unique, (0), axis = 0)
长度不一致的原因
  • 浮点精度误差:SentenceTransformer生成的嵌入是浮点型数组,np.unique对数组去重时会严格比较每一位浮点值。即使是相同文本生成的嵌入,也可能因模型推理、浮点存储的微小舍入误差出现细微差异,被np.unique判定为不同数组,导致其结果长度大于unique_titles;极端情况下不同文本可能生成完全一致的嵌入(概率极低),会让unique_embeddings长度更小。
  • 去重逻辑不匹配:set(titles)是基于字符串的完全匹配去重,而np.unique(embeddings, axis=0)是基于数组内容的完全匹配去重,两者的去重依据完全不同,自然无法保证结果长度一致。
高效解决方案

方法1:字典映射(O(n)时间复杂度)

字典的键具有唯一性,且in操作是O(1)复杂度,远快于列表的O(n)判断:

title_embedding_map = {}
for title, emb in zip(titles, embeddings):
    # 只保留首次出现的嵌入,若需保留最后一次则去掉判断直接赋值
    if title not in title_embedding_map:
        title_embedding_map[title] = emb

unique_titles = list(title_embedding_map.keys())
unique_embeddings = np.array(list(title_embedding_map.values()))

方法2:Pandas去重(适合结构化数据处理)

Pandas的drop_duplicates可高效按指定列去重,同时保留对应嵌入:

import pandas as pd
import numpy as np

# 将数据转为DataFrame
df = pd.DataFrame({
    'title': titles,
    'embedding': [emb.tolist() for emb in embeddings]
})

# 按title去重,保留首次出现的记录
df_unique = df.drop_duplicates(subset='title', keep='first')

# 提取结果
unique_titles = df_unique['title'].tolist()
unique_embeddings = np.array(df_unique['embedding'].tolist())
信息丢失风险说明

上述两种方法均严格基于文本唯一性去重,保留每个唯一文本对应的嵌入(首次/末次出现的嵌入)。由于相同文本生成的嵌入理论上高度一致,即使存在微小浮点误差,这种误差对后续分析(如聚类、相似度计算)的影响可忽略,不会造成有效信息丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:33:12