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