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

如何将(1096,100)二维文本特征转为三维数组实现音文特征融合

实现方法

你当前拿到的(1096, 100)形状文本特征,是对每个样本的所有token词向量做全局平均得到的,丢失了序列维度。要得到目标(1096, 50, 100)的3D格式,可根据融合需求选以下两种方案:


方案1:快速维度扩展(复用现有平均特征)

如果融合逻辑不需要文本的逐token时序信息,仅需要维度匹配,直接用numpy广播复制现有特征即可,不需要重新计算词向量:

import numpy as np

# 给原2D特征插入序列维度,再沿序列维度复制50次
text_embeddings_3d = np.repeat(
    text_embeddings[:, np.newaxis, :],  # 插入新轴后形状为(1096, 1, 100)
    repeats=50,
    axis=1
)

print(text_embeddings_3d.shape)  # 输出: (1096, 50, 100)

注意:该方案下50个序列位置的文本特征完全相同,没有时序差异,仅适合对文本位置信息不敏感的融合场景。


方案2:重构特征生成逻辑(推荐,保留时序信息)

如果要和音频特征做时序对齐融合,不建议直接复制平均向量——这种做法完全丢失了文本的词序信息,融合效果会打折扣。你可以直接修改词向量生成逻辑,输出逐token的序列特征,对序列做定长截断/补零,直接得到目标3D特征:

import numpy as np

def get_seq_word2vec(tokens_list, vector, max_seq_len=50, generate_missing=False, k=100):
    # 序列过长时直接截断前max_seq_len个token
    tokens = tokens_list[:max_seq_len]
    # 逐token生成对应词向量
    if generate_missing:
        seq_vec = [vector[word] if word in vector else np.random.rand(k) for word in tokens]
    else:
        seq_vec = [vector[word] if word in vector else np.zeros(k) for word in tokens]
    # 序列过短时用零向量填充到固定长度
    seq_vec += [np.zeros(k)] * (max_seq_len - len(seq_vec))
    return np.array(seq_vec)  # 单样本输出形状(50, 100)

def get_word2vec_seq_embeddings(vectors, clean_text, max_seq_len=50, generate_missing=False):
    embeddings = clean_text['tokens'].apply(
        lambda x: get_seq_word2vec(x, vectors, max_seq_len, generate_missing)
    )
    # 拼接所有样本得到批量特征
    return np.stack(embeddings.values)

# 调用后直接得到目标形状特征
text_embeddings_3d = get_word2vec_seq_embeddings(word2vec, df, max_seq_len=50, generate_missing=True)
print(text_embeddings_3d.shape)  # 输出: (1096, 50, 100)
  • 该方案保留了文本的词序信息,每个位置的向量对应单个token的语义,和音频按时间步对齐融合的效果更优,是跨模态时序融合的常规处理方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:24:19