開源模型應用落地-工具使用篇-獲取文本向量(五)

一、前言

? ? 在之前學習的"
開源模型應用落地-工具使用篇"系列文章中,我們已經學會了如何使用向量數據庫。然而,還有一個問題一直未解決,那就是如何處理文本向量。在本文中,我們將繼續深入學習關于向量的知識,特別是如何處理文本向量。


二、術語

2.1、文本向量

? ? 是將文本表示為數值向量的一種方法。文本向量可以捕捉到文本的語義和語法信息,使得我們可以在向量空間中對文本進行比較、計算相似度或應用機器學習等算法進行文本分類、情感分析、機器翻譯等自然語言處理任務。

常見的文本向量表示方法包括:

  • One-Hot向量:將每個單詞表示為一個高維向量,其中只有一個維度為1,其余維度為0。每個單詞都有一個獨特的向量表示。
  • 詞袋模型(Bag-of-Words):將文本表示為單詞的計數向量。每個維度表示一個單詞,向量中的值表示該單詞在文本中出現的次數。
  • TF-IDF向量:根據詞頻-逆文檔頻率(TF-IDF)計算每個單詞在文本中的重要性,并將文本表示為TF-IDF值的向量。
  • 詞嵌入向量:通過將單詞映射到一個低維連續向量空間中,捕捉單詞之間的語義關系。常見的詞嵌入模型包括Word2Vec、GloVe和FastText。
  • 句子向量:將整個句子或文本表示為一個向量。這可以通過對文本中所有詞嵌入向量取平均值或使用更復雜的模型(如循環神經網絡或Transformer)來實現。

2.2、獲取文本向量的方法

  • 基于預訓練模型的詞嵌入:使用預訓練的詞嵌入模型(例如Word2Vec、GloVe或FastText)可以將每個單詞映射到一個向量空間中的固定維度向量。為了獲取整個文本的向量表示,可以簡單地對文本中所有單詞的向量取平均值或加權平均值。
  • 基于深度學習的模型:使用深度學習模型(如循環神經網絡(RNN)或卷積神經網絡(CNN))可以學習文本的表示。這些模型可以將整個文本作為輸入,并輸出一個固定維度的向量表示。例如,在自然語言處理任務(如情感分析或文本分類)中,可以使用RNN或CNN模型對文本進行建模,并使用模型中最后一個隱藏層的輸出作為文本的向量表示。
  • 基于Transformer的模型:Transformer模型,如BERT(Bidirectional Encoder Representations from Transformers),可以學習上下文相關的詞嵌入表示。BERT模型可以將整個文本作為輸入,并為每個單詞生成一個向量表示。為了獲取整個文本的向量表示,可以使用BERT模型中的特定層的輸出,例如CLS(分類)標記的輸出。
  • 使用已訓練的向量表示:有一些已經訓練好的文本向量表示可供使用,如Universal Sentence Encoder(USE)或InferSent。這些模型已經在大規模文本語料庫上進行了訓練,并可以將整個文本映射到一個固定維度的向量空間中。

三、技術實現

3.1、通過開源模型實現

# 下載模型文件,例如qwen模型

def loadTokenizer(model_path):tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)return tokenizerdef getVector(model_path, content):tokenizer = loadTokenizer(model_path)inputs = tokenizer(content, return_tensors='pt')# 設置打印選項,禁用科學計數法torch.set_printoptions(sci_mode=False)return inputs["input_ids"].float().numpy()[0]if __name__ == '__main__':model_path = 'E:\\model\\qwen-7b-chat'input = "今天天氣晴朗,心態正好"vector = getVector(model_path,input)print(vector)

輸出:

#換成baichuan的模型

if __name__ == '__main__':model_path = 'E:\\model\\baichuan2-7B-chat'input = "今天天氣晴朗,心態正好"vector = getVector(model_path,input)print(vector)

輸出:

3.2、通過GPT實現

# 若未安裝openai包,請先執行pip install openai

# 安裝其他依賴包,pip install numpy

def normalize_l2(x):x = np.array(x)if x.ndim == 1:norm = np.linalg.norm(x)if norm == 0:return xreturn x / normelse:norm = np.linalg.norm(x, 2, axis=1, keepdims=True)return np.where(norm == 0, x, x / norm)def getVector(dim,input):client = OpenAI(api_key=API_KEY)response = client.embeddings.create(model="text-embedding-3-small", input=input, encoding_format="float")cut_dim = response.data[0].embedding[:dim]norm_dim = normalize_l2(cut_dim)return norm_dimif __name__ == '__main__':dim = 128input = "今天天氣晴朗,心態正好"vector = getVector(dim,input)print(type(vector))print(vector)

輸出:


四、附帶說明

4.1、from openai import OpenAI報錯

報錯原因是:openai包的版本太低,當前openai版本為0.27.0

解決方案:升級openai包

pip install openai --upgrade

4.2、生成的文本向量需要根據實際情況進行裁剪或補位,例如計算需要256維向量,生成的文本向量不足256維的情況下,需要在尾部添加占位符(通常為0)

4.3、生成的文本向量需要進行預處理(如歸一化)后,才進行計算

4.4、使用GPT,則可以根據需要選擇不同的模型(https://platform.openai.com/docs/guides/embeddings/embedding-models

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

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

相關文章

Redis的哨兵系統

Redis 哨兵(Sentinel)系統是一種用于管理多個 Redis 服務器的系統,其主要目標是提供監控、通知、自動故障轉移和服務發現功能。哨兵系統能夠在 Redis 實例出現問題時自動進行故障轉移,確保系統的高可用性。其工作原理如下&#xf…

常見消息中間件

ActiveMQ 我們先看ActiveMQ。其實一般早些的項目需要引入消息中間件,都是使用的這個MQ,但是現在用的確實不多了,說白了就是有些過時了。我們去它的官網看一看,你會發現官網已經不活躍了,好久才會更新一次。 它的單機吞…

2024年學習的最高薪酬編程語言

2024年學習的最高薪酬編程語言 10. Scala Scala是一種在Java虛擬機(JVM)上運行的函數式編程語言。它通常用于大數據處理、機器學習和后端Web開發。 關于Scala編程語言及其常見用途的要點如下: Scala是一種通用編程語言,運行在J…

mac真的安裝不了vmware嗎 mac如何安裝crossover crossover序列號從哪里買 購買正版渠道

有些用戶可能想在mac上運行一些只能在windows上運行的軟件,比如游戲、專業軟件等。這時候,就需要用到虛擬機技術,也就是在mac上安裝一個可以模擬其他操作系統的軟件,比如vmware或者crossover。那么,mac真的安裝不了vmw…

2024年華為OD機試真題-貪心歌手-Python-OD統一考試(C卷)

題目描述: 一個歌手準備從A城去B城參加演出。 1) 按照合同,他必須在T天內趕到。 3) 歌手不能往回走。 4) 每兩座城市之間需要的天數都可以提前獲知。 5) 歌手在每座城市都可以在路邊賣唱賺錢。經過調…

【前端素材】推薦優質后臺管理系統Xoric平臺模板(附源碼)

一、需求分析 當我們從多個層次來詳細分析后臺管理系統時,可以將其功能和定義進一步細分,以便更好地理解其在不同方面的作用和實際運作。 1. 功能層次 a. 用戶管理功能: 用戶注冊和登錄:管理用戶賬戶的注冊和登錄過程。權限管…

K8S故障處理指南:網絡問題排查思路

1. 前言 對于私有化環境,客戶的網絡架構,使用的云平臺存在著各種差異,K8S網絡可能會出現各種問題,此文著重講解遇到此種問題的排查方法和思路,不會涉及相關網絡底層技術描述. 環境說明 由于我們的k8s網絡組件默認使…

5.網絡游戲逆向分析與漏洞攻防-游戲網絡架構逆向分析-測試需求與需求拆解

內容參考于:易道云信息技術研究院VIP課 上一個內容:模擬游戲登陸器啟動游戲并且完成注入 首先正常分析軟件程序有沒有漏洞,需要通過它的操作侵入,比如買東西,就通過買東西的按鈕它背后有源代碼就看源代碼&#xff0c…

TypeScript學習筆記-基礎

一、type 和 interface type和 interface的區別:TypeScript 中文網: 文檔 - 日常類型 type類型別名和interface接口非常相似,在很多情況下可以在它們之間自由選擇。interface 的幾乎所有功能都在 type 中可用,主要區別在于無法重新打開類型…

【PythonGIS】基于Python融合矢量數據(多面合一)

之前發過使用批量合并矢量數據的文章:【Python&GIS】基于Python批量合并矢量數據,正好前段時間有需求把矢量數據進行融合,然后就編了一段融合矢量數據的代碼。今天就和大家分享一下如何使用Python對矢量數據實現融合的操作。 1.定義 首先…

基于Embedding召回和DSSM雙塔模型

文章目錄 基于Embedding召回介紹基于Embedding召回算法分類I2I召回U2I召回 DSSM模型DSSM雙塔模型層次 基于Embedding召回介紹 基于embedding的召回是從內容文本信息和用戶查詢的角度出發,利用預訓練的詞向量模型或深度學習模型,將文本信息轉換成向量進行…

三、創建腳手架和腳手架分析

三、創建腳手架 一、環境準備 1、安裝node.js **下載地址:**https://nodejs.org/zh-cn/界面展示 2、檢查node.js版本 查看版本的兩種方式 node -vnode -version 出現版本號則說明安裝成功(最新的以官網為準) 3、為了提高我們的效率&…

深度學習從入門到不想放棄-7

上一章的內容 深度學習從入門到不想放棄-6 (qq.com) 今天講的也算基礎(這個系列后來我一尋思,全是基礎 ),但是可能要著重說下,今天講前向計算和反向傳播,在哪兒它都永遠是核心,不管面對什么模型 前向計算: 有的叫也叫正向傳播,正向計算的,有的直接把前向的方法梯度下…

祖龍娛樂 x Incredibuild

關于祖龍娛樂 祖龍娛樂有限公司(下文簡稱“祖龍娛樂”)是一家總部位于北京的移動游戲開發公司,成立于 2014 年,擁有成功的大型多人在線角色扮演游戲移動游戲組合,如《六龍爭霸》、《夢幻誅仙》和《萬王之王 3D》。公司…

微信小程序 ---- 慕尚花坊 項目初始化

目錄 項目介紹 01. 項目概述 02. 項目演示 03. 項目技術棧 04. 接口文檔 申請開發權限 項目初始化 01. 創建項目與項目初始化 02. 自定義構建 npm 集成Sass 03. 集成項目頁面文件 04. VsCode 開發小程序項目 項目介紹 01. 項目概述 [慕尚花坊] 是一款 同城鮮花訂購…

Context Capture無法量測連接點,Survey提示Read only只讀模式

Context Capture無法量測連接點,Surveys提示Read only只讀模式 出現這個問題一般是因為當前block已經完成三維重建,所以無法再編輯稀疏重建(空三)結果。只能把當前block復制一份,在復制的block上量測新的連接點。如下…

Netty中的Arena是什么以及LT和ET

Arena是什么 在Netty中,Arena是一種內存分配器(Memory Allocator)的概念。Arena的主要目的是提高內存分配和釋放的效率,減少碎片化,從而提高系統性能。 具體而言,Netyy中的Arena主要用于分配和管理ByteBuf對象的內存,ByteBuf是Ne…

分班問題 、幼兒園分班(C語言)

題目 幼兒園兩個班的小朋友排隊時混在了一起,每個小朋友都知道自己跟前面一個小朋友是不是同班,請你幫忙把同班的小朋友找出來 小朋友的編號為整數,與前面一個小朋友同班用Y表示,不同班用N表示 輸入 輸入為空格分開的小朋友編號…

PowerDesigner 安裝

PowerDesigner 安裝漢化破解使用過程 - 淪陷 - 博客園 (cnblogs.com)https://www.cnblogs.com/huangting/p/12654057.html

不要浪費

解法&#xff1a; 記錄一下tle的代碼 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \n bool check(vector<int>& a, int l,int k) {int sum 0;for (int i 0; i < a.size() && l…