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"出现 这样,文本就从字符串变成了机器学习模型能理解的数字向量!