1,背景介绍 今天这个Notebook,基于简单的测试数据,进行TF-IDF算法测试。后面我们会结合GooSeeker文本分词工具对文本加工以后用真实数据进一步的实验。 1.1,TF-IDF算法介绍 TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。 TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。 TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。 TF是词频(Term Frequency):词频(TF)表示词条(关键字)在文本中出现的频率。 逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。 TF-IDF实际上是:TF *IDF。某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。 1.2,TF-IDF计算方法 TF-IDF计算步骤分成以下三个图: 1. 计算词频计算词频 2. 计算逆文档频率计算逆文档频率 3. 计算TF-IDF计算TF-IDF 1.3,测试数据 为了简化测试步骤,在网页上找了一段新闻文本,手工取了一些词做测试。 实际使用时,可以先用GooSeeker文本分词和情感分析工具,在图形界面上做分词任务添加和选词的步骤,导出分词结果excel表,用分词结果表做计算。在后面的notebook中我们将展示采用分词结果表的计算方法。分词工具 2,引入sklearn库及下面的子库 Scikit-learn(简记 sklearn),是面向 Python 的免费机器学习库。Sklearn 包含了很多种机器学习的方式:如分类、回归、聚类算法以及降维、模型选择和数据预处理等机器学习算法。Sklearn 同时支持 NumPy 和 SciPy 数据结构和 Matplotlib 库。 Sklearn 是机器学习中一个常用的 Python 第三方模块,能够为用户提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。 sklearn库共分为6大部分,分别用于完成分类任务、回归任务、聚类任务、降维任务、模型选择以及数据的预处理。 # coding:utf-8 from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizer 3,构造用作测试的文本 为了简化测试步骤,在网上找了一段新闻文本,手工取一些词,构造成3个文本文档,便于观察。 实际使用时,可以先用GooSeeker文本分词和情感分析工具,在图形界面上做分词任务添加和选词的步骤,导出分词结果excel表。 corpus=["此次 南京 禄口机场 出现 保洁人员 系 外包公司 的 工作人员", "机场 作为 境外防控 的 第一道 防线 人流 物流 高度 集中 风险 较高 的 场所", "在 全国 疫情 防控 的 大趋势下 为何 却 在 对 保洁人员 的 防疫 管理 上 失守"] 4,生成关键词矩阵 4.1,定义CountVectorizer类的对象 这个对象将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频 vectorizer=CountVectorizer() 4.1,将文本转换成关键词矩阵 使用vectorizer的fit_transform方法将文本转为词频矩阵 X=vectorizer.fit_transform(corpus) 5,计算tf-idf 5.1,定义TfidfTransformer类的对象 该对象会统计每个词语的tf-idf权值 transformer=TfidfTransformer() 5.2,计算tf-idf 使用transformer的fit_transform方法计算tf-idf tfidf=transformer.fit_transform(X) 6,获取词袋模型中的所有词语 所谓词袋模型,就是文章中的词不论前后顺序,一股脑混放在一个袋子中 word=vectorizer.get_feature_names() 7,取td-idf矩阵 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重 weight=tfidf.toarray() 8,输出tf-idf词语权重 for i in range(len(weight)): print("-------这里输出第",i,u"条文本的词语tf-idf权重------" ) print(list(zip(word,weight[i]))) print("\n") 输出结果是: -------这里输出第 0 条文本的词语tf-idf权重------ [('为何', 0.0), ('人流', 0.0), ('作为', 0.0), ('保洁人员', 0.29651988085384556), ('全国', 0.0), ('出现', 0.3898880096169543), ('南京', 0.3898880096169543), ('场所', 0.0), ('境外防控', 0.0), ('外包公司', 0.3898880096169543), ('大趋势下', 0.0), ('失守', 0.0), ('工作人员', 0.3898880096169543), ('机场', 0.0), ('此次', 0.3898880096169543), ('物流', 0.0), ('疫情', 0.0), ('禄口机场', 0.3898880096169543), ('第一道', 0.0), ('管理', 0.0), ('较高', 0.0), ('防控', 0.0), ('防疫', 0.0), ('防线', 0.0), ('集中', 0.0), ('风险', 0.0), ('高度', 0.0)] -------这里输出第 1 条文本的词语tf-idf权重------ [('为何', 0.0), ('人流', 0.2886751345948129), ('作为', 0.2886751345948129), ('保洁人员', 0.0), ('全国', 0.0), ('出现', 0.0), ('南京', 0.0), ('场所', 0.2886751345948129), ('境外防控', 0.2886751345948129), ('外包公司', 0.0), ('大趋势下', 0.0), ('失守', 0.0), ('工作人员', 0.0), ('机场', 0.2886751345948129), ('此次', 0.0), ('物流', 0.2886751345948129), ('疫情', 0.0), ('禄口机场', 0.0), ('第一道', 0.2886751345948129), ('管理', 0.0), ('较高', 0.2886751345948129), ('防控', 0.0), ('防疫', 0.0), ('防线', 0.2886751345948129), ('集中', 0.2886751345948129), ('风险', 0.2886751345948129), ('高度', 0.2886751345948129)] -------这里输出第 2 条文本的词语tf-idf权重------ [('为何', 0.3414262179382391), ('人流', 0.0), ('作为', 0.0), ('保洁人员', 0.2596634391575384), ('全国', 0.3414262179382391), ('出现', 0.0), ('南京', 0.0), ('场所', 0.0), ('境外防控', 0.0), ('外包公司', 0.0), ('大趋势下', 0.3414262179382391), ('失守', 0.3414262179382391), ('工作人员', 0.0), ('机场', 0.0), ('此次', 0.0), ('物流', 0.0), ('疫情', 0.3414262179382391), ('禄口机场', 0.0), ('第一道', 0.0), ('管理', 0.3414262179382391), ('较高', 0.0), ('防控', 0.3414262179382391), ('防疫', 0.3414262179382391), ('防线', 0.0), ('集中', 0.0), ('风险', 0.0), ('高度', 0.0)] 9,下载本Jupyter Notebook 作为数据探索实验,本notebook放在文件:notebook\eda 下载源代码请进:使用sklearn的TF-IDF算法计算关键词权重 |