【重生之我在双体 RAG——学习日志】

张开发
2026/4/20 10:14:44 15 分钟阅读

分享文章

【重生之我在双体 RAG——学习日志】
相亲匹配度测试看看他们有多相似方法1数相同的字# 就像数两个句子有多少个相同的字 sent1 身高188cm性格温柔 sent2 身高187cm性格温和 # 数相同的字身、高、性、格、温 → 5个相同字 # 总字数sent1有8个字sent2有8个字 # 相似度 5 ÷ 8 0.625问题太粗糙了188cm和187cm只差1个数字但被当成完全不同。方法2分词后比较# 先把句子切成词语就像切菜 sent1_words [身高, 188cm, 性格, 温柔] sent2_words [身高, 187cm, 性格, 温和] # 比较相同的词语身高、性格 → 2个相同 # 相似度 2 ÷ 4 0.5问题还是不够智能温柔和温和意思相近但被当成不同。高级版大学生的智能方法步骤1智能分词import jieba sent1 身高188cm性格温柔笑起来有梨涡 sent2 身高187cm性格温和笑起来有浅梨涡 # jieba就像智能菜刀能识别专业词汇 cut1 jieba.lcut(sent1) # → [身高, 188cm, , 性格, 温柔, , 笑起来, 有, 梨涡] cut2 jieba.lcut(sent2) # → [身高, 187cm, , 性格, 温和, , 笑起来, 有, 浅, 梨涡]步骤2TF-IDF向量化把文字变成数学坐标想象把每个词变成一个维度就像三维空间的XYZ坐标from sklearn.feature_extraction.text import TfidfVectorizer # 创建词语重要性计算器 vectorizer TfidfVectorizer(ngram_range(1, 3)) # 把句子变成数学向量 X_tfidf vectorizer.fit_transform([sent1_cut, sent2_cut])ngram_range(1, 3) 是什么意思1-gram单个词 → 身高、188cm、性格2-gram两个词组合 → 身高188cm、性格温柔3-gram三个词组合 → 笑起来有梨涡步骤3余弦相似度计算夹角from sklearn.metrics.pairwise import cosine_similarity # 计算两个向量的夹角余弦值 similarity cosine_similarity(X_tfidf[0:1], X_tfidf[1:2])[0][0]形象理解把两个句子想象成空间中的两个箭头如果箭头方向完全一致 → 夹角0° → cos(0°)1 → 100%相似如果箭头垂直 → 夹角90° → cos(90°)0 → 0%相似不同品牌的手机做功能相似度测评方法1最简单的词语匹配# 就像数两个手机描述有多少相同的词 手机A 拍照清晰 电池耐用 屏幕大 手机B 拍照好看 电池持久 屏幕清晰 # 数相同的词拍照、电池、屏幕 → 3个相同 # 相似度 3 ÷ 6 0.5问题太死板清晰和好看意思相近但被当成不同。无法理解语义方法2词频模型from sklearn.feature_extraction.text import CountVectorizer # 创建词频计数器 vectorizer CountVectorizer() # 把文字变成数字每个词出现几次 X vectorizer.fit_transform([手机A, 手机B]) # 手机A向量[拍照1, 清晰1, 电池1, 耐用1, 屏幕1] # 手机B向量[拍照1, 好看1, 电池1, 持久1, 屏幕1, 清晰1]高级版用了4种不同的智能尺子来测量相似度尺子1词频向量基础尺# 就像用普通尺子量长度 vectorizer_bow CountVectorizer() X_bow vectorizer_bow.fit_transform(texts)尺子2TF-IDF向量智能尺# 升级为带重要性权重的尺子 vectorizer_tfidf TfidfVectorizer() X_tfidf vectorizer_tfidf.fit_transform(texts)TF-IDF是什么TF词频一个词在文档中出现的次数IDF逆文档频率这个词在所有文档中的稀有程度结果常见词如手机权重低特色词如徕卡镜头权重高尺子3Word2Vec词向量语义尺# 最厉害的尺子能理解词语的真正含义 model Word2Vec(sentencescorpus, vector_size100, window5, min_count1)Word2Vec的神奇之处把每个词变成100维的数学向量国王 - 男人 女人 女王真的能算出来耐用和持久的向量会很接近尺子4Doc2Vec文档向量整体尺# 把整个句子变成一个向量 model_d2v Doc2Vec(documentstagged_data, vector_size100, window5, min_count1)四种方法的直观对比想象我们要比较两款手机的相似度手机A徕卡镜头 超长续航 120Hz刷新率手机B蔡司镜头 电池耐用 高刷新屏幕方法对比结果方法工作原理相似度结果形象比喻词频向量数相同的词0.3小学生数数TF-IDF加权词频0.5初中生加权计算Word2Vec语义向量0.7大学生理解意思Doc2Vec文档向量0.8研究生整体把握为什么结果不同词频向量只看到镜头相同其他词都不同 → 低相似度TF-IDF发现徕卡和蔡司都是相机品牌 → 稍高相似度Word2Vec理解续航≈耐用120Hz≈高刷新 → 更高相似度Doc2Vec整体把握句子含义 → 最高相似度代码整体架构模块1数据准备与预处理# 1. 读取文本 with open(three_kingdoms.txt, r, encodingutf-8) as f: full_text f.read() # 2. 预处理分句、分词、清洗 raw_sentences re.split(r[。], full_text) corpus [] for raw in raw_sentences: if len(raw) 10: continue # 分词 清洗 words jieba.lcut(raw) cleaned_words [w for w in words if w.strip() and w not in [, 。, , , , ]] corpus.append(cleaned_words)功能详解文本读取读取 three_kingdoms.txt 全文分句处理按标点符号将长文本切成句子智能分词使用jieba将中文句子切成词语数据清洗去除标点符号和空白字符处理效果示例原始句子却说天下大势分久必合合久必分。 → 分词[却说, 天下, 大势, , 分久必合, , 合久必分, 。] → 清洗后[却说, 天下, 大势, 分久必合, 合久必分]模块2Word2Vec模型训练# 3. 训练Word2Vec模型 model Word2Vec( sentencescorpus, # 训练语料 vector_size100, # 词向量维度 window5, # 上下文窗口大小 min_count1, # 词语最低出现次数 workers4, # 训练线程数 sg1 # 使用Skip-gram算法 )参数详解vector_size100每个词用100维向量表示100个特征window5考虑每个词前后5个邻居词sg1使用Skip-gram算法更适合小数据集训练原理让模型学习给定一个词预测周围词的任务训练过程形象理解句子曹操 率领 大军 进攻 荆州 学习任务 - 输入曹操 → 预测率领正确 - 输入曹操 → 预测进攻部分正确 - 输入曹操 → 预测苹果错误 通过大量这样的练习模型学会词语的语义关系模块3词向量分析与应用# 4. 词向量基本操作 # 获取词向量 caocao_vector model.wv[曹操] liubei_vector model.wv[刘备] # 计算词语相似度 similarity model.wv.similarity(曹操, 刘备) print(f曹操与刘备的相似度{round(similarity, 4)}) # 查找相似词 similar_words model.wv.most_similar(曹操, topn5) print(与曹操最相似的词, similar_words)功能详解向量获取将词语转换为数学向量相似度计算量化两个词的语义接近程度相似词查找找到语义相近的词语运行结果示例曹操与刘备的相似度0.7234 与曹操最相似的词[(曹孟德, 0.89), (魏王, 0.85), (孟德, 0.82), (曹丞相, 0.78), (曹公, 0.75)]模块4人物关系向量分析# 5. 人物描述向量化与比较 character_descriptions { 曹操: 雄才大略挟天子以令诸侯魏国奠基人, 刘备: 仁德爱民深得人心蜀汉开国皇帝, 孙权: 坐拥江东基业稳固吴国君主, 诸葛亮: 神机妙算鞠躬尽瘁蜀汉丞相, 周瑜: 雅量高致但气量狭小东吴大都督 } # 将人物描述转换为向量 def get_description_vector(desc_text): words jieba.lcut(desc_text) word_vectors [] for word in words: if word in model.wv: word_vectors.append(model.wv[word]) if word_vectors: return np.mean(word_vectors, axis0) return None # 比较所有人物描述 desc_vectors {} for name, desc in character_descriptions.items(): vec get_description_vector(desc) if vec is not None: desc_vectors[name] vec代码详解短语级向量化将整个人物描述转换为一个综合向量均值向量对描述中所有词的向量取平均值语义浓缩用单个向量代表复杂的人物特征诸葛亮描述神机妙算鞠躬尽瘁蜀汉丞相 → 分词[神机妙算, 鞠躬尽瘁, 蜀汉, 丞相] → 词向量[vec1, vec2, vec3, vec4] → 均值向量(vec1 vec2 vec3 vec4) / 4模块5相似度计算与可视化# 计算人物描述之间的相似度 names list(desc_vectors.keys()) similarity_matrix [] for i, name1 in enumerate(names): row [] for j, name2 in enumerate(names): if i j: row.append(1.0) # 自己与自己相似度为1 else: sim cosine_similarity( [desc_vectors[name1]], [desc_vectors[name2]] )[0][0] row.append(sim) similarity_matrix.append(row) # 输出相似度矩阵 print(人物描述相似度矩阵) for i, name in enumerate(names): print(f{name}: {[round(x, 3) for x in similarity_matrix[i]]})输出效果示例人物描述相似度矩阵 曹操: [1.000, 0.723, 0.689, 0.512, 0.456] 刘备: [0.723, 1.000, 0.745, 0.678, 0.423] 孙权: [0.689, 0.745, 1.000, 0.534, 0.567] 诸葛亮: [0.512, 0.678, 0.534, 1.000, 0.389] 周瑜: [0.456, 0.423, 0.567, 0.389, 1.000]

更多文章