ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

【机器学习入门】TF‑IDF 算法

【机器学习入门】TF‑IDF 算法 文章目录前言一、TF‑IDF核心原理1.1 TF词频 Term Frequency1.2 IDF逆文档频率 Inverse Document Frequency1.3 TF‑IDF结果解读1.4 sklearn TfidfVectorizer 关键参数二、英文语料案例三、中文 TF‑IDF 案例《红楼梦》提取关键词四、TF‑IDF 优缺点五、易错点总结总结前言在自然语言处理中如何把文本变成计算机能看懂的数字向量是第一步。TF‑IDFTerm Frequency‑Inverse Document Frequency词频‑逆文档频率是最经典、入门必学的文本加权算法广泛用于关键词提取、文本分类、信息检索、文档相似度计算等场景。一、TF‑IDF核心原理TF‑IDF的核心思想一个词在当前文档出现次数越高越重要但如果这个词在整个语料库大量文档都出现则它的重要度被降低。简单讲过滤掉到处都出现的无意义常用词保留区分度高的关键词。TF‑IDF TF (词频) × IDF (逆文档频率) \text{TF‑IDF} \text{TF (词频)} \times \text{IDF (逆文档频率)}TF‑IDFTF (词频)×IDF (逆文档频率)1.1 TF词频 Term FrequencyTF 衡量词语在单篇文档内的出现频率并进行长度归一化防止长文档天然占优。T F ( t , d ) 词 t 在文档 d 中出现次数 文档 d 总词数 TF(t,d)\frac{词t在文档d中出现次数}{文档d总词数}TF(t,d)文档d总词数词t在文档d中出现次数​1.2 IDF逆文档频率 Inverse Document FrequencyIDF 用于衡量一个词在整个语料库中的重要程度。一个词在越少的文档中出现说明它越具有区分能力IDF 越大反之如果一个词在大量文档中出现其区分能力较弱IDF 越低。传统 IDF 计算公式I D F ( t ) log ⁡ ( N d f ( t ) ) IDF(t)\log\left(\frac{N}{df(t)}\right)IDF(t)log(df(t)N​)其中N NN语料库中文档总数d f ( t ) df(t)df(t)包含词语t tt的文档数量为了避免极端情况下d f ( t ) 0 df(t)0df(t)0实际应用中通常会加入平滑处理。sklearn中的IDF计算方式sklearn.feature_extraction.text.TfidfVectorizer默认参数smooth_idfTrue开启平滑 IDF采用如下公式I D F ( t ) log ⁡ ( N 1 d f ( t ) 1 ) 1 IDF(t)\log\left(\frac{N1}{df(t)1}\right)1IDF(t)log(df(t)1N1​)1其中N NN文档数量d f ( t ) df(t)df(t)包含词t tt的文档数量分子和分母同时加1属于平滑处理最后的 1 11是为了保证 IDF 最小值为1。因此常见词 → IDF 接近1 11稀有词 → IDF 较大1.3 TF‑IDF结果解读TF‑IDF数值越大该词对这篇文档越关键适合作为关键词TF‑IDF数值接近0大概率是the、is、的、了这类到处出现的停用词。1.4 sklearn TfidfVectorizer 关键参数参数默认值作用smooth_idfTrue是否对 IDF 加平滑分子分母1norm‘l2’输出向量的归一化方式‘l1’/‘l2’/Noneuse_idfTrue是否启用 IDF 加权False 则退化为纯 TFsublinear_tfFalse是否用 1log(TF) 替代原始 TFstop_wordsNone是否自动过滤停用词二、英文语料案例语料文件task2_1.txt一共6条英文文档This is the first document This document is the second document And this is the third one Is this the first document This line has several words This is the final document代码示例fromsklearn.feature_extraction.textimportTfidfVectorizerimportpandasaspdwithopen(rtask2_1.txt,r,encodingutf-8)asdata_file:# strip()去除每行末尾换行符、空白corpus[line.strip()forlineindata_file.readlines()]vectorizerTfidfVectorizer()# 传入数据返回包含TF-IDF的向量值tfidfvectorizer.fit_transform(corpus)print(tfidf)# 获取特征名称整个语料库的所有词wordlistvectorizer.get_feature_names_out()print(wordlist)# 将TF-IDF矩阵稀疏矩阵转换为稠密矩阵转置后创建DataFramedfpd.DataFrame(tfidf.T.todense(),indexwordlist)print(df)forjinrange(len(corpus)):featurelistdf.iloc[:,j].to_list()# 通过索引号获取内容并转换为列表resdict{}foriinrange(0,len(wordlist)):resdict[wordlist[i]]featurelist[i]resdictsorted(resdict.items(),keylambdax:x[1],reverseTrue)# x[1]按 值 排序 x[0]按 键 排序print(resdict)三、中文 TF‑IDF 案例《红楼梦》提取关键词sklearn 的TfidfVectorizer本身不支持中文分词英文依靠空格分割单词中文句子是连续汉字必须先用 jieba 分词用空格把词语隔开再送入向量化工具。完整中文处理流程遍历文件夹读取多份文档红楼梦各回文本jieba 分词可以加载自定义词典提高分词准确率加载停用词表过滤 “的、之、而、也” 等无意义虚词将分词后词语用空格拼接保存文本调用TfidfVectorizer计算 TF‑IDF提取每一回 Top‑20 关键词需要准备的配套文件分卷/文件夹存放红楼梦每一回 txt 文本红楼梦词库.txt自定义词库把 “贾宝玉、林黛玉、王熙凤” 等人名录入优化 jieba 分词StopwordsCN.txt中文停用词表每行一个停用词代码示例importpandasaspdimportosimportjiebafromsklearn.feature_extraction.textimportTfidfVectorizer filePaths[]fileContents[]# 遍历分卷文件夹读取各个回目文本forroot,dirs,filesinos.walk(r分卷):fornameinfiles:filePathos.path.join(root,name)filePaths.append(filePath)withopen(filePath,r,encodingutf‑8)asf:linesf.readlines()fileContent.join(lines[2:])# 跳过前两行表头fileContents.append(fileContent)corpospd.DataFrame({filePath:filePaths,fileContent:fileContents})# 加载自定义词典jieba.load_userdict(红楼梦词库.txt)# 读取中文停用词StopwordsCN.txtstopwordspd.read_csv(StopwordsCN.txt,encodingutf‑8,enginepython,index_colFalse)stop_setset(stopwords[stopword].values)# 分词、过滤停用词输出分词汇总文本withopen(分词后汇总.txt,w,encodingutf‑8)asfw:forindex,rowincorpos.iterrows():fileContentrow[fileContent]segsjieba.cut(fileContent)seg_result[]forseginsegs:segseg.strip()ifsegandsegnotinstop_setandlen(seg)0:seg_result.append(seg)fw.write( .join(seg_result)\n)# TF‑IDF计算withopen(r分词后汇总.txt,r,encodingutf‑8)asf:corpus[line.strip()forlineinf.readlines()]vectorizerTfidfVectorizer()tfidfvectorizer.fit_transform(corpus)wordlistvectorizer.get_feature_names_out()arrtfidf.toarray()forjinrange(len(corpus)):word_weightlist(zip(wordlist,arr[j]))word_weight.sort(keylambdax:x[1],reverseTrue)print(f第{j1}回的核心关键词{word_weight[0:20]})输出效果四、TF‑IDF 优缺点优点原理简单可解释性强上手门槛低自动压制通用停用词权重不需要完全依赖停用词词典输出向量可以直接喂给传统机器学习模型做文本分类、聚类。缺点只统计词频完全不理解语义和语序无法捕捉上下文、同义词IDF 依赖整个语料库语料质量差、样本少的时候 IDF 计算不准对新词、少见短语效果差现在工业界更多搭配 BERT 等预训练词向量使用。五、易错点总结中文不要直接丢给TfidfVectorizer sklearn 不会中文分词输出结果完全错乱必须先 jieba 分词词语中间用空格隔开。文件读取务必使用with open(...)避免忘记 close 造成资源泄露。稀疏矩阵不要随意.toarray()转稠密文档数量巨大时内存直接溢出优先在稀疏矩阵上操作。sklearn 的 IDF 公式和教科书不完全一样有平滑和 L2 归一化不要拿理论公式硬对齐 sklearn 输出数值。readlines()会带回行符记得strip()清理每行文本。TF‑IDF 无法完全替代停用词表两者搭配使用效果最好。总结TF‑IDF 是 NLP 领域最经典的文本加权算法核心逻辑只有一句话当前文档出现多、全局文档出现少的词才是好关键词。
返回列表