热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关键词提取(1):TFIDF算法

关键词提取(1):TF-IDF算法一、TF-IDF算法二、代码实现1.对要提取的文本进行处理1.1加载停用词表1.2对你要提取的文本进行分


关键词提取(1):TF-IDF算法

  • 一、TF-IDF算法
  • 二、代码实现
    • 1. 对要提取的文本进行处理
      • 1.1 加载停用词表
      • 1.2 对你要提取的文本进行分词
      • 1.3 把要提取文本中除了名词之外的词和一些停用词过滤
      • 1.4 算出来剩下的名称的TFTFTF
    • 2.对数据集进行处理
      • 2.1 加载数据集
      • 2.2 进行IDFIDFIDF值的计算
      • 2.3 进行TF−IDFTF-IDFTFIDF的计算
      • 2.5 对数据进行排名,提取前nnn个作为关键词


一、TF-IDF算法

       TF−IDFTF-IDFTFIDF(Term Frequency-Inverse Document Frquency,词频-逆文档频次算法),可以看出TF−IDFTF-IDFTFIDF是由TFTFTF算法和IDFIDFIDF算法组成,它是个多文档算法,TFTFTF算法的公式为:
TF=ni∑i=1nniTF =\frac{n_i}{\sum_{i=1}^n n_i}TF=i=1nnini
       其中,分子表示:你要求的词在文档中出现的次数,分母表示:文档中所有词的出现次数,TFTFTF算法的基本思想是:一个词在文档中出现的次数越多,对文档的表达能力也就越强。
IDFIDFIDF算法的公式为:
IDF=log(∣D∣1+∣Di∣)IDF =log(\frac{|D|}{1 + |D_i|})IDF=log(1+DiD)
        其中,∣D∣|D|D表示为文档集中总的文档个数,∣Di∣|D_i|Di表示:文档集中出现词iii的文档的个数,加1是采用了拉普拉斯平滑,避免有部分新的词没有在预料库中出现导致分母为0,IDFIDFIDF算法的基本思想是:如果一个词在越少的文档中出现,对文档的区分能力就越大。
       TF−IDFTF-IDFTFIDF算法是TFTFTF算法和IDFIDFIDF算法的结合,经过大量的推到和实验,下面的公式是较为有效的计算方式之一:
TF−IDF=TF∗IDF=ni∑i=1nni∗log(∣D∣1+∣Di∣)TF-IDF = TF*IDF =\frac{n_i}{\sum_{i=1}^n n_i} * log(\frac{|D|}{1 + |D_i|})TFIDF=TFIDF=i=1nninilog(1+DiD)
        根据计算得来的TF−IDFTF-IDFTFIDF值,进行从大到小的排序,就可以取前nnn作为关键词。


二、代码实现

       实现下面一句话在文档集中的关键词提取(尝试只提取名词性词语,其他词语也被视为干扰词去掉):

if __name__ == '__main__':text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \'常委会主任陈健倩介绍了大会的筹备情况。'

1. 对要提取的文本进行处理


1.1 加载停用词表

def stopword():stop_word_path = r'D:\ProgrammingSoftware\pycharm\HanLp\stopword.txt'stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path,encoding='utf-8').readlines()]return stopword_list

1.2 对你要提取的文本进行分词

def cut_word(sentence):seg_list = psg.cut(sentence)return seg_list

1.3 把要提取文本中除了名词之外的词和一些停用词过滤

def word_filter(seg_list):stopword_list = stopword()filter_list = []for seg in seg_list:word = seg.wordflag = seg.flagif not flag.startswith('n'):continueif not word in stopword_list and len(word) > 1:filter_list.append(word)return filter_list

1.4 算出来剩下的名称的TFTFTF

def tf_value(filter_list):filter_list = filter_listtf_value_dict = {}tf_value = {}for word in filter_list:tf_value_dict[word] = tf_value_dict.get(word, 0.0) + 1.0for key, value in tf_value_dict.items():tf_value[key] = float(value / len(filter_list))return tf_value

2.对数据集进行处理


2.1 加载数据集

def load_data():corpus_path = r'D:\ProgrammingSoftware\pycharm\HanLp\corpus.txt'doc_list = []for line in open(corpus_path, 'r', encoding='utf-8'):content = line.strip()seg_list = cut_word(content)filter_word = word_filter(seg_list)doc_list.append(filter_word)return doc_list

2.2 进行IDFIDFIDF值的计算

def train_idf():doc_list = load_data()idf_dic = {}total_doc_num = len(doc_list) # 总的文档的数目# 每个词出现的文档数for doc in doc_list:for word in set(doc):idf_dic[word] = idf_dic.get(word, 0.0) + 1.0# 按照idf公式进行转换for key, value in idf_dic.items():# 加1是拉普拉斯平滑,防止部分新词在语料库中没有出现导致分母为0idf_dic[key] = math.log(total_doc_num / (1.0 + value))return idf_dic

2.3 进行TF−IDFTF-IDFTFIDF的计算

def tf_idf(tf):tf_value_dict = tf # tf的值,tf_value是个字典idf_value = train_idf() # idf的值,idf是个字典tf_idf_dict = {}for key, value in tf_value_dict.items():tf_idf_dict[key] = valuefor key_idf, value_idf in idf_value.items():if key == key_idf:tf_idf_dict[key] = value * value_idfreturn tf_idf_dict

2.5 对数据进行排名,提取前nnn个作为关键词

def rank():keyword_num = 10tf_idf_dict = tf_idf(tf)final_dict = sorted(tf_idf_dict.items(), key = lambda x: x[1], reverse = True)for i in range(0, len(final_dict)):print(final_dict[i][0] + '/', end = '')if i > 10:break

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

if __name__ == '__main__':text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \'常委会主任陈健倩介绍了大会的筹备情况。'seg_list = cut_word(text)filter_word = word_filter(seg_list)tf = tf_value(filter_word)tf_idf(tf)rank()

       最后的输出结果为:

晋江市/城市/大会/爱心/中华/基金会/许嘉璐/巡视员/重庆市/人大常委会/陈健倩/民政局/

       代码和数据的地址


推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
author-avatar
东明街道老年日托
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有