安装用jieba,实现用TF-IDF算法进行关键词的提取

2023-11-19

文本知识提取

目录

1.安装jieba

2.TF-IDF算法

2.1算法的定义

2.2算法的应用

(1)词性标注

(2)去停用词

(3)关键词提取


1.安装jieba

Jieba分词官网:https://github.com/fxsjy/jieba

解压到相应文件夹 ,打开控制台

切换到setup所在的路径,然后 输入python setup.py install 进行安装

测试安装成功

 

2.TF-IDF算法

基于TF-IDF算法抽取关键词的主调函数是TFIDF.extract_tags函数,主要是在jieba/analyse/tfidf.py中实现

源码分析如下:

def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):
    # 传入了词性限制集合
    if allowPOS:
        allowPOS = frozenset(allowPOS)
        # 调用词性标注接口
        words = self.postokenizer.cut(sentence)
    # 没有传入词性限制集合
    else:
        # 调用分词接口
        words = self.tokenizer.cut(sentence)
    freq = {}
    for w in words:
        if allowPOS:
            if w.flag not in allowPOS:
                continue
            elif not withFlag:
                w = w.word
        wc = w.word if allowPOS and withFlag else w
        # 判断词的长度是否小于2,或者词是否为停用词
        if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
            continue
        # 将其添加到词频词典中,次数加1
        freq[w] = freq.get(w, 0.0) + 1.0
    # 统计词频词典中的总次数
    total = sum(freq.values())
    for k in freq:
        kw = k.word if allowPOS and withFlag else k
        # 计算每个词的tf-idf值
        freq[k] *= self.idf_freq.get(kw, self.median_idf) / total
    
    # 根据tf-idf值进行排序
    if withWeight:
        tags = sorted(freq.items(), key=itemgetter(1), reverse=True)
    else:
        tags = sorted(freq, key=freq.__getitem__, reverse=True)
    # 输出topK个词作为关键词
    if topK:
        return tags[:topK]
    else:
        return tags

2.1算法的定义

(1)TF词频的计算

词频(TF)=某个词语在文章中的出现次数 / 文章的总词数 或者 词频(TF)

                   =某个词语在文章中的出现次数 / 这篇文章出现最多的词的出现次数

(2)IDF的计算

逆文档频率(IDF)= log(语料库的文档总数 / 包含该词的文档数+1),

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

(3)计算TF-IDF的值

TF-IDF = 词频(TF)* 逆文档频率(IDF)


比如:词频(tf)是一词语出现的次数除以该文件的总词语数。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,
那么“母牛”一词在该文件中的词频就是3/100=0.03。
一个计算文件频率(DF)的方法是测定有多少份文件出现过“母牛”一词,
然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,
而文件总数是10,000,000份的话,其逆向文件频率就是log(10,000,000 / 1,000)=4。
最后的tf-idf的分数为0.03 * 4=0.12。

2.2算法的应用

(1)词性标注

import jieba.posseg as pseg

words = pseg.cut("姑娘别怂,加油干")
# words类别为:generator

for word, flag in words:
    print('%s %s' % (word, flag))

 

import jieba
seg_list = jieba.cut("我要成为研究生", cut_all=True)
# join是split的逆操作
# 即使用一个拼接符将一个列表拼成字符串
print("/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我要成为研究生", cut_all=False)
print("/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("论文真是令人头秃")  # 默认是精确模式
print("/ ".join(seg_list))

seg_list = jieba.cut_for_search("我要成为研究生,最后改论文真实令人头秃")  # 搜索引擎模式
print("/ ".join(seg_list))

(2)去停用词

先进性了词性标注,然后通过加载停用词文件过滤掉无关词,停用词表是根据原文本我自己往里面加的,比如数词,形容词。

import jieba
    # jieba.load_userdict('userdict.txt')
    # 创建停用词list
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r').readlines()]
    return stopwords

    # 对句子进行分词
def seg_sentence(sentence):
        # 对文档中的每一行进行中文分词
        #print("正在分词...")
    sentence_seged = jieba.cut(sentence.strip())
    stopwords = stopwordslist('D:\jieba-0.42.1\jieba\stop_words.txt')  # 这里加载停用词的路径
     # 输出结果为outstr
    outstr = ''
        # 去停用词
    for word in sentence_seged:
        if word not in stopwords:
            if word != '\t':
                outstr += word
                outstr += " "
    return outstr

     # 给出文档路径
inputs = open('D:\jieba-0.42.1\jieba\cainiao.txt', 'r', encoding='utf-8')
outputs = open('D:\jieba-0.42.1\jieba\out_words.txt', 'w',encoding='utf-8')

# # 将输出结果写入out_words.txt中
for line in inputs:
    line_seg = seg_sentence(line)  # 这里的返回值是字符串
    outputs.write(line_seg + '\n')
        #print("-------------------正在分词和去停用词-----------")
outputs.close()
inputs.close()
    #print("删除停用词和分词成功!!!")


 

(3)关键词提取

两个都可以,区别就是加不加  -*- coding: utf-8 -*- 也可以 #coding:utf-8

from jieba import analyse
# 引入TF-IDF关键词抽取接口
tfidf = analyse.extract_tags

# 原始文本
text = u"线程是程序执行时的最小单位,它是进程的一个执行流,\
    是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\
    线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。\
    线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。\
    同样多线程也可以实现并发操作,每个请求分配一个线程来处理。"

# 基于TF-IDF算法进行关键词抽取
keywords = tfidf(text,topK=10,withWeight=True,allowPOS=())
for keyword in keywords:
  print (keyword )





# # -*- coding: utf-8 -*-
# import jieba.analyse
# # 字符串前面加u表示使用unicode编码
# content = u'安全、防止水合物和段塞生成的重要措施之一。因此,针对未来还上油田开发技术,' \
#           u'我们预先开展了水深1500米管道式油气水分离器的概念设计。通过该研究,提出适合海洋环境的体积小、' \
#           u'重量轻、分离效率高、便于操作和维护的新型油气水三相分离器,使' \
#           u'其成为海洋深水油气田开'
#
# keywords = jieba.analyse.extract_tags(content, topK=3, withWeight=True, allowPOS=())
# # 访问提取结果
# for item in keywords:
#     # 分别为关键词和相应的权重
#     print(item[0], item[1])

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安装用jieba,实现用TF-IDF算法进行关键词的提取 的相关文章

  • 美化github首页

    创建仓库 注 新建仓库的名字要和自己的名字完全一致 提交的源码必须在主分支上 master或者main 配置完成 回到你的主页 你就能看到在置顶项目的上方多了一个README md 编辑改文件即可 美化首页源码 1 github概览数据 G

随机推荐

  • 若依框架中@DataScope数据权限注解的使用与自定义sql语句。

    介绍 若依框架本身具有角色 部门 用户业务 在业务中 用户必须绑定一个角色 而角色又必须将自身绑定到部门 角色绑定了哪些部门 就决定着隶属于该角色的用户能对哪些部门数据进行增删改 那么 怎么实现让用户只能遵循其绑定角色所指定的部门 来进行数
  • 分布式CAP定理,为什么不能同时满足三个特性?

    在弄清楚这个问题之前 我们先了解一下什么是分布式的CAP定理 根据百度百科的定义 CAP定理又称CAP原则 指的是在一个分布式系统中 Consistency 一致性 Availability 可用性 Partition tolerance
  • linux rhel6 nvidia 卡 在启动界面,RHEL6上安装Nvidia显卡驱动

    二 在字符界面下 运行级3 运行驱动安装程序 在RHEL6上因为Nouveau的关系会出现下面的错误 因此需要将该模块禁用掉 root rhel6 sh NVIDIA Linux x86 64 275 09 07 run Verifying
  • 如何编译SQLite-How To Compile SQLite

    SQLite是ANSI C的源代码 在使用之前必须要编译成机器码 这篇文章是用于各种编译SQLite方法的指南 这篇文章不包含编译SQLite的每个步骤的反馈 那样可能会困难因为每种开发场景都不同 所以这篇文章描述和阐述了编译Sqlite的
  • 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)

    文章目录 四 智能合约的开发和WeBASE合约IDE的使用 一 实验概述 二 实验目标 三 实验环境及建议 四 实验步骤 4 1 启动Webase 4 2 智能合约开发 4 2 1 合约功能设计 4 2 2 存证合约开发 4 2 3 工厂合
  • 浅析赋值、浅拷贝、深拷贝的区别

    1 原理 赋值 将某一对象赋给某个变量的过程 称为赋值 浅拷贝 浅拷贝是创建一个对象 这个对象有着原始对象属性值的一份精准拷贝 如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址 如果其中一个对象改变了这个地
  • 寒假训练 第二节 数据结构基础 总结

    数组 定义 语言支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 所有的数组都是由连续的内存位置组成 最低的地址对应第一个元素 最高的地址对应最后一个元素 数组
  • python 爬虫 GET(带参) 请求 配置params参数

    import requests 发送网络请求 response requests get http httpbin org get name Jack age 30 print response text 输出结果 args age 30
  • 2019北邮网安院机试真题(回忆版)@lantin

    2019北邮网安院机试真题 回忆版 细不谈 前两题真的都是签到题 会简单排序和if else都可以写的出来的题目 网安院的机试基本上是两道签到题 C题是数据结构题 D题是算法 做到保2争3 保3争4面试不出原则问题基本上复试稳了 Probl
  • Qt系列文章之 mousePressEvent

    上一篇文章介绍QTabWidget的使用技巧 本文开始介绍Qt最常用的事件之一QMouseEvent 鼠标事件 mousePressEvent 鼠标事件是Qt中十分重要的人机交互形式 鼠标事件包括很多内容 此处先介绍最基本的mousePre
  • MySQL 表分区 A PRIMARY KEY must include all columns in the table's partitioning function

    当我们在对MySQL的数据表进行分区的时候 很容易碰到如下错误 A PRIMARY KEY must include all columns in the table s partitioning function 意思是说分区的字段必须是
  • Qt 不规则窗口,不规则按钮,不规划控件 不规则界面

    有一些特殊情况 需要使用不规则窗口或按钮 看起来非常炫酷 类似 Qt 实现 不规则样式设置 不是视觉欺骗 是真正的不规则 点击外面不会触发按钮的点击信号 Part1 不规则窗口 效果 显示成一张图片中的图形 使用带有透明区域的png图片 i
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • sql 求日期均值

    备忘一下 在sql中求日期均值的语句 首先 AVG 只能作用与数值型字段 不能作用于日期字段 所以不能像求数值均值一样求日期均值 要求日期均值 需要先把 日期转为Long 然后对转后的Long求均值 对Long求完均值 在把Long转为 日
  • git 将本仓库的分支代码提交到另外一个仓库

    因为新项目开发的项目代码是建立在另外一个项目的代码框架上进行样式与逻辑功能修改 所以为了省事 想着把旧仓库的temp分支代码直接提交到新仓库master分支底下进行项目开发 所以需要在git上进行一些操作 将本仓库的分支代码提交到另外一个仓
  • 【Linux扩容】Vmware虚拟机内的Linux扩容

    1 虚拟机设置 Vmware 虚拟机 设置 硬盘 扩展 40 64G 2 Linux磁盘扩展 有图形化桌面 GParted 分区上右键 扩展 保存 无图形化桌面 找一个有图形化桌面的Linux live镜像 CD载入 或者LinuxToGo
  • Linux网络编程之Tcp(内含服务器、客户端代码实例)

    文章目录 前言 Tcp模型 服务器端 客户机端 代码 运行结果 结束 前言 本节讲解需要相关的网络基础知识 如果缺少相关知识 请先学习 Linux网络编程之网络基础 和 Linux网络编程之网络基础2 Tcp模型 先打开我们之前讲过的Tcp
  • CVE-2021-40444漏洞复现详细

    2021年9月8日 微软官方发布了MSHTML组件的风险通告 漏洞编号 CVE 2021 40444 未经身份验证的攻击者可以利用该漏洞在目标系统上远程执行代码 微软官方表示已经监测到该漏洞存在在野利用 1 漏洞详情 Microsoft M
  • js 本地存储和获取

    localStorage setItem temp orderAr 存入 参数 1 调用的值 2 所要存入的数据 console log localStorage getItem temp 输出
  • 安装用jieba,实现用TF-IDF算法进行关键词的提取

    文本知识提取 目录 1 安装jieba 2 TF IDF算法 2 1算法的定义 2 2算法的应用 1 词性标注 2 去停用词 3 关键词提取 1 安装jieba Jieba分词官网 https github com fxsjy jieba