文本编码方式(词向量提取方式)

本文详细介绍了文本编码的方式,从one-hot编码的局限性,到分布式表示的发展,包括基于矩阵的GloVe、基于聚类的布朗聚类以及基于神经网络的word2vec和BERT。GloVe通过共现矩阵分解获取词向量,而word2vec的CBOW和Skip-gram模型以及BERT的双向Transformer结构则进一步捕捉词的上下文信息。BERT在多个NLP任务中表现出色,其双向注意力机制是其关键优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 文本编码方式

1.1 one-hot

缺点:

  • 维度大
  • 词和词之间都是孤立的,无法表示词与词之间的语义信息

1.2 分布式表示

正所谓:“物以类聚,人以群分”,所以分布式表示的主要思想为:上下文相似的词,其语义也相似。其主要分为三种方法。

  • 基于矩阵的分布式表示
  • 基于聚类的分布式表示
  • 基于神经网络的分布式表示

2. 分布式表示

如节1.2所述,分布式表示主要分为三种方式。这三种方式使用了不同的技术手段,但都是基于分布假说,核心思想由两部分组成:

  1. 选择一种方式描述上下文
  2. 选择一种模型刻画目标词与上下文的关系

2.1 基于矩阵的分布式表示

这类方法需要构建一个“词-上下文”矩阵,每行对应一个词,每列表示一种不同的上下文,矩阵中的每个元素对应相关词和上下文的共现次数。该方法分为以下三步:

步骤 内容 解释
step1 选取上下文 法1:将词所在的文档作为上下文,形成“词-文档”矩阵
法2:将词附近的上下文中的词(例如上下文窗口中的5个词)作为上下午,形成“词-词”矩阵
法3:将词附近的n元词组作为上下文,形成“词-n元组”矩阵
step2 确定矩阵中各元素的值 常用的有tf-idf、PMI和直接取log
step3 矩阵分解 奇异值分解(SVD)、非负矩阵分解(NMF)、典型关联分析(CCA)、HPCA

LSA:使用“词-文档”矩阵,tf-idf作为元素值,并用SVD分解
Global Vector(GloVe):使用“词-词”矩阵进行分解从而得到词向量

2.1.1 GloVe

正如论文的标题而言,GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。总体上看,GloVe模型是一种对“词-词”矩阵进行分解从而得到词表示的方法。

步骤

GloVe的实现可以分为三步:

  1. 构建共现矩阵: 根据语料库构建共现矩阵 X X X,矩阵第 i 行与第 j 列的值为 v i v_i vi v j v_j vj 在特定大小的上下文窗口的共现次数 x i j x_{ij} xij 。一般而言,这个次数的最小单位是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离d,提出了一个衰减函数: d e c a y = 1 / d decay = 1/d decay=1/d 用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。
  2. 构建词向量和共现矩阵之间的共现关系: 论文作者提出下面的公式可以近似表达二者的关系。 l o g ( x i j ) = w i T w ~ j + b i ( 1 ) + b j ( 2 ) log(x_{ij})=w_i^T\tilde{w}_j+b_i^{(1)}+b_j^{(2)} log(xij)=wiTw~j+bi(1)+bj(2) 其中 w i w_i wi 为词 v i v_i vi 作为目标词时的词向量, w ~ j \tilde{w}_j w~j 为词 v j v_j vj 作为上下文时的词向量 b ( 1 ) b^{(1)} b(1) b ( 2 ) b^{(2)} b(2)为针对词表中各词的偏移向量。
  3. 在矩阵分解步骤,GloVe模型借鉴了推荐系统中的基于隐因子分解(Latent Factor Model)的方法,在计算重构误差时,只考虑共现次数非零的矩阵元素,同时对矩阵中的行和列加入了偏移项。具体为最小化下式:
    L o s s = ∑ i , j ∈ V , x i j ≠ 0 f ( x i j ) ( w i T w ~ j + b i ( 1 ) + b j ( 2 ) − l o g ( x i j ) ) 2 Loss=\sum_{i,j \in V,x_{ij} \neq 0}f(x_{ij})(w_i^T\tilde{w}_j+b_i^{(1)}+b_j^{(2)}-log(x_{ij}))^2 Loss=i,jV,xij=0f(xij)(wiTw~
### BERT实现词向量化与文本向量化的方法 #### 方法概述 BERT(Bidirectional Encoder Representations from Transformers)是一种强大的预训练语言模型,能够生成高质量的词向量文本向量。通过微调或直接使用其隐藏层输出,可以有效捕捉语义信息并用于各种自然语言处理任务。 #### 词向量化过程 在BERT中,每个输入token会被映射为其对应的嵌入表示。具体来说,BERT会将输入序列转换为一系列固定维度的向量[^1]。这些向量可以通过以下方式获得: - **Token Embeddings**: 输入中的每一个单词都会被转化为一个固定的embedding。 - **Positional Encodings**: 添加位置编码以保留顺序信息。 - **Segment Embeddings**: 如果存在多个句子,则标记它们属于哪个部分。 最终得到的是每一层Transformer后的隐状态矩阵 \( H \in R^{T \times D} \),其中\( T \) 是tokens数量,而\( D \) 则是hidden size大小。通常可以选择最后一层作为词语级别的特征表示[^2]。 ```python from transformers import BertTokenizer, BertModel import torch tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') text = "我喜欢学习人工智能" encoded_input = tokenizer(text, return_tensors='pt', padding=True, truncation=True) with torch.no_grad(): output = model(**encoded_input) word_embeddings = output.last_hidden_state # 获取最后一个隐藏层的状态 print(word_embeddings.shape) # 输出形状应类似于(batch_size, sequence_length, hidden_dim) ``` 上述代码展示了如何加载预训练好的`bert-base-chinese`模型,并提取给定中文字符串各token的最后一层隐藏态作为词向量。 #### 文本向量化过程 对于整个文档或者较长片段而言,可以直接取特殊分类符 `[CLS]` 对应的位置处的向量当作整体文本表征;然而这种方法可能不够精确因为仅依赖单个点不足以概括全文含义。另一种更优的方式是对所有token的结果求平均值得到全局描述子: \[ \text{Text Vector} = mean(H_{i}) , i=0,...,N-1\] 这里 N 表示实际有效的 token 数目(不包括填充的部分). 另外还有专门针对句间关系建模优化过的版本如Sentence-BERT(SBERT), 它通过对偶样本对比学习调整原始BERT内部机制从而更适合做短文本匹配类工作. ```python sentence_embedding = word_embeddings.mean(dim=1).squeeze() print(sentence_embedding.shape) # 应该返回(hidden_dim,) ``` 以上脚本演示了怎样计算一段话的整体表达形式. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值