机器学习自然语言处理

在自然语言处理(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 的发展。从早期静态表示到动态上下文感知,词向量始终是理解语言语义的核心工具,未来也将在多模态、低资源等场景中持续突破。通过理论学习与代码实践相结合,我们能更好地掌握这一技术,应用于实际项目中。​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何自学FPGA设计?

众所周知,FPGA设计自学难度不小,更不存在速成的捷径。这里简单说一下学习的规划,希望能给入门者提供一些方向。 学会相应的知识 不论是科班毕业还是理工科专业出身,想要入行FPGA开发,基础知识必须扎实。尤其是在高校…

南航无人机大规模户外环境视觉导航框架!SM-CERL:基于语义地图与认知逃逸强化学习的无人机户外视觉导航

作者: Shijin Zhao, Fuhui Zhou, Qihui Wu单位:南京航空航天大学电子信息工程学院论文标题: UAV Visual Navigation in the Large-Scale Outdoor Environment: A Semantic Map-Based Cognitive Escape Reinforcement Learning Method论文链接…

Linux-进程间通信

1.进程间通信介绍 1.1通信目的 数据传输:⼀个进程需要将它的数据发送给另⼀个进程 资源共享:多个进程之间共享同样的资源。 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事…

精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代

精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代 在创业旅程中,从需求洞察到产品落地的关键一跃是打造最小可行化产品(MVP)。今天,我们结合《精益…

从JavaScript快速上手Python:关键差异与核心技巧

引言 如果你是JavaScript开发者,可能会对Python的简洁语法和丰富的生态感兴趣。但两种语言的设计哲学和实现细节存在显著差异。本文将通过对比JS与Python的核心概念,帮助你快速过渡,避免“踩坑”。 一、语法差异:告别大括号&#…

TransmittableThreadLocal实现上下文传递-笔记

1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal(简称 TTL)是阿里巴巴开源的一个工具类,旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强,尤其适用…

TDengine 安全部署配置建议

背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明,并提供部署和配置建议,为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…

在Cursor中启用WebStorm/IntelliJ风格快捷键

在Cursor中启用WebStorm/IntelliJ风格快捷键 方法一:使用预置快捷键方案 打开快捷键设置 Windows/Linux: Ctrl K → Ctrl SmacOS: ⌘ K → ⌘ S 搜索预设方案 在搜索框中输入keyboard shortcuts,选择Preferences: Open Keyboard Shortcuts (JSON) …

python打卡day30@浙大疏锦行

知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 具体操作步骤: 在桌面…

【kafka】基本命令

创建 Kafka Topic 的命令 以下是创建 Kafka Topic 的几种常用方法&#xff1a; 1. 使用 kafka-topics.sh 基础命令&#xff08;Kafka 自带工具&#xff09; bin/kafka-topics.sh --create \--bootstrap-server <broker地址:端口> \--topic <topic名称> \--parti…

编程速递:适用于 Delphi 12.3 的 FMX Linux 现已推出

Embarcadero非常高兴地宣布&#xff0c;用于使用Delphi构建Linux客户端应用程序的FMX Linux UI库再次在RAD Studio 12.3版本以及RAD Studio 12.2版本中提供支持&#xff0c;同时也适用于更早的版本。 作为RAD Studio的一个附加库&#xff0c;FMX Linux为开发面向Linux的图形用…

通过实例讲解螺旋模型

目录 一、螺旋模型的核心概念 二、螺旋模型在电子商城系统开发中的应用示例 第 1 次螺旋:项目启动与风险初探

vue3 vite 路由

如路由是这种格式 http://localhost:7058/admin/product/brand路由配置如下 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue import NProgress from nprogress; import nprogress/nprogress.css; import {errorRour…

【Redis】Hash 存储相比 String 存储的优势

在 Redis 中&#xff0c;Hash 存储相比 String 存储具有以下 优势&#xff0c;特别适用于某些特定场景&#xff1a; ✅ 1. 更节省内存&#xff08;尤其适合存储对象&#xff09; Hash 内部使用压缩列表&#xff08;ziplist&#xff09;或哈希表实现&#xff0c;在数据量较小时…

CSS详解:特性、选择器与优先级

CSS详解&#xff1a;特性、选择器与优先级 目录 CSS详解&#xff1a;特性、选择器与优先级一、CSS的核心特性1. 层叠性&#xff08;Cascading&#xff09;2. 继承性&#xff08;Inheritance&#xff09;3. 优先级&#xff08;Specificity&#xff09;4. 响应式设计5. 动画与过渡…

《算法导论(第4版)》阅读笔记:p86-p90

《算法导论(第4版)》学习第 19 天&#xff0c;p83-p85 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低声说话”) c. a hint(提示)&#xff1b;a slight knowledg…

nginx概念及使用

一、Nginx 核心概念 Nginx&#xff08;发音为 "engine-x"&#xff09;是一个高性能、开源的 Web 服务器和反向代理服务器&#xff0c;由俄罗斯工程师伊戈尔・赛索耶夫&#xff08;Igor Sysoev&#xff09;于 2004 年开发&#xff0c;最初用于解决当时高并发场景下 Ap…

2025蓝桥杯JAVA编程题练习Day8

1. 路径 题目描述 小蓝学习了最短路径之后特别高兴&#xff0c;他定义了一个特别的图&#xff0c;希望找到图 中的最短路径。 小蓝的图由 2021 个结点组成&#xff0c;依次编号 1 至 2021。 对于两个不同的结点 a, b&#xff0c;如果 a 和 b 的差的绝对值大于 21&#xff0…

【赵渝强老师】Memcached的路由算法

Memcached支持两种不同方式的客户端路由算法&#xff0c;即&#xff1a;求余数Hash算法和一致性Hash算法。下面分别进行介绍。 一、 求余数的路由算法 求余数Hash算法的客户端路由是对插入数据的键进行求余数&#xff0c;根据余数来决定存储到哪个Memcached实例。 视频讲解如…

NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)

引言&#xff1a;语言与矩阵的奇妙邂逅 在自然语言处理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每个词语都像被施了变形术的精灵&#xff0c;在数学的殿堂中翩翩起舞。当我们用"king - man woman queen"这样的向量魔法破解语义密码时&#xff0c;线性…