# Summary q「好莱坞电影推荐」分词得到 多个Q「好莱坞」「电影」「推荐」 q 与doc 的相关性计算方式是, q 里每个 Q 在该 doc 的 TF词频计算结果的和,但是是通过 IDF 加权后的结果 **Term Frequency–Inverse Document Frequency**。它的直译是:**词频–逆文档频率**。 IDF::用文档d的长度(记作la)对词频做归一化。 场景:想象你要从一堆文章中找出每篇文章最重要的词: - "西湖"在杭州游记里出现10次 → 应该很重要 - 但问题来了:"的"、"了"也出现很多次,它们重要吗?❌ - "的"、"了" → 每篇文章都有,太普通了,扣分! - "西湖" → 只在杭州相关文章出现,很特别,加分! ** 解决:**TF-IDF = TF × IDF** - 既要在本文中频繁出现(TF高) - 又要在其他文章中很少见(IDF高) - 这样的词才是真正的"关键词" **举例:** - "西湖":杭州游记里常出现 ✓,其他城市游记很少提 ✓ → **高分!** - "的":到处都是 ✓,但太普通 ✗ → 低分 - "景点":本文偶尔提 ✗ → 低分 **用途:** 搜索引擎、文章推荐、关键词提取都靠它! TF‑IDF TF-IDF 是一种把文本转换成数字的方法,让机器能够理解文本。它会计算每个词/字符组合的重要性。 具体在做什么: 1. 字符级特征提取 `analyzer="char_wb", ngram_range=(3, 5)` - 把文本拆成3-5个连续字符的组合 - 比如 "hello" 会被拆成: "hel", "ell", "llo" (3字符), "hell", "ello" (4字符), "hello" (5字符) - 这能捕捉拼写错误、俚语、特殊用词 2. 词级特征提取 `analyzer="word", ngram_range=(1, 2)` - 把文本拆成单词和相邻两个词的组合 - 比如 "I love coding" 会被拆成: "I", "love", "coding", "I love", "love coding" - 这能理解词汇含义和短语搭配 3. 特征合并 `Xtr = hstack([Xtr_c, Xtr_w])` # 横向拼接 - 把字符特征和词特征并排放在一起 - 就像把两张表格左右拼接成一张大表 - 这样模型既能看到字符模式,又能理解词汇意义 4. 内存优化 `del Xtr_c, Xva_c, Xte_c, Xtr_w, Xva_w, Xte_w` `gc.collect()` - 删除中间变量,释放内存 - 因为文本特征矩阵很大,不删除会占用双倍内存 为什么要这样做? - 字符级特征:抗拼写错误、捕捉细节 - 词级特征:理解语义、上下文 - 两者结合:让模型更准确地判断帖子是否违规 我来举例说明 fit_transform 前后的变化: 输入 (Input) - X_train 原始文本列表,比如: ```Java X_train = [ "[RULE] No spam [SUB] python [TEXT] Check out my website!", "[RULE] Be respectful [SUB] gaming [TEXT] You're an idiot", "[RULE] Stay on topic [SUB] cooking [TEXT] Great recipe, thanks!" ] ``` 输出 (Output) - Xtr_c 一个稀疏矩阵(数字表格),每行代表一个文本,每列代表一个字符组合的TF-IDF值: ```Java "Che" "hec" "eck" "You" "ou'" "u'r" "Gre" "rea" "eat" ... 文本1: 0.23 0.18 0.21 0 0 0 0 0 0 ... 文本2: 0 0 0 0.31 0.28 0.25 0 0 0 ... 文本3: 0 0 0 0 0 0 0.19 0.22 0.20 ... ``` 具体转换过程: 1. 提取3-5字符组合 - 文本1: "Check" $\rightarrow$["Che", "hec", "eck", "Chec", "heck", "Check"] - 文本2: "You're" $\rightarrow$["You", "ou'", "u'r", "You'", "ou'r", "You'r"] 2. 计算TF-IDF值 - TF (词频): 这个组合在当前文本中出现了多少次 - IDF (逆文档频率): 这个组合有多独特(越少见越重要) - TF-IDF = TF $\times$ IDF 3. 生成稀疏矩阵 - 大部分值是0(因为每个文本只包含少数字符组合) - 非0值表示该字符组合在该文本中的重要性 实际例子: # 假设只有3个字符组合被提取 特征列:["eck", "You", "eat"] 文本1 "Check out...":[0.21, 0, 0]# 只有"eck"出现 文本2 "You're...":[0, 0.31, 0]# 只有"You"出现 文本3 "Great...":[0, 0, 0.20]# 只有"eat"出现 这样,文本就从字符串变成了机器学习模型能理解的数字向量!