机器学习自然语言处理

在自然语言处理(NLP)领域,词向量(Word Embedding)是将人类语言转化为计算机可理解形式的关键技术。它通过数学空间中的向量表示,捕捉词语的语义和语法信息,有效解决了传统离散表示的 “维数灾难” 和 “语义鸿沟” 问题。接下来,我们将深入探讨词向量的原理,并结合代码实践,直观感受其强大之处。​

一、词向量的本质与核心作用​

词向量是将语言符号(词语)转化为连续稠密向量的技术,核心思想是通过向量表示来反映词语间的语义关联。相似语义的词语在向量空间中距离相近,例如 “国王” 与 “女王”、“苹果” 与 “香蕉” 。在实际应用中,词向量为 NLP 任务(如文本分类、机器翻译、命名实体识别等)提供低维、稠密的特征输入,也是预训练模型(如 BERT、GPT)的底层技术支撑。​

二、词向量的发展历程与经典模型​

1. 早期离散表示(One-Hot Encoding)​

One-Hot Encoding 是早期常用的词语表示方法,每个词语用唯一的高维稀疏向量表示。例如,若词典大小为 10 万,那么每个词语的向量维度就是 10 万。这种方式存在明显缺陷,无法体现词语间的语义关联,且维度过高导致计算效率低下。在 Python 中,我们可以使用scikit-learn库简单实现 One-Hot Encoding:​

TypeScript

取消自动换行复制

from sklearn.preprocessing import OneHotEncoder​

import numpy as np​

words = np.array([["apple"], ["banana"], ["cherry"]])​

encoder = OneHotEncoder()​

one_hot = encoder.fit_transform(words).toarray()​

print(one_hot)​

2. 分布式表示(Distributed Representation)的兴起​

分布式表示通过上下文预测建模,将词语映射到低维连续空间,其中经典的 Word2Vec 模型由 Google 在 2013 年提出,它包含 CBOW(连续词袋模型)和 Skip-gram 两种训练模式。CBOW 通过词语的上下文预测其本身,Skip-gram 则通过词语预测其上下文。下面使用gensim库来训练一个简单的 Word2Vec 模型:​

TypeScript

取消自动换行复制

from gensim.models import Word2Vec​

sentences = [["apple", "banana", "cherry"], ["banana", "date", "elderberry"]]​

model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)​

# 查看某个词的词向量​

print(model.wv["apple"])​

# 找出最相似的词​

print(model.wv.most_similar("apple"))​

另一个经典模型 GloVe(Global Vectors for Word Representation)结合全局词共现统计与局部上下文窗口,通过最小化加权最小二乘损失训练向量。虽然gensim库也提供了 GloVe 的实现,但更多时候我们会使用预训练好的 GloVe 向量。​

3. 上下文敏感的动态词向量​

早期词向量是静态的,无法处理多义词。动态词向量则能根据上下文生成不同表示,其中 ELMo(Embeddings from Language Models)通过双向 LSTM 预训练语言模型,生成包含上下文信息的词向量。而 BERT(Bidirectional Encoder Representations from Transformers)使用 Transformer 编码器,通过掩码语言模型(MLM)和下一句预测(NSP)预训练,将动态词向量技术推向新高度。下面使用transformers库获取 BERT 的词向量:​

TypeScript

取消自动换行复制

from transformers import BertTokenizer, BertModel​

import torch​

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')​

model = BertModel.from_pretrained('bert-base-uncased')​

text = "I went to the bank to deposit money"​

inputs = tokenizer(text, return_tensors="pt")​

with torch.no_grad():​

outputs = model(**inputs)​

last_hidden_states = outputs.last_hidden_state​

print(last_hidden_states.shape) # 输出 [batch_size, sequence_length, hidden_size]​

三、词向量的关键技术特性​

1. 向量空间的几何意义​

在词向量空间中,通常使用余弦相似度来衡量词语相关性,公式为:​

sim(u,v)=∥u∥∥v∥u⋅v​

在 Python 中,可使用numpy计算余弦相似度:​

TypeScript

取消自动换行复制

import numpy as np​

vec1 = np.array([1, 2, 3])​

vec2 = np.array([4, 5, 6])​

cos_sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))​

print(cos_sim)​

此外,向量运算还能反映语义关系,如 “国王” - “男人” + “女人” ≈ “女王”。​

2. 维度选择​

词向量常见维度有 50、100、300 等,需要平衡计算效率与表达能力。低维向量适合轻量级任务,高维向量可捕捉更复杂语义。在训练 Word2Vec 模型时,可通过vector_size参数指定维度。​

3. 评估指标​

词向量的评估分为内在评估和外在评估。内在评估包括类比推理(如 “中国 - 北京” 对应 “日本 - 东京”)、词语相似度排名;外在评估则关注在具体 NLP 任务(如情感分析)中的性能表现。​

四、词向量的应用场景​

1. 基础 NLP 任务​

在文本分类任务中,可将句子中词语的向量平均或拼接作为特征输入分类器。以下是一个简单的文本分类示例,使用 Word2Vec 词向量和逻辑回归:​

TypeScript

取消自动换行复制

from sklearn.linear_model import LogisticRegression​

from sklearn.metrics import accuracy_score​

import numpy as np​

# 假设已经有训练好的词向量和标签​

train_vectors = np.array([[1, 2, 3], [4, 5, 6]]) # 词向量​

train_labels = np.array([0, 1]) # 标签​

test_vectors = np.array([[7, 8, 9]])​

test_labels = np.array([1])​

clf = LogisticRegression()​

clf.fit(train_vectors, train_labels)​

predicted = clf.predict(test_vectors)​

print(accuracy_score(test_labels, predicted))​

2. 生成任务​

在机器翻译中,源语言词向量经编码器生成上下文向量,解码器生成目标语言;在文本生成任务中,GPT 等模型基于动态词向量生成连贯文本。​

3. 跨语言处理​

跨语言词向量(如 mBERT)可对齐不同语言的语义空间,支持零样本翻译。​

五、挑战与前沿发展​

1. 挑战​

词向量技术面临多语言鸿沟、时效性不足以及可解释性差等挑战。资源稀缺语言的词向量质量低,静态词向量难以捕捉新词和领域特定术语,向量空间的语义映射缺乏明确物理意义。​

2. 前沿方向​

目前前沿研究聚焦于动态词向量优化,如 GPT-4、LLaMA 等大模型进一步提升上下文理解能力;探索图结构词向量,结合知识图谱注入结构化语义;以及通过对比学习实现少样本 / 无监督学习场景下的词向量训练。​

六、工具与资源推荐​

在实际应用中,有许多工具和资源可供使用。训练工具方面,可使用 TensorFlow/PyTorch 自定义词向量训练框架,也可通过 SpaCy/Flair 获取预训练词向量,支持多语言。预训练模型库推荐使用 Hugging Face Transformers,它包含 BERT、GPT 等模型的词向量接口;FastText 官方预训练向量支持 100 + 语言,可直接下载使用。​

词向量作为连接自然语言与计算机的桥梁,其技术演进深刻影响着 NLP 的发展。从早期静态表示到动态上下文感知,词向量始终是理解语言语义的核心工具,未来也将在多模态、低资源等场景中持续突破。通过理论学习与代码实践相结合,我们能更好地掌握这一技术,应用于实际项目中。​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万能小贤哥

感谢大捞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值