ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

第七章 文本表示:概述及向量表示(一)

第七章 文本表示:概述及向量表示(一) 目录前置案例——文本的表示与应用一、概念介绍二、向量空间模型三、主题模型LDA四、词嵌入模型Embding五、 哈希模型--Simhash前置案例——文本的表示与应用在正式介绍各类文本表示方法之前通过一个完整的案例直观感受文本向量化在实际任务中的作用。本案例以新闻标题为数据对象分别演示稀疏表示、稠密表示和哈希表示在文本分类、语义检索、近似去重三个典型场景中的应用。1. 稀疏表示应用概念说明稀疏表示将文本映射为与词表等长的高维向量其中绝大多数元素为 0。TF-IDF 是稀疏表示中最常用的加权方法它能突出对文档有区分度的词汇。代码演示import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline # 1. 定义语料库和标签 corpus [ 人工智能技术取得新突破, 机器学习在医疗领域的应用, 深度学习框架更新发布, 宠物狗日常护理指南, 猫的行为习惯解析, 如何选择适合的猫粮, 金融市场今日走势分析, 股票投资策略分享, 基金定投的优缺点 ] labels [科技, 科技, 科技, 宠物, 宠物, 宠物, 财经, 财经, 财经] # 2. 定义分词函数 def tokenize(text): return .join(jieba.lcut(text)) # 3. 对语料分词 corpus_tokenized [tokenize(doc) for doc in corpus] # 4. 构建模型 model make_pipeline( TfidfVectorizer(token_patternr(?u)\b\w\b), MultinomialNB() ) # 5. 训练 model.fit(corpus_tokenized, labels) # 6. 预测新文本 new_texts [ 人工智能发展迅速, 养猫需要注意什么, 股市今日大涨 ] new_tokenized [tokenize(t) for t in new_texts] predicted model.predict(new_tokenized) for text, label in zip(new_texts, predicted): print(f文本{text} → 预测类别{label})输出示例文本人工智能发展迅速 → 预测类别科技 文本养猫需要注意什么 → 预测类别宠物 文本股市今日大涨 → 预测类别财经2 .稠密表示应用概念说明稠密表示将文本映射为低维、连续的实数向量语义相近的文本在向量空间中距离更近。BERT 是一种上下文感知的预训练模型能生成高质量的句子向量。代码演示import os os.environ[HF_ENDPOINT] https://hf-mirror.com # 国内镜像 from transformers import AutoTokenizer, AutoModel import torch import numpy as np # 准备语料 corpus [ 人工智能技术取得新突破, 机器学习在医疗领域的应用, 深度学习框架更新发布, 宠物狗日常护理指南, 猫的行为习惯解析, 如何选择适合的猫粮, 金融市场今日走势分析, 股票投资策略分享, 基金定投的优缺点 ] # 加载模型 tokenizer AutoTokenizer.from_pretrained(bert-base-chinese) model AutoModel.from_pretrained(bert-base-chinese) model.eval() # 设备选择有GPU则使用GPU device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) def get_sentence_vector(text): inputs tokenizer(text, return_tensorspt, truncationTrue, max_length32) inputs {k: v.to(device) for k, v in inputs.items()} with torch.no_grad(): outputs model(**inputs) cls_vector outputs.last_hidden_state[:, 0, :].squeeze() return cls_vector.cpu().numpy() # 生成语料向量 corpus_vectors np.array([get_sentence_vector(t) for t in corpus]) # 查询 query 如何投资股票 query_vec get_sentence_vector(query) def cosine_similarity(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) sims [cosine_similarity(query_vec, vec) for vec in corpus_vectors] top_indices np.argsort(sims)[::-1][:3] print(f查询{query}) print(最相似的新闻标题) for idx in top_indices: print(f {corpus[idx]}相似度{sims[idx]:.3f})输出示例查询如何投资股票 最相似的新闻标题 股票投资策略分享相似度0.894 基金定投的优缺点相似度0.840 金融市场今日走势分析相似度0.8053. 哈希表示应用概念说明哈希表示将文本映射为固定长度的二进制指纹通过汉明距离衡量相似性。SimHash 是一种局部敏感哈希相似的文本会产生相近的指纹非常适合海量文本的近似去重。本案例演示如何用 SimHash 找出新闻标题中的近似重复项。代码演示import jieba from simhash import Simhash def tokenize(text): return jieba.lcut(text) corpus [ 人工智能技术取得新突破, 人工智能技术获得新突破, # 近似重复 深度学习框架更新发布, 宠物狗日常护理指南, 猫的行为习惯解析, ] hashes [Simhash(tokenize(text)) for text in corpus] # 打印所有距离便于观察 print(所有文本对之间的距离) for i in range(len(corpus)): for j in range(i1, len(corpus)): dist hashes[i].distance(hashes[j]) print(f文本{i} vs 文本{j}: {dist}) # 设定阈值检测近似重复 threshold 11 print(f\n近似重复检测结果汉明距离 ≤ {threshold}) found False for i in range(len(corpus)): for j in range(i1, len(corpus)): dist hashes[i].distance(hashes[j]) if dist threshold: print(f 文本{i}: {corpus[i]}) print(f 文本{j}: {corpus[j]}) print(f 汉明距离: {dist}\n) found True输出示例所有文本对之间的距离 文本0 vs 文本1: 11 文本0 vs 文本2: 33 文本0 vs 文本3: 30 文本0 vs 文本4: 38 文本1 vs 文本2: 36 文本1 vs 文本3: 29 文本1 vs 文本4: 33 文本2 vs 文本3: 41 文本2 vs 文本4: 29 文本3 vs 文本4: 26 近似重复检测结果汉明距离 ≤ 11 文本0: 人工智能技术取得新突破 文本1: 人工智能技术获得新突破 汉明距离: 11一、概念介绍文本表示即文本向量化是将文本转换为数值向量的过程使计算机能够理解和处理自然语言。由于机器无法直接处理文字必须将其转化为数学形式即向量才能进行分析、分类、检索等任务。这一过程的核心是捕捉文本的语义和结构信息并用一组数字来表示。例如句子“我喜欢学习”可能被映射为一个如[0.8, -0.3, 0.5, ...]的高维向量其中每个维度代表某种潜在语义特征。文本表示方法分为稀疏表示和稠密表示具体如下。1.1 稀疏表示Sparse Representation稀疏表示是一种高维、低密度的向量编码方式其特点是绝大多数元素为0只有少数位置有非零值。典型方法词袋模型Bag-of-Words, BOW、TF-IDF。工作原理将文本映射到一个与词表大小相同的向量空间中。若某个词出现在文档中则对应位置置1或加权其余为0。优点可解释性强每个维度对应一个具体词汇便于理解实现简单无需复杂训练过程适合快速原型开发。缺点维度灾难词表可能包含数万甚至数十万个词导致向量极长语义缺失无法捕捉词语间的相似性如“猫”和“狗”在向量空间中正交数据稀疏大部分元素为零存储和计算效率低。例如在一个包含10,000个不同词的语料库中每个文档都被表示为一个10,000维的向量但平均只有几十个位置非零。1.2 稠密表示Dense Representation稠密表示是一种低维、高密度的向量编码方式其特点是向量维度较低且几乎所有元素都为非零的小数值。典型方法Word2Vec、GloVe、FastText。工作原理通过神经网络模型在大规模语料上训练将每个词映射到一个固定长度的实数向量如300维。语义相近的词在向量空间中距离更近。优点语义丰富能捕捉词汇间的语义和语法关系如“国王 - 男人 女人 ≈ 女王”维度低通常为50~300维显著降低计算成本泛化能力强适用于下游任务如文本分类、机器翻译等。缺点可解释性差单个维度无明确语义难以人工解读依赖训练数据向量质量受语料规模和领域影响大。例如Word2Vec通过上下文预测任务学习词向量使得“apple”和“fruit”在向量空间中具有较高的余弦相似度。表7-1 特性对比特性稀疏表示稠密表示向量维度高≈词表大小低50~300非零元素比例极低1%接近100%语义表达能力弱强可解释性高低计算效率低因高维高典型应用机器学习模型如SVM深度学习模型如Transformer上表展示了稀疏表示和稠密表示的特性对比。在实际项目中的选型应基于任务目标、数据特性与系统资源进行权衡按照不同方法特性进行选择。以下是针对不同场景的决策指南1优先选择稀疏表示的场景可解释性要求高如法律文本分析、医疗报告关键词提取等需人工审核的场景。使用TF-IDF或BOW可清晰定位影响结果的具体词汇。数据量小或计算资源受限在低配环境部署时稀疏模型如朴素贝叶斯TF-IDF训练快、无需GPU支持。适合轻量级文本分类、垃圾邮件识别等任务。需要与传统机器学习模型集成稀疏向量天然适配SVM、逻辑回归等线性模型在中小规模数据上表现稳定。典型应用舆情监控中的关键词告警系统、企业级文档检索。2优先选择稠密表示的场景语义理解为核心需求如问答系统、语义搜索、推荐系统中“意图匹配”任务。稠密向量如Sentence-BERT能捕捉“苹果手机”与“iPhone”之间的语义关联。处理未登录词或拼写变体FastText等模型通过子词机制可为罕见词生成合理向量优于稀疏方法的“0-1”断裂表示。深度学习架构下游任务RNN、Transformer等模型依赖连续向量输入稠密嵌入是标准输入格式。典型应用智能客服语义匹配、跨语言检索、个性化内容推荐。二、向量空间模型2.1 VSM原理向量空间模型Vector Space Model, VSM的核心原理是将文本转化为高维空间中的向量通过向量间的几何关系衡量语义相似性。向量空间模型是一种代数模型用于将文本文档表示为标识符的向量。它由Salton团队在20世纪70年代提出用于信息过滤、信息检索、索引和相关性排名是一种最简单的文本稀疏表示方法。2.2.1 模型基本原理VSM将非结构化文本映射到一个共享的多维向量空间中每个词项如“人工智能”“学习”对应向量空间的一个维度即特征。每个文档或查询被表示为一个向量其各维度的值为对应词项的权重。文本之间的相关性通过向量之间的余弦相似度来量化夹角越小内容越相似。例如在一个包含词汇[AI, 学习, 数据]的空间中文档“AI学习”可表示为向量 [0.8, 0.6, 0]其中非零数值代表各词的重要性AI0.8学习0.6零数值说明不包含词汇“数据”。2.2.2 文本表示过程1. 构建词汇表Feature Selection从语料库中提取所有唯一词项形成固定长度的词典。例如原始文本集合[AI很有趣, 深度学习是AI的分支, 我喜欢AI和音乐]分词并去停用词后[AI, 有趣, 深度学习, 分支, 喜欢, 音乐]该词典即定义了向量空间的维度共6维。2. 文本向量化Vectorization使用词袋模型Bag-of-Words忽略词序就有了文本的最简单向量表示如下文档1“AI很有趣” → [1, 1, 0, 0, 0, 0]文档2“深度学习是AI的分支” → [1, 0, 1, 1, 0, 0]文档3“我喜欢AI和音乐” → [1, 0, 0, 0, 1, 1]可见此时向量为稀疏向量大多数维度为0。3. 权重计算Weighting为提升表示质量通常采用 TF-IDF 对词项加权TFTerm Frequency词在文档中的出现频率反映局部重要性。IDFInverse Document Frequency衡量词的稀有程度IDF越高说明该词越能区分文档。TF-IDF TF × IDF使高频且具区分性的词获得更高权重。这一步将原始词频向量转化为加权向量显著提升检索与分类效果。4. 相似度计算Similarity Measurement使用余弦相似度比较向量方向一致性$$\text{similarity}(q, d) \frac{q \cdot d}{|q| \times |d|}$$结果介于0到1之间1表示完全相关0表示无关联。尽管存在高维稀疏、无法捕捉语义等局限VSM因其简洁高效仍是现代信息检索系统的重要组成部分。2.2 TF-IDFTF-IDFTerm Frequency-Inverse Document Frequency是一种用于评估词项在文档中重要性的统计方法其核心原理是通过结合词频TF与逆文档频率IDF来加权词项突出那些在当前文档中高频出现但在整个语料库中低频出现的关键词。词频Term Frequency, TF衡量一个词在文档中的出现频率反映其局部重要性。一个词在当前文档中出现的次数越多说明该词对当前文档越重要。计算公式为TF(单词, 文档) 单词在文档中出现的次数优点简单直观体现词在文档中的显著程度。问题若仅用TF像“的”“是”这类高频虚词会占据主导需通过IDF进行抑制。逆文档频率Inverse Document Frequency, IDF衡量一个词的全局区分能力即该词越稀有其IDF值越高。一个词在整个文档集合中出现的次数越少说明这个词越有区分度越重要。计算公式为IDF(单词) log(文档总数 / (包含该词的文档数 1))IDF的作用有效降低常见词如“用户”“系统”“功能”的权重提升专业术语或关键实体的权重。TF-IDF综合权重将两者相乘得到最终词项权重这个公式的直觉是一个词的重要性与它在当前文档中出现的次数成正比与它在所有文档中出现的次数成反比。高TF-IDF值的词在当前文档中常见 在整体语料中罕见 → 极可能是该文档的关键词。低TF-IDF值的词要么太常见如停用词要么太冷门无意义如拼写错误。TF-IDF的缺陷1.文档长度不敏感一篇1000字的文章出现5次“苹果”和一篇50字的短文出现5次“苹果”TF值相同。但显然短文中的“苹果”密度更高可能更相关。2.TF线性增长问题一个词出现100次并不代表它比出现10次相关100倍。相关性不会随词频无限线性增长应该有上限饱和点。Gensim中的TfidfModel示例Gensim 是一个专注于主题建模和文档相似度计算的库其 TfidfModel 可用于构建轻量级语义匹配系统。代码如下from gensim import corpora, models # 分词后语料 texts [[人工智能, 发展], [机器, 学习], [人工智能, 学习]] # 构建词典与语料 dictionary corpora.Dictionary(texts) corpus [dictionary.doc2bow(text) for text in texts] # 训练TF-IDF模型 tfidf models.TfidfModel(corpus) corpus_tfidf tfidf[corpus] # 查看某文档的TF-IDF权重 for doc in corpus_tfidf: print([[dictionary[id], round(freq, 2)] for id, freq in doc])运行结果如下[[人工智能, np.float64(0.35)], [发展, np.float64(0.94)]] [[学习, np.float64(0.35)], [机器, np.float64(0.94)]] [[人工智能, np.float64(0.71)], [学习, np.float64(0.71)]]2.3 BM25BM25全称是 Best Matching 25是一种用于信息检索的排名函数。它用来计算一个查询Query与一组文档Documents的相关性得分并按照得分从高到低对文档进行排序。简单来说它的核心任务是给定一个用户搜索词如“苹果手机”从海量文档中找出最相关的文档并排名返回。2009年由Robertson等人提出的BM25Best Matching 25算法已经成为现代信息检索领域的基准算法之一。它的前身是1970年代的TF-IDF模型经过概率检索模型Probabilistic Retrieval Model的迭代优化最终形成了这个结合词频饱和性与文档长度归一化的鲁棒性方案。BM25算法基本思想TF-IDF 的改进BM25 通过对文档中的每个词项引入饱和函数saturation function和文档长度因子改进了 TF-IDF 的计算。让算法在衡量词与文档相关性时更加精准。饱和函数在 BM25 中对于词项的出现次数TF引入了一个饱和函数来调整其权重。这是为了防止某个词项在文档中出现次数过多导致权重过大。在文档中某些词可能出现次数过多如果直接按照 TF-IDF 计算这些词的权重会过大可能会掩盖其他重要词的作用。BM25 算法引入饱和函数来调整词项出现次数TF的权重有效避免了某个词项权重过高的问题使得算法能更合理地评估每个词对文档相关性的贡献。文档长度因子BM25 考虑了文档的长度引入了文档长度因子使得文档长度对权重的影响不是线性的。这样可以更好地适应不同长度的文档。不同文档长度差异很大如果不考虑文档长度短文档可能因为词频较低在检索中处于劣势。BM25 引入的文档长度因子使得文档长度对权重的影响不再是简单的线性关系。它会根据文档的平均长度对不同长度文档中的词权重进行调整让算法能更好地适应各种长度的文档提高检索的公平性和准确性。BM25 的优缺点优点非监督学习BM25是一个无监督算法不需要人工标注的相关性数据即可直接使用简单高效。效果卓越在传统关键字匹配的检索任务中效果非常好多年来是学术研究和工业界实践的黄金标准。可解释性强得分由明确的公式计算可以分析每个词对最终得分的贡献易于理解和调试。计算高效可以建立倒排索引进行加速适合大规模文档集合的快速检索。缺点语义鸿沟和所有基于词袋模型的方法一样BM25无法理解语义。例如查询“轿车”无法匹配包含“汽车”但未出现“轿车”的文档。它无法理解同义词、上下位词等语义关系。词汇不匹配对拼写错误、缩写、词形变化等比较敏感。缺乏深层语义理解无法捕捉词语之间复杂的上下文关系。应用示例Python 生态中通常结合 jieba 分词与 rank-bm25 库来实现 BM25 检索利用jieba的分词、去停用词等预处理功能构建完整的BM25应用流程。结合 jieba 与 rank-bm25 的完整示例‌以下是一个使用 ‌jieba 进行文本预处理‌ ‌rank-bm25 实现检索‌ 的典型流程import jieba from rank_bm25 import BM25Okapi # 示例语料 corpus [ 人工智能是未来的科技发展方向, 机器学习属于人工智能的一个分支, 深度学习使用神经网络进行模型训练 ] # 自定义中文停用词可根据需要扩充 stop_words {的, 是, 一个, 了, 进行, 属于, 如何} def preprocess(text): tokens jieba.lcut(text) # 使用 jieba 分词 return [t for t in tokens if t not in stop_words and t.strip()] # 预处理语料 tokenized_corpus [preprocess(doc) for doc in corpus] # 查看分词结果确认是否正确 print(分词结果, tokenized_corpus) # 构建 BM25 模型 bm25 BM25Okapi(tokenized_corpus) # 查询 query 如何训练深度学习模型 tokenized_query preprocess(query) print(查询分词, tokenized_query) # 获取文档得分 doc_scores bm25.get_scores(tokenized_query) print(文档得分:, doc_scores) # 获取最相关文档 top_docs bm25.get_top_n(tokenized_query, corpus, n2) for doc in top_docs: print(匹配文档:, doc)结果如下分词结果 [[人工智能, 未来, 科技, 发展, 方向], [机器, 学习, 人工智能, 分支], [深度, 学习, 使用, 神经网络, 模型, 训练]] 查询分词 [训练, 深度, 学习, 模型] 文档得分: [0. 0.09715618 1.48705413] 匹配文档: 深度学习使用神经网络进行模型训练 匹配文档: 机器学习属于人工智能的一个分支输出效果‌系统会返回与“深度学习”“训练”等关键词最相关的文档即使查询句式不同也能精准匹配。
返回列表