從代碼學習深度學習 - 詞的相似性和類比任務 PyTorch版

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 加載預訓練詞向量
    • TokenEmbedding 類詳解
    • 預訓練詞向量簡介 (GloVe)
      • 具體含義
      • 總結建議
  • 應用預訓練詞向量
    • 詞相似度
      • knn 函數
      • get_similar_tokens 函數
      • 相似詞查找示例
    • 詞類比
      • get_analogy 函數
      • 詞類比任務示例
  • 總結


前言

詞向量(Word Embeddings)是自然語言處理(NLP)中的基石之一。它們是將詞匯表中的詞語映射到低維連續向量空間的技術,使得語義上相似的詞在向量空間中也彼此接近。實際上,在大型語料庫上預先訓練的詞向量可以應用于下游的自然語言處理任務,這將在后面討論。為了直觀地演示大型語料庫中預訓練詞向量的語義,讓我們將預訓練詞向量應用到詞的相似性和類比任務中。

本篇博客將通過 PyTorch 代碼實例,展示如何加載和使用預訓練的 GloVe 詞向量,并將其應用于查找相似詞和完成詞類比任務。我們將一步步解析代碼,幫助大家理解其背后的原理。

在這里插入圖片描述

完整代碼:下載鏈接

加載預訓練詞向量

首先,我們需要一種方式來加載和管理預訓練的詞向量。下面我們將定義一個 TokenEmbedding 類,它能夠從文本文件中加載詞向量(如 GloVe 或 fastText 格式),并提供方便的接口來查詢詞語對應的向量。

TokenEmbedding 類詳解

這個類將負責以下核心功能:

  1. 從指定的詞向量文件加載詞匯表和對應的向量。
  2. 為詞匯表中的每個詞創建一個索引。
  3. 為不在詞匯表中的“未知”詞(unk)提供一個默認向量(通常是零向量)。
  4. 允許通過詞語列表快速獲取它們對應的向量矩陣。
import torch
import osclass TokenEmbedding:"""GloVe詞嵌入類用于加載和使用預訓練的詞向量(如GloVe、fastText等)"""def __init__(self, embedding_name):"""初始化TokenEmbedding對象參數:embedding_name (str): 嵌入文件名(不含擴展名),例如 'glove.6B.50d'屬性:idx_to_token (list): 索引到詞匯的映射列表,維度為[vocab_size]idx_to_vec (torch.Tensor): 索引到向量的映射矩陣,維度為[vocab_size, embedding_dim]unknown_idx (int): 未知詞匯的索引,默認為0token_to_idx (dict): 詞匯到索引的映射字典"""# 加載嵌入文件,獲取詞匯列表和向量矩陣self.idx_to_token, self.idx_to_vec = self._load_embedding(embedding_name)# 設置未知詞匯的索引為0(對應'<unk>'標記)self.unknown_idx = 0# 創建詞匯到索引的反向映射字典# token_to_idx: dict,鍵為詞匯(str),值為索引(int)self.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}def _load_embedding(self, embedding_name):"""從文件加載預訓練的詞嵌入參數:embedding_name (str): 嵌入文件名返回:idx_to_token (list): 詞匯列表,維度為[vocab_size]idx_to_vec (torch.Tensor): 詞向量矩陣,維度為[vocab_size, embedding_dim]"""# 初始化詞匯列表和向量列表,第一個位置預留給未知詞匯標記idx_to_token = ['<unk>']  # list,存儲所有詞匯,維度為[vocab_size]idx_to_vec = []  # list,臨時存儲向量,后續轉換為tensor# 構建數據文件路徑data_dir = embedding_name + ".txt"# GloVe網站:https://nlp.stanford.edu/projects/glove/# fastText網站:https://fasttext.cc/# 檢查文件是否存在if not os.path.exists(data_dir):print(f"警告:嵌入文件 {data_dir} 不存在。請確保已下載并放置在正確路徑。")print("例如,可以從 https://nlp.stanford.edu/data/glove.6B.zip 下載glove.6B.50d.txt")# 為演示目的,創建一個空的占位符,實際應用中應拋出錯誤或處理# raise FileNotFoundError(f"嵌入文件 {data_dir} 不存在")return ['<unk>'], torch.zeros((1,1)) # 返回一個最小的有效結構# 逐行讀取嵌入文件with open(data_dir, 'r', encoding='utf-8') as f:for line in f:# 移除行尾換行符并按空格分割elems = line.rstrip().split(' ')# 第一個元素是詞匯,其余元素是向量值token = elems[0]  # str,當前詞匯# 將字符串向量值轉換為浮點數列表try:# 嘗試轉換,處理fastText首行可能不符合格式的情況vec_values = [float(elem) for elem in elems[1:]]  # list[float],維度為[embedding_dim]except ValueError:# print(f"跳過格式不正確的行: {line[:50]}...") # 對于fastText,這可能是第一行continue# 跳過標題信息或格式錯誤的行(例如fastText中的首行通常是詞匯數和維度)if len(vec_values) > 1 and token: # 確保有向量值且token不為空idx_to_token.append(token)idx_to_vec.append(vec_values)# 為未知詞匯<unk>創建零向量# 向量維度與其他詞匯向量保持一致embedding_dim = len(idx_to_vec[0]) if idx_to_vec else 50 # 如果列表為空,默認50維unknown_vec = [0.0] 

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

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

相關文章

ubuntu 22.04 安裝部署elk(elasticsearch/logstash/kibana) 7.10.0詳細教程

安裝部署elk7.10.0詳細教程 一、安裝jdk 11環境二、安裝elasticsearch 7.10.0三、安裝kibana 7.10.0四、安裝logstash 7.10.0五、安裝ik7.10.0分詞六、開啟安全功能1. 開啟用戶名密碼登錄2. 開啟es安全加密通信3. 開啟Kibana安全功能 七、注意事項和常見錯誤八、其它操作及命令…

技術文章: 基板的吸水率

PCB基板或覆銅板的吸水率是一個重要的性能指標&#xff0c;它衡量了覆銅板在特定條件下&#xff08;通常是浸水后&#xff09;吸收水分的能力&#xff0c;通常用指定條件下吸水后與吸水前相比&#xff0c;質量增加的百分比來表示。當材料暴露扎起在潮濕空氣中或浸沒在水中時其抵…

九日集訓第三天

目錄 搜索旋轉排序數組 搜索旋轉排序數組|| 尋找旋轉排序中的數組最小值 爬樓梯 斐波那契數 第N個泰波那契數 差的絕對值為K的數對數目 猜數字 拿硬幣 山峰數組的峰頂索引 搜索旋轉排序數組 class Solution { public:int search(vector<int>& nums, int t…

CppCon 2017 學習:folly::Function A Non-copyable Alternative to std::function

你說的內容是關于 C 中 可調用類型&#xff08;Callable Types&#xff09; 的基礎知識&#xff0c;我幫你理清并補充理解。 Callable Types&#xff08;可調用類型&#xff09;簡介 C 中任何可以用 () 括號操作符“調用”的對象&#xff0c;都叫做 可調用類型。典型包括&…

PyTorch 中Tensor常用數據結構(int, list, numpy array等)互相轉換和實戰示例

在 PyTorch 中&#xff0c;tensor 是一種強大且靈活的數據結構&#xff0c;可以與多種 Python 常用數據結構&#xff08;如 int, list, numpy array 等&#xff09;互相轉換。下面是詳細解釋和代碼示例&#xff1a; 1. Tensor ? int / float 轉為 int / float&#xff08;前提…

計算機網絡與數據通信基礎

第一章 計算機網絡概述 1. 計算機網絡的核心概念 1.1 定義 將 地理分散 的、具有 獨立處理能力 的計算機系統&#xff08;主機/Host&#xff09;&#xff0c;通過 傳輸介質 與 網絡設備 互連&#xff0c;在 網絡協議 和 軟件 支持下實現 資源共享 與 數據通信 的系統。 關鍵術…

【統計術語】

文章目錄 基礎概念術語基期與現期增長量與增長率環比與同比 比重術語平均數術語特殊增長術語其他常用術語 基礎概念術語 基期與現期 基期&#xff1a;作為基礎參照的時期&#xff0c;一般指過去的時間 現期&#xff1a;與基期對比的時期&#xff0c;一般指現在的時間 示例&am…

XXE(XML外部實體注入)詳解

目錄 一、XXE漏洞簡介 二、XML詳解 (一) XML文檔結構 1. 文檔聲明 2. XML文檔類型定義&#xff08;DTD&#xff09; 3. XML文檔元素 4. XML文檔示例 三、XXE漏洞類型 四、XXE漏洞挖掘技巧 五、XXE漏洞危害 (一) 文件讀取 (二) 內網探測 1. 端口探測 2. 主機存活探…

深入解析JVM字節碼執行引擎

JVM 字節碼執行引擎。它是 JVM 核心組件之一&#xff0c;負責實際執行加載到內存中的字節碼指令。你可以將它想象成 JVM 的“CPU”。 核心職責&#xff1a; 加載待執行的字節碼&#xff1a; 從方法區&#xff08;元空間&#xff09;獲取已加載類的方法字節碼。創建和管理棧幀…

華為OD機試-MELON的難題-DFS(JAVA 2025A卷)

題意是從N快雨花石中找出最少拿出雨花石的塊數&#xff0c;使得雨花石可以均分&#xff0c;直接使用dfs解決此類組合問題 package com.example.demo.bean;import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner;public class YuHuaStone {public s…

鴻蒙數據庫操作

一、使用關系型數據庫實現數據持久化&#xff0c;需要獲取一個RdbStore&#xff0c;其中包括建庫、建表、升降級等操作。 const STORE_CONFIG: relationalStore.StoreConfig {name: AnyOffice.db, // 數據庫文件名securityLevel: relationalStore.SecurityLevel.S1, // 數據庫…

基于ARM SoC的半導體測試

ARM SoC&#xff08;System on Chip&#xff09; 是一種集成了多個關鍵計算組件的單片系統芯片&#xff0c;廣泛應用于移動設備、嵌入式系統、物聯網&#xff08;IoT&#xff09;和半導體測試設備等領域。它的核心設計理念是“高度集成”&#xff0c;將處理器、內存、外設接口等…

JavaEE->多線程2

目錄 一、線程安全&#xff08;重點&#xff09; 1.線程安全演示 2.線程不安全的原因 1.線程是搶占式執行的&#xff08;執行順序是隨機的&#xff09; 2.多個線程同時修改了同一個變量 3.原子性 4.內存可見性 5.指令重排序&#xff08;有序性&#xff09; 二、解決線…

Flutter TCP通信

啟動TCP服務 Future<void> startServer() async {final server await ServerSocket.bind(InternetAddress.anyIPv4, 12345);print(Server listening on ${server.address}:${server.port});server.listen((Socket socket) {print(Client connected: ${socket.remoteAddr…

flask拆分計劃

兩個啟動鏈接&#xff0c;看日志提示是因為2次啟動&#xff0c;一次是database&#xff0c;一次是xmind2&#xff0c;去掉一次就可以&#xff0c;如何去掉一次&#xff1f; 這里啟動也調用了一次&#xff0c;所以測試環境注釋掉&#xff0c;如下圖&#xff0c;也就調用了一次

【生活】ECMO原理、作用、費用及使用方法

博客目錄 一、ECMO 是什么&#xff1f;二、ECMO 的作用1. 替代肺功能&#xff08;氧合與二氧化碳清除&#xff09;2. 替代心臟功能&#xff08;循環支持&#xff09;3. 為其他治療爭取時間4. 用于心肺復蘇&#xff08;ECPR&#xff09; 三、ECMO 的費用1. 設備使用費2. 耗材費用…

Profinet轉EtherCAT網關模塊怎么用:案例分享

在某制造工廠西門子S7-1200 PLC中&#xff0c;存在一個技術難題&#xff0c;即伺服驅動器與可編程邏輯控制器&#xff08;PLC&#xff09;之間的通訊不兼容問題。具體而言&#xff0c;PLC采用的是PROFINET通訊協議&#xff0c;而伺服EtherCAT協議驅動器則需要EtherCAT協議進行數…

什么是 NLP-NLP基礎知識體系的系統認知

NLP基礎知識體系的系統認知 一、引言 今天的學習內容集中于自然語言處理&#xff08;NLP&#xff09;的基本概念、發展歷程、核心任務及文本表示技術。通過這一學習過程&#xff0c;我對NLP這門學科有了更加系統和深入的認識&#xff0c;并且理解了NLP技術的廣泛應用及其復雜…

數據結構 學習 鏈表 2025年6月14日08點01分

單向鏈表: 線性數據結構 由一系列節點組成 每個節點包含: 數據部分:存儲實際數據 指針部分:儲存指向下一個節點的引用 特點1,每個節點只有一個指向下一個節點的指針 特點2,只能從頭到尾 單向遍歷 特點3,不需要連續的內存空間 特點4,插入和刪除效率高 特點5,隨機訪問 效率低 …

使用 Kubernetes 部署 PHP 留言板應用(含 Redis 架構)

使用 Kubernetes 部署 PHP 留言板應用&#xff08;含 Redis 架構&#xff09; 文章目錄 使用 Kubernetes 部署 PHP 留言板應用&#xff08;含 Redis 架構&#xff09;教程概述技術架構特點 準備工作環境要求 Redis 數據庫部署Redis 主從架構原理創建 Redis 領導者 Deployment部…