对文档进行向量化,是自然语言处理(NLP)的基础步骤,向量化就是将文本数据转换为机器学习模型可以理解的向量数值形式,在当前大模型的RAG(Retrieval-Augmented Generation)应用中,文档向量化是检索增强生成过程的关键步骤,它允许模型通过检索相关信息来增强其生成能力。以下是几种常见的文档向量化技术。
1. 词袋模型(Bag of Words, BoW)
词袋模型以文档中出现的词汇频率来表示文档的语义,这种文本表示方法很简单,但其忽略了词汇在文档中的顺序和上下文,对文档的语义表示很粗略。
实现方法:
(1)构建一个词汇表,包含文档集中的所有词汇,对词汇编号。
(2)对于每个文档,创建一个向量,其中每个向量元素对应词汇表中的一个词汇,元素的值为该词汇在文档中出现的次数或一个二进制值(one-hot编码)。
示例:
from sklearn.feature_extraction.text import CountVectorizer
documents = [ "The quick brown fox jumps over the lazy dog", "Lorem ipsum dolor sit amet, consectetur adipiscing elit" ]
CountVectorizer vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
print(vectorizer.get_feature_names_out())
2. TF-IDF(Term Frequency-Inverse Document Frequency)
TF-IDF是一种更高级的文本表示方法,是词袋模型的改进,它不仅考虑了词频,还考虑了词在文档集合中的稀有性。
实现方法:
(1)TF:词频,即一个词在文档中出现的频率。
(2)IDF:逆文档频率,衡量一个词在所有文档中的稀有性,计算公式为log(文档总数 / 包含该词的文档数)。
示例:
from sklearn.feature_extraction.text import TfidfVectorizer
documents = [ "The quick brown fox jumps over the lazy dog", "Lorem ipsum dolor sit amet, consectetur adipiscing elit" ]
TfidfVectorizer vectorizer = TfidfVectorizer()
TF-IDF向量 X = vectorizer.fit_transform(documents)
print(vectorizer.get_feature_names_out())
3.词嵌入(Word Embeddings)
词嵌入通过将每个词映射到一个高维空间中的向量来捕捉词的语义信息。
实现方法:
(1)使用预训练的词嵌入模型,如Word2Vec、GloVe或FastText,将每个词转换为固定大小的向量。
(2)将文档中的每个词的向量相加或取平均,以获得文档的向量表示。
示例:
import numpy as np
from gensim.models import Word2Vec
# 假设我们已经有了一个预训练的Word2Vec模型
model = Word2Vec.load('path_to_pretrained_model')
documents = [ "The quick brown fox jumps over the lazy dog", "Lorem ipsum dolor sit amet, consectetur adipiscing elit" ]
doc_vectors = []
for doc in documents:
doc_vector = np.mean([model.wv[word] for word in doc.split() if word in model.wv], axis=0)
doc_vectors.append(doc_vector)
4. 句子嵌入(Sentence Embeddings)
句子嵌入是将整个句子或文档转换为单个向量。
实现方法:
(1)使用预训练的句子嵌入模型,如BERT、GPT或Sentence-BERT。
(2)将句子作为输入,模型输出一个固定大小的向量。
示例:
from sentence_transformers import SentenceTransformer
SentenceTransformer model = SentenceTransformer('path_to_pretrained_model')
sentences = [ "The quick brown fox jumps over the lazy dog", "Lorem ipsum dolor sit amet, consectetur adipiscing elit" ]
sentence_vectors = model.encode(sentences)
5. 基于主题的向量化(Topic-based Vectorization)
基于主题的向量化是通过主题建模技术,如LDA(Latent Dirichlet Allocation),将文档表示为不同主题的分布。
实现方法:
(1)使用主题建模算法识别文档集合中的主题。
(2)将每个文档表示为一个主题分布向量。
示例:
from sklearn.decomposition import LatentDirichletAllocation
documents = [ "The quick brown fox jumps over the lazy dog", "Lorem ipsum dolor sit amet, consectetur adipiscing elit" ]
vectorizer = CountVectorizer() X = vectorizer.fit_transform(documents)
# 初始化LDA模型
lda = LatentDirichletAllocation(n_components=2, random_state=0)
da.fit(X)
# 获取文档的主题分布
doc_topic_dist = lda.transform(X)
文档向量化不同的方法适用于不同的场景,BoW和TF-IDF是基础方法,适用于快速实现和简单任务。词嵌入和句子嵌入能够捕捉更丰富的语义信息,适用于需要理解词义和句子结构的复杂任务。基于主题的向量化则适用于需要理解文档主题和结构的场景。在大模型的RAG应用中,可以根据具体任务的需求选择合适的向量化技术。
