向量表示:文本从离散符号到连续空间的数学跃迁

向量表示:从单词到文档的深度解析

引言

在自然语言处理(NLP)领域,将文本数据转化为计算机可处理的数值形式是核心任务之一。向量表示(Vector Representation)作为这一过程的关键技术,通过将单词、短语乃至整个文档映射到连续的向量空间,实现了文本的数学化表示。本文将从单词、短语到文档的全维度,深入解析向量表示的原理、方法及应用场景,为开发者提供实用的技术指南。

单词的向量表示:词嵌入技术

词嵌入的原理

词嵌入(Word Embedding)是将离散的单词映射到连续向量空间的技术。其核心思想是通过学习单词在上下文中的共现关系,将语义相似的单词映射到向量空间中相近的位置。经典的词嵌入模型如Word2Vec、GloVe等,通过无监督学习的方式,从大规模文本语料中捕捉单词的语义信息。

Word2Vec模型详解

Word2Vec模型包括两种架构:CBOW(Continuous Bag-of-Words)和Skip-Gram。CBOW通过上下文单词预测目标单词,而Skip-Gram则通过目标单词预测上下文单词。两者均通过最大化似然函数优化词向量,使得语义相似的单词在向量空间中距离更近。

示例代码(使用Gensim库训练Word2Vec模型)

  1. from gensim.models import Word2Vec
  2. # 准备语料(分词后的句子列表)
  3. sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
  4. # 训练Word2Vec模型
  5. model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
  6. # 获取单词向量
  7. vector_cat = model.wv["cat"]
  8. print(vector_cat.shape) # 输出: (100,)

GloVe模型对比

与Word2Vec不同,GloVe(Global Vectors)通过统计全局词共现矩阵,直接优化词向量与共现概率的关系。GloVe结合了全局矩阵分解和局部上下文窗口的优点,在捕捉全局语义信息方面表现更优。

短语的向量表示:组合与上下文感知

短语组合方法

直接对单词向量进行平均或加权求和是简单的短语表示方法,但会丢失词序信息。更高级的方法如段落向量(Paragraph Vector),通过引入段落ID扩展Word2Vec模型,学习短语的固定长度表示。

上下文感知模型:BERT

BERT(Bidirectional Encoder Representations from Transformers)通过预训练任务(如掩码语言模型和下一句预测),学习上下文相关的词向量。对于短语,BERT可以生成动态的上下文嵌入,捕捉短语在不同语境下的语义变化。

示例代码(使用Hugging Face Transformers库获取BERT短语向量)

  1. from transformers import BertTokenizer, BertModel
  2. import torch
  3. # 加载预训练BERT模型和分词器
  4. tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
  5. model = BertModel.from_pretrained("bert-base-uncased")
  6. # 编码短语
  7. inputs = tokenizer("The cat says meow", return_tensors="pt")
  8. outputs = model(**inputs)
  9. # 获取短语向量(取[CLS]标记的隐藏状态作为整体表示)
  10. phrase_vector = outputs.last_hidden_state[:, 0, :].detach().numpy()
  11. print(phrase_vector.shape) # 输出: (1, 768)

文档的向量表示:层次化与全局建模

文档向量的生成方法

  1. 词向量平均:对文档中所有单词的向量取平均,简单但忽略词序和结构。
  2. TF-IDF加权平均:通过TF-IDF权重调整词向量贡献,突出重要词汇。
  3. Doc2Vec:扩展Word2Vec模型,直接学习文档的固定长度向量。
  4. BERT聚合:对BERT生成的词向量进行池化(如平均池化、最大池化)或使用[CLS]标记的隐藏状态作为文档表示。

层次化模型:HAN

层次化注意力网络(Hierarchical Attention Network, HAN)通过两级注意力机制(单词级和句子级)生成文档向量。单词级注意力捕捉句子内重要词汇,句子级注意力聚合句子表示,最终生成文档的全局向量。

示例代码(简化版HAN的PyTorch实现)

  1. import torch
  2. import torch.nn as nn
  3. class WordAttention(nn.Module):
  4. def __init__(self, input_dim, attention_dim):
  5. super().__init__()
  6. self.W = nn.Linear(input_dim, attention_dim)
  7. self.u = nn.Parameter(torch.randn(attention_dim))
  8. def forward(self, word_vectors):
  9. # word_vectors形状: (batch_size, seq_len, input_dim)
  10. u = torch.tanh(self.W(word_vectors)) # (batch_size, seq_len, attention_dim)
  11. alpha = torch.softmax(torch.sum(u * self.u, dim=2), dim=1) # (batch_size, seq_len)
  12. sentence_vector = torch.sum(alpha.unsqueeze(2) * word_vectors, dim=1) # (batch_size, input_dim)
  13. return sentence_vector
  14. class SentenceAttention(nn.Module):
  15. def __init__(self, input_dim, attention_dim):
  16. super().__init__()
  17. self.W = nn.Linear(input_dim, attention_dim)
  18. self.u = nn.Parameter(torch.randn(attention_dim))
  19. def forward(self, sentence_vectors):
  20. # sentence_vectors形状: (batch_size, num_sentences, input_dim)
  21. u = torch.tanh(self.W(sentence_vectors)) # (batch_size, num_sentences, attention_dim)
  22. alpha = torch.softmax(torch.sum(u * self.u, dim=2), dim=1) # (batch_size, num_sentences)
  23. doc_vector = torch.sum(alpha.unsqueeze(2) * sentence_vectors, dim=1) # (batch_size, input_dim)
  24. return doc_vector
  25. # 假设已获取单词和句子向量
  26. word_vectors = torch.randn(32, 20, 100) # (batch_size, seq_len, input_dim)
  27. sentence_vectors = torch.randn(32, 5, 100) # (batch_size, num_sentences, input_dim)
  28. word_attn = WordAttention(100, 50)
  29. sentence_attn = SentenceAttention(100, 50)
  30. sentence_vectors_from_words = torch.stack([word_attn(word_vectors[i]) for i in range(32)], dim=0) # (32, 100)
  31. doc_vector = sentence_attn(sentence_vectors_from_words.unsqueeze(1)) # (32, 100)
  32. print(doc_vector.shape) # 输出: (32, 100)

应用场景与挑战

应用场景

  1. 信息检索:通过计算文档向量与查询向量的相似度,实现语义搜索。
  2. 文本分类:将文档向量输入分类器,完成情感分析、主题分类等任务。
  3. 推荐系统:基于用户历史行为的文档向量,推荐相似内容。
  4. 机器翻译:通过编码器-解码器架构,将源语言文档向量映射到目标语言。

挑战与未来方向

  1. 多语言支持:跨语言向量表示需解决词汇不对齐问题。
  2. 长文档处理:传统模型对长文档的表示能力有限,需探索层次化或稀疏注意力机制。
  3. 动态更新:在线学习场景下,如何高效更新文档向量以适应数据分布变化。
  4. 可解释性:提升向量表示的可解释性,辅助模型调试与优化。

结论

向量表示技术从单词到文档的演进,推动了NLP领域的快速发展。从Word2Vec到BERT,再到层次化模型,向量表示不断融合上下文信息与结构信息,实现了从离散符号到连续空间的数学跃迁。未来,随着多模态学习与高效计算的需求增长,向量表示技术将迎来更广阔的应用前景。开发者应深入理解其原理,结合具体场景选择合适的方法,以构建高性能的NLP系统。