在RNN中词使用one_hot表示的问题

  • 假设有10000个词
    • 每个词的向量长度都为10000,整体大小太大
  • 没能表示出词与词之间的关系
    • 例如Apple与Orange会更近一些,Man与Woman会近一些,取任意两个向量计算内积都为0

目录

1.词嵌入

1.1.特点

1.3.word2vec介绍

1.3.Word2Vec案例

1.3.1.训练语料

1.3.2.步骤

1.3.3.代码

 2.测试代码


1.词嵌入

定义:指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

注:这个维数通常不定,不同实现算法指定维度都不一样,通常在30~500之间。

如下图所示:

1.1.特点

  • 能够体现出词与词之间的关系
    • 比如说我们用Man - Woman,或者Apple - Orange,都能得到一个向量
  • 能够得到相似词,例如Man - Woman = King - ?
    • ? = Queen

1.2.word2vec介绍

Bengio等人在一系列论文中使用了神经概率语言模型使机器“习得词语的分布式表示。

2013年,谷歌托马斯·米科洛维(Tomas Mikolov)领导的团队发明了一套工具word2vec来进行词嵌入。

Word2Vec 是一种广泛使用的​​词嵌入(Word Embedding)​​技术,由 Google 团队(Tomas Mikolov 等)于 2013 年提出。它通过神经网络模型将单词映射到​​低维稠密向量空间​​,使得语义相似的词在向量空间中距离相近。Word2Vec 是 NLP 领域的基础技术之一,广泛应用于文本分类、机器翻译、推荐系统等任务。

Word2Vec 的核心假设是:​​“具有相似上下文的单词,其语义也相似”​​。它通过训练神经网络,使得模型能够从大量文本中学习单词的分布式表示(Distributed Representation)。

1.​​主要特点​

  • ​稠密向量表示​​:每个单词用一个固定长度的低维向量(如 100~300 维)表示,相比传统的 one-hot 编码更高效。
  • ​语义相似性​​:语义相近的词(如 "king" 和 "queen")在向量空间中距离较近。
  • ​计算高效​​:采用​​负采样(Negative Sampling)​​或​​层次 Softmax(Hierarchical Softmax)​​优化训练速度。

2. Word2Vec 的两种模型​

Word2Vec 包含两种不同的训练方式:

​(1) CBOW(Continuous Bag of Words)​

  • ​目标​​:根据上下文单词预测当前单词。
  • ​适用场景​​:适合小型数据集或高频词。
  • ​示例​​:
    • 输入:["the", "cat", "on", "the"](上下文窗口=4)
    • 输出:预测 "mat"(中心词)

​(2) Skip-Gram​

  • ​目标​​:根据当前单词预测上下文单词。
  • ​适用场景​​:适合大型数据集或低频词,效果通常比 CBOW 更好。
  • ​示例​​:
    • 输入:"mat"(中心词)
    • 输出:预测 ["the", "cat", "on", "the"](上下文窗口=4)
  • skip-gram

算法学习实现:https://www.tensorflow.org/tutorials/representation/word2vec

下载gensim库

pip install gensim

1.3.Word2Vec案例

1.3.1.训练语料

由于语料比较大,就提供了一个下载地址:搜狗搜索引擎 - 上网从搜狗开始

  • 搜狗新闻中文语料(2.7G)
  • 做中文分词处理之后的结果

1.3.2.步骤

  • 1、训练模型

  • 2、测试模型结果

1.3.3.代码

  • 训练模型API
    • from gensim import Word2Vec
    • Word2Vec(LineSentence(inp), size=400, window=5, min_count=5)
      • LineSentence(inp):把word2vec训练模型的磁盘存储文件
      • 转换成所需要的格式,如:[[“sentence1”],[”sentence1”]]
      • size:是每个词的向量维度
      • window:是词向量训练时的上下文扫描窗口大小,窗口为5就是考虑前5个词和后5个词
      • min-count:设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃
      • 方法:
        • inp:分词后的文本
        • save(outp1):保存模型

这里需要传入训练好的分词结果:corpus_seg.txt

训练的代码如下

import sys
import multiprocessingfrom gensim.models import Word2Vec
from gensim.models.word2vec import LineSentenceif __name__ == '__main__':if len(sys.argv) < 3:sys.exit(1)# inp表示语料库(分词),outp:模型inp, outp = sys.argv[1:3]model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())model.save(outp)

运行命令

python trainword2vec.py ./corpus_seg.txt ./model/*

指定好分词的文件以及,保存模型的文件

  • 加载模型测试代码
    • model = gensim.models.Word2Vec.load("*.model")
      • model.most_similar('警察')
      • model.similarity('男人','女人')
      • most_similar(positive=['女人', '丈夫'], negative=['男人'], topn=1)
improt gensim
gensim.models.Word2Vec.load("./model/corpus.model")model.most_similar("警察")Out:
[('警员', 0.6961891651153564),('保安人员', 0.6414757370948792),('警官', 0.6149201989173889),('消防员', 0.6082159876823425),('宪兵', 0.6013336181640625),('保安', 0.5982533693313599),('武警战士', 0.5962344408035278),('公安人员', 0.5880240201950073),('民警', 0.5878666639328003),('刑警', 0.5800305604934692)]model.similarity('男人','女人')
Out: 0.8909852730435042model.most_similar(positive=['女人', '丈夫'], negative=['男人'], topn=1)
Out: [('妻子', 0.7788498997688293)]

 2.测试代码

​步骤​​功能描述​​关键点/注意事项​
​1. 导入库​加载必要的Python库gensim 用于Word2Vec,nltk 用于分词,os 用于路径操作。
​2. 检查NLTK数据​确保punkt分词数据存在,若缺失则自动下载- 使用try-except避免中断。
quiet=True隐藏下载日志。
​3. 定义示例数据​提供待训练的文本句子实际应用中需替换为大规模文本(如从文件读取)。
​4. 分词处理​将句子拆分为单词列表- 优先用word_tokenize处理标点。
- 失败时回退到split()(效果较差)。
​5. 训练Word2Vec​根据分词结果训练词向量模型vector_size=100: 词向量维度。
sg=1: 使用Skip-Gram算法(适合小数据)。
​6. 保存模型​将模型保存到磁盘后续可通过Word2Vec.load("word2vec.model")复用模型。
​7. 测试模型​验证词向量效果(查询词向量和相似词)
from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize
import nltk
import os# 确保下载必要的NLTK数据
try:nltk.data.find('tokenizers/punkt')print("NLTK punkt data already downloaded")
except LookupError:print("Downloading NLTK punkt data...")nltk.download('punkt', quiet=True)# 某些环境可能需要额外下载punkt_tabtry:nltk.download('punkt_tab', quiet=True)except:print("punkt_tab not available, using only punkt")# 示例文本数据
sentences = ["I love natural language processing.","Word2Vec is a popular embedding technique.","Deep learning is changing the world."
]# 分词(带错误回退机制)
try:tokenized_sentences = [word_tokenize(sent.lower()) for sent in sentences]print("Tokenizer succeeded!")
except LookupError as e:print(f"Tokenizer failed: {e}")print("Falling back to simple whitespace tokenizer...")tokenized_sentences = [sent.lower().split() for sent in sentences]# 训练 Word2Vec 模型
model = Word2Vec(sentences=tokenized_sentences,vector_size=100,    # 向量维度window=5,          # 上下文窗口大小min_count=1,       # 忽略低频词sg=1,              # 1=Skip-Gram, 0=CBOWnegative=5,        # 负采样数量epochs=10          # 训练轮次
)# 保存模型
model.save("word2vec.model")
print("Model saved successfully!")# 测试词向量
try:print("Example word vector for 'learning':", model.wv['learning'])print("Most similar to 'processing':", model.wv.most_similar('processing'))
except KeyError as e:print(f"Word not in vocabulary: {e}")
# 加载模型
model = Word2Vec.load("word2vec.model")# 获取单词向量
vector = model.wv["word2vec"]  # 获取 "word2vec" 的向量# 计算相似词
similar_words = model.wv.most_similar("nlp", topn=3)
print(similar_words)  # 输出:[('natural', 0.92), ('language', 0.88), ('processing', 0.85)]

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

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

相关文章

WebRTC 的 ICE candidate 协商

文章目录 前言WebRTC 的 ICE candidate 协商1. 什么是 ICE candidate&#xff1f;2. ICE 协商的流程3.前端使用 ICE candidate 协商代码示例1&#xff09;收集 candidate 并发送2&#xff09;WebSocket 接收 candidate 并添加 4. ICE candidate 的类型5. ICE 协商常见问题6. 关…

卡尔曼滤波介绍

卡尔曼滤波介绍&#x1f4d6; **卡尔曼滤波原理简介**&#x1f511; **核心思想**&#x1f4e6; **卡尔曼滤波的组成**&#x1f50d; **代码分析&#xff08;kalman_filter.py&#xff09;**&#x1f3d7;️ 1. 状态空间定义&#x1f504; 2. 初始化模型矩阵&#x1f680; 3. 核…

递归与循环

文章目录递归TestRecursiveListRemoveNodeTestRecursiveListRemoveNode2循环TestWhileLoopListRemoveNodeTestWhileLoopListRemoveNode2递归 关键理解这几点&#xff1a; 1、求解基本问题 2、将原问题拆分为小问题&#xff0c;直至基本问题&#xff08;难点&#xff09; 3、借…

3D魔方游戏

# 3D魔方游戏 这是一个基于Three.js的3D魔方游戏&#xff0c;支持2到6阶魔方的模拟操作。 ## 功能特点 - 支持2到6阶魔方 - 真实的3D渲染效果 - 鼠标操作控制 - 随机打乱功能 - 提示功能 - 重置功能 ### 安装依赖 bash npm install ### 启动游戏 bash npm start 然…

下载安装 com0com

下载 在 sourceforge 网站下载安装器&#xff1a;下载链接 安装完成后可以在设备管理器中看到默认创建的一对虚拟串口 使用串口调试助手收发 使用串口调试助手分别打开。如下图所示&#xff0c;在端口选择的下拉列表中可以看到刚才在设备管理器中看到的 COM3 和 COM5 分…

C++ 应用软件开发从入门到实战详解

目录 1、引言 2、IDE 开发环境介绍 2.1、Visual Studio 2.2、Qt Creator 3、 C语言特性 3.1、熟悉泛型编程 3.2、了解C/C异常处理 3.3、熟练使用STL容器 3.4、熟悉C11新特性 4、Windows 平台的编程技术与调试技能 4.1、需要掌握的若干编程技术和基础知识 4.2、需…

Python爬虫实战:研究slug相关技术

1. 引言 1.1 研究背景与意义 随着互联网技术的快速发展,网络上的信息量呈爆炸式增长。如何从海量的非结构化数据中提取有价值的信息,成为当前数据科学领域的重要研究方向。网络爬虫作为一种自动化数据采集工具,可以高效地获取网页内容,为数据分析提供丰富的数据来源。 Sl…

人工智能-基础篇-18-什么是RAG(检索增强生成:知识库+向量化技术+大语言模型LLM整合的技术框架)

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合外部知识检索与大语言模型&#xff08;LLM&#xff09;生成能力的技术框架&#xff0c;旨在提升生成式AI在问答、内容创作等任务中的准确性、实时性和领域适应性。 1、核心概念 …

CppCon 2018 学习:What do you mean “thread-safe“

什么是“线程安全”&#xff1f; “线程安全”指的是一个函数、方法或代码块能够在多个线程同时执行时&#xff0c;不会出现意外的交互或破坏共享数据&#xff0c;能够安全地运行。 POSIX 对线程安全的定义很清楚&#xff1a; “一个线程安全的函数可以在多个线程中被安全地并…

热方程初边值问题解法

已知公式&#xff1a; u ( x , t ) ∫ − ∞ ∞ G ( x , y , t ) g ( y ) d y . u(x,t)\int_{-\infty}^{\infty}G(x,y,t)g(y)dy. u(x,t)∫−∞∞​G(x,y,t)g(y)dy. &#xff08;1&#xff09; 其中 G ( x , y , t ) 1 2 k π t e − ( x − y ) 2 4 k t G(x,y,t)\frac{1}{2…

怎样理解:source ~/.bash_profile

场景复现 $ source ~/.bash_profileAnalysis 分析 一句话概括 source ~/.bash_profile “在 当前 终端会话里&#xff0c;立刻执行并加载 ~/.bash_profile 中的所有命令&#xff0c;让其中定义的环境变量、函数、alias 等即时生效&#xff0c;而无需重新登录或开新 Shell。…

搜索问答技术概述:基于知识图谱与MRC的创新应用

目录 一、问答系统应用分析 二、搜索问答技术与系统 &#xff08;一&#xff09;需求和信息分析 问答需求类型 多样的数据源 文本组织形态 &#xff08;二&#xff09;主要问答技术介绍 发展和成熟度分析 重点问答技术基础&#xff1a;KBQA和DeepQA KBQA&#xff08;…

TCP数据的发送和接收

本篇文章结合实验对 TCP 数据传输中的重传机制、滑动窗口以及拥塞控制做简要的分析学习。 重传 实验环境 这里使用两台腾讯云服务器&#xff1a;vm-1&#xff08;172.19.0.3&#xff09;和vm-2&#xff08;172.19.0.6&#xff09;。 超时重传 首先 vm-1 作为服务端启动 nc…

python 保存二维数组到本地

Python中保存二维数组有多种方法&#xff0c;以下是常用的几种方式&#xff1a;1. 使用NumPy&#xff08;推荐&#xff09;import numpy as np# 创建二维数组 arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 保存为.npy文件&#xff08;NumPy专用格式&#xff09; np.save…

LIN总线通讯中从节点波特率同步原理

波特率同步原理&#xff1a;从节点如何通过0x55校准时钟&#xff1f; 一、同步场的核心作用&#xff1a;统一“时间标尺” 在LIN总线中&#xff0c;主节点与从节点各自拥有独立的时钟源&#xff08;如MCU内部RC振荡器&#xff09;&#xff0c;但由于制造工艺差异&#xff0c;…

【Unity笔记02】订阅事件-自动开门

流程 当玩家移动到触发区域的时候&#xff0c;门自动打开 事件系统 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class EventSystem : MonoBehaviour {public static EventSystem Instance { get; private set; }…

控制台字符动画

旋转的立方体 #include <cstdint> #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #include <thread> using namespace std;float angleX .0f; float a…

基于 PyTorch 的猫狗图像分类实战

基于 PyTorch 的猫狗图像分类实战 项目背景简介 深度学习框架 PyTorch 因其动态计算图和灵活易用性&#xff0c;被广泛应用于图像分类等计算机视觉任务。在入门计算机视觉领域时&#xff0c;常常以手写数字识别&#xff08;MNIST&#xff09;作为 “Hello World”&#xff0c…

SwiftUI 7(iOS 26 / iPadOS 26)中玻璃化标签页的全新玩法

&#x1f378; Liquid Glass 登场&#xff1a;界面设计焕然一新 WWDC25 可谓惊喜连连&#xff0c;其中最引人瞩目的变革之一&#xff0c;莫过于苹果推出的全新跨平台设计语言 —— Liquid Glass&#xff08;液态玻璃&#xff09;。这一设计风格涵盖了从按钮到导航栏&#xff0…

PDF处理控件Spire.PDF教程:在Java中读取PDF,提取文本、图片和表格

在数据驱动的现代开发中&#xff0c;高效处理 PDF 文档已成为 Java 开发者不可或缺的核心能力。无论是处理各类发票扫描件、业务分析报告&#xff0c;还是包含丰富图表的技术文档&#xff0c;掌握 Java 版的 PDF 解析技术都将大幅提升数据处理效率&#xff0c;充分释放文档中的…