pytorch實現基于Word2Vec的詞嵌入

PyTorch 實現 Word2Vec(Skip-gram 模型) 的完整代碼,使用 中文語料 進行訓練,包括數據預處理、模型定義、訓練和測試


1. 主要特點

支持中文數據,基于 jieba 進行分詞
使用 Skip-gram 進行訓練,適用于小數據集
支持負采樣,提升訓練效率
使用 cosine similarity 計算相似單詞

完整代碼:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import random
import jieba
from collections import Counter
from sklearn.metrics.pairwise import cosine_similarity# ========== 1. 數據預處理 ==========
corpus = ["我們 喜歡 深度 學習","自然 語言 處理 是 有趣 的","人工智能 改變 了 世界","深度 學習 是 人工智能 的 重要 組成部分"
]# 超參數
window_size = 2      # 窗口大小
embedding_dim = 10   # 詞向量維度
num_epochs = 100     # 訓練輪數
learning_rate = 0.01 # 學習率
batch_size = 4       # 批大小
neg_samples = 5      # 負采樣個數# 分詞 & 構建詞匯表
tokenized_corpus = [list(jieba.cut(sentence)) for sentence in corpus]
vocab = set(word for sentence in tokenized_corpus for word in sentence)
word2idx = {word: idx for idx, word in enumerate(vocab)}
idx2word = {idx: word for word, idx in word2idx.items()}# 統計詞頻
word_counts = Counter([word for sentence in tokenized_corpus for word in sentence])
total_words = sum(word_counts.values())# 計算負采樣概率
word_freqs = {word: count / total_words for word, count in word_counts.items()}
word_powers = {word: freq ** 0.75 for word, freq in word_freqs.items()}
Z = sum(word_powers.values())
word_distribution = {word: prob / Z for word, prob in word_powers.items()}# 負采樣函數
def negative_sampling(positive_word, num_samples=5):words = list(word_distribution.keys())probabilities = list(word_distribution.values())negatives = []while len(negatives) < num_samples:neg = np.random.choice(words, p=probabilities)if neg != positive_word:negatives.append(neg)return negatives# 生成 Skip-gram 訓練數據
data = []
for sentence in tokenized_corpus:indices = [word2idx[word] for word in sentence]for center_idx in range(len(indices)):center_word = indices[center_idx]for offset in range(-window_size, window_size + 1):context_idx = center_idx + offsetif 0 <= context_idx < len(indices) and context_idx != center_idx:context_word = indices[context_idx]data.append((center_word, context_word))# 轉換為 PyTorch 張量
data = [(torch.tensor(center), torch.tensor(context)) for center, context in data]# ========== 2. 定義 Word2Vec (Skip-gram) 模型 ==========
class Word2Vec(nn.Module):def __init__(self, vocab_size, embedding_dim):super(Word2Vec, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.output_layer = nn.Linear(embedding_dim, vocab_size)def forward(self, center_word):embed = self.embedding(center_word)  # 獲取中心詞向量out = self.output_layer(embed)       # 計算詞分布return out# 初始化模型
model = Word2Vec(len(vocab), embedding_dim)# ========== 3. 訓練 Word2Vec ==========
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)for epoch in range(num_epochs):total_loss = 0random.shuffle(data)  # 每輪打亂數據for center_word, context_word in data:optimizer.zero_grad()output = model(center_word.unsqueeze(0))  # 預測詞分布loss = criterion(output, context_word.unsqueeze(0))  # 計算損失loss.backward()optimizer.step()total_loss += loss.item()if (epoch + 1) % 10 == 0:print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss:.4f}")# ========== 4. 測試詞向量 ==========
word_vectors = model.embedding.weight.data.numpy()# 計算單詞相似度
def most_similar(word, top_n=3):if word not in word2idx:return "單詞不在詞匯表中"word_vec = word_vectors[word2idx[word]].reshape(1, -1)similarities = cosine_similarity(word_vec, word_vectors)[0]# 獲取相似度最高的 top_n 個單詞(排除自身)similar_idx = similarities.argsort()[::-1][1:top_n+1]return [(idx2word[idx], similarities[idx]) for idx in similar_idx]# 測試相似詞
test_words = ["深度", "學習", "人工智能"]
for word in test_words:print(f"【{word}】的相似單詞:", most_similar(word))

數據預處理
  • 使用 jieba.cut() 進行分詞
  • 創建 word2idxidx2word
  • 使用滑動窗口生成 (中心詞, 上下文詞) 訓練樣本
  • 實現 negative_sampling() 提高訓練效率
模型
  • Embedding 學習詞向量
  • Linear 計算單詞的概率分布
  • CrossEntropyLoss 計算目標詞與預測詞的匹配度
  • 使用 Adam 進行梯度更新
計算詞相似度
  • 使用 cosine_similarity 計算詞向量相似度
  • 找出 top_n 個最相似的單詞

?5. 可優化點

?使用更大的中文語料庫(如 THUCNews
?使用 t-SNE 進行詞向量可視化
增加負采樣,提升模型訓練效率

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894445.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】_鏈表經典算法OJ(力扣/牛客第二彈)

目錄 1. 題目1&#xff1a;返回倒數第k個節點 1.1 題目鏈接及描述 1.2 解題思路 1.3 程序 2. 題目2&#xff1a;鏈表的回文結構 2.1 題目鏈接及描述 2.2 解題思路 2.3 程序 1. 題目1&#xff1a;返回倒數第k個節點 1.1 題目鏈接及描述 題目鏈接&#xff1a; 面試題 …

pytorch基于 Transformer 預訓練模型的方法實現詞嵌入(tiansz/bert-base-chinese)

以下是一個完整的詞嵌入&#xff08;Word Embedding&#xff09;示例代碼&#xff0c;使用 modelscope 下載 tiansz/bert-base-chinese 模型&#xff0c;并通過 transformers 加載模型&#xff0c;獲取中文句子的詞嵌入。 from modelscope.hub.snapshot_download import snaps…

爬蟲基礎之爬取某站視頻

目標網址:為了1/4螺口買小米SU7&#xff0c;開了一個月&#xff0c;它值嗎&#xff1f;_嗶哩嗶哩_bilibili 本案例所使用到的模塊 requests (發送HTTP請求)subprocess(執行系統命令)re (正則表達式操作)json (處理JSON數據) 需求分析: 視頻的名稱 F12 打開開發者工具 or 右擊…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最強 AI 工具

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux 目錄 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下載 Ollama&#x1f98b; 選擇模型&#x1f98b; 運行模型&#x1f98b; 使用 && 測試 二&#xff1a;&#x1f525; Chat…

【linux網絡(5)】傳輸層協議詳解(下)

目錄 前言1. TCP的超時重傳機制2. TCP的流量控制機制3. TCP的滑動窗口機制4. TCP的擁塞控制機制5. TCP的延遲應答機制6. TCP的捎帶應答機制7. 總結以及思考 前言 強烈建議先看傳輸層協議詳解(上)后再看這篇文章. 上一篇文章講到TCP協議為了保證可靠性而做的一些策略, 這篇文章…

DeepSeek 遭 DDoS 攻擊背后:DDoS 攻擊的 “千層套路” 與安全防御 “金鐘罩”

當算力博弈升級為網絡戰爭&#xff1a;拆解DDoS攻擊背后的技術攻防戰——從DeepSeek遇襲看全球網絡安全新趨勢 在數字化浪潮席卷全球的當下&#xff0c;網絡已然成為人類社會運轉的關鍵基礎設施&#xff0c;深刻融入經濟、生活、政務等各個領域。從金融交易的實時清算&#xf…

二、CSS筆記

(一)css概述 1、定義 CSS是Cascading Style Sheets的簡稱,中文稱為層疊樣式表,用來控制網頁數據的表現,可以使網頁的表現與數據內容分離。 2、要點 怎么找到標簽怎么操作標簽對象(element) 3、css的四種引入方式 3.1 行內式 在標簽的style屬性中設定CSS樣式。這種方…

第三篇:模型壓縮與量化技術——DeepSeek如何在邊緣側突破“小而強”的算力困局

——從算法到芯片的全棧式優化實踐 隨著AI應用向移動終端與物聯網設備滲透&#xff0c;模型輕量化成為行業核心挑戰。DeepSeek通過自研的“算法-編譯-硬件”協同優化體系&#xff0c;在保持模型性能的前提下&#xff0c;實現參數量與能耗的指數級壓縮。本文從技術原理、工程實…

C++編程語言:抽象機制:泛型編程(Bjarne Stroustrup)

泛型編程(Generic Programming) 目錄 24.1 引言(Introduction) 24.2 算法和(通用性的)提升(Algorithms and Lifting) 24.3 概念(此指模板參數的插件)(Concepts) 24.3.1 發現插件集(Discovering a Concept) 24.3.2 概念與約束(Concepts and Constraints) 24.4 具體化…

DeepSeek-R1本地部署實踐

一、下載安裝 --Ollama Ollama是一個開源的 LLM&#xff08;大型語言模型&#xff09;服務工具&#xff0c;用于簡化在本地運行大語言模型&#xff0c;降低使用大語言模型的門檻&#xff0c;使得大模型的開發者、研究人員和愛好者能夠在本地環境快速實驗、管理和部署最新大語言…

AI技術路線(marked)

人工智能&#xff08;AI&#xff09;是一個非常廣泛且充滿潛力的領域&#xff0c;它涉及了讓計算機能夠執行通常需要人類智能的任務&#xff0c;比如感知、推理、學習、決策等。人工智能的應用已經滲透到各行各業&#xff0c;從自動駕駛到醫療診斷&#xff0c;再到推薦系統和自…

【leetcode詳解】T598 區間加法

598. 區間加法 II - 力扣&#xff08;LeetCode&#xff09; 思路分析 核心在于將問題轉化&#xff0c; 題目不是要求最大整數本身&#xff0c;而是要求解最大整數的個數 結合矩陣元素的增加原理&#xff0c;我們將抽象問題轉為可操作的方法&#xff0c;其實就是再找每組ops中…

【最后203篇系列】004 -Smarklink

說明 這個用來替代nginx。 最初是希望用nginx進行故障檢測和負載均衡&#xff0c;花了很多時間&#xff0c;大致的結論是&#xff1a;nginx可以實現&#xff0c;但是是在商業版里。非得要找替代肯定可以搞出來&#xff0c;但是太麻煩了&#xff08;即使是nginx本身的配置也很煩…

完全卸載mysql server步驟

1. 在控制面板中卸載mysql 2. 打開注冊表&#xff0c;運行regedit, 刪除mysql信息 HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->EventLog->Application->Mysql HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->Mysql …

1. 【.NET Aspire 從入門到實戰】--理論入門與環境搭建--引言

在當前軟件開發領域&#xff0c;云原生和微服務架構已經成為主流趨勢&#xff0c;傳統的單體應用正逐步向分布式系統轉型。隨著業務需求的不斷變化與用戶規模的迅速擴大&#xff0c;如何在保證高可用、高擴展性的同時&#xff0c;還能提高開發效率與降低維護成本&#xff0c;成…

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群 簡介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系統安裝部署 Kubernetes v1.29.13 集群 1 環境準備1.1 集群IP規劃1.2 初始化步驟&#xff08;各個節點都需執行&#xff09;1.2.1 主機名與IP地址解析1.…

基于SpringBoot的新聞資訊系統的設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

每日一題——包含min函數的棧

包含min函數的棧 題目數據范圍&#xff1a;示例C語言代碼實現解釋1. push(value)2. pop()3. top()4. min() 總結大小堆 題目 定義棧的數據結構&#xff0c;請在該類型中實現一個能夠得到棧中所含最小元素的 min 函數&#xff0c;輸入操作時保證 pop、top 和 min 函數操作時&am…

RDP協議詳解

以下內容包含對 RDP&#xff08;Remote Desktop Protocol&#xff0c;遠程桌面協議&#xff09;及其開源實現 FreeRDP 的較為系統、深入的講解&#xff0c;涵蓋協議概要、歷史沿革、核心原理、安全機制、安裝與使用方法、擴展與未來發展趨勢等方面&#xff0c; --- ## 一、引…

【Linux系統】計算機世界的基石:馮諾依曼架構與操作系統設計

文章目錄 一.馮諾依曼體系結構1.1 為什么體系結構中要存在內存&#xff1f;1.2 馮諾依曼瓶頸 二.操作系統2.1 設計目的2.2 系統調用與庫函數 一.馮諾依曼體系結構 馮諾依曼體系結構&#xff08;Von Neumann Architecture&#xff09;是計算機的基本設計理念之一&#xff0c;由…