【评论内容关键词提取】多种主流提取算法与大模型测试

news2025/1/10 19:12:17

文章目录

  • 1. 写在前面
  • 2. TextRank关键词提取算法
  • 3. TFIDF算法
  • 4. jionlp算法
  • 5. sklearn算法
  • 6. Rake算法
  • 7. hanlp情感分析
  • 8. 大语言模型

1. 写在前面

  做过舆情项目或文本内容情感分析的大家都知道,我们要从大量的文本内容中提取核心短语或者关键词!最近我们的爬虫项目中正好遇到了这么一个需求,我们收集了大量的评论内容文本数据,需要从中分析提炼关键词(最好是去哪找带情感色彩来提炼更佳


在这里插入图片描述


本次测试的评论短文本内容,如下所示:

1、一星都不想给,动不动就登录不上,啥垃圾玩意儿!

可以看到以上评论内容带着强烈的情绪,应该是很容易提炼出有价值的关键词!

2. TextRank关键词提取算法

  TextRank通过词之间的相邻关系构建网络,然后用PageRank迭代计算每个节点的rank值,排序rank值即可得到关键词

TextRank是一种基于随机游走的关键词提取算法,考虑到不同词对可能有不同的共现(co-occurrence),TextRank将共现作为无向图边的权值

测试代码实现如下:

import jieba
import jieba.analyse as analyse

def textrank_extract(topK=10, cut_all=False):
    textrank = analyse.textrank
    stopwords = ['一星都不想给,动不动就登录不上,啥垃圾玩意儿']
    words = jieba.lcut(stopwords[0], cut_all=cut_all)
    words = " ".join([i for i in words if (i not in stopwords and i != '')])
    keywords = jieba.analyse.textrank(words, topK=topK, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v','nr', 'nt'))
    for keyword, score in keywords:
        print('textrank: {} {}'.format(keyword, score))

在这里插入图片描述

以上程序实现如下:

(1)把给定的文本T按照完整句子进行分割
(2)对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即,其中 ti,j 是保留后的候选关键词
(3)构建候选关键词图G = (V,E),其中V为节点集,由2)生成的候选关键词组成,然后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词
(4)根据上面公式,迭代传播各节点的权重,直至收敛
(5)对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词
(6)由5得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词

缺点: 严重依赖于分词结果、提取时无法将两个词黏合在一起!不过TextRank考虑到了词之间的关系、倾向于将频繁词作为关键词!

3. TFIDF算法

  TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度,字词的重要性随着它在文件中出现的次数成正比增加

测试代码实现如下:

import jieba
import jieba.analyse as analyse

def tf_idf_extract(topK=10, cut_all=False):
    stopwords = stopwords = ['一星都不想给,动不动就登录不上,啥垃圾玩意儿']
    words = jieba.lcut(stopwords[0], cut_all=cut_all)
    words = " ".join([i for i in words if (i not in stopwords and i != '')])
    keywords = jieba.analyse.extract_tags(words, topK=topK, withWeight=True)
    for keyword, score in keywords:
        print('tf_idf: {} {}'.format(keyword, score))

在这里插入图片描述

缺点:TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多!

4. jionlp算法

  jionlp在 tfidf 方法提取的碎片化的关键词(默认使用 pkuseg 的分词工具)基础上,将在文本中相邻的关键词合并,并根据权重进行调整,同时合并较为相似的短语,并结合 LDA 模型,寻找突出主题的词汇,增加权重,组合成结果进行返回

测试代码实现如下:

import jionlp as jio
def jionlp_extract(topk=10):
    content = '一星都不想给,动不动就登录不上,啥垃圾玩意儿'
    keyword = jio.keyphrase.extract_keyphrase(content)
    print('jionlp: {}'.format(keyword))

在这里插入图片描述

可调的参数也是特别的多,比较灵活。参考如下:

print(jio.keyphrase.extract_keyphrase.__doc__)

5. sklearn算法

  scikit-learn(sklearn)是一个用于机器学习和数据挖掘的Python库,它提供了许多用于文本分析和自然语言处理(NLP)的工具和算法。在scikit-learn中,文本关键词抽取通常通过TF-IDF或Count Vectorization(词袋模型)等技术来实现!

测试代码实现如下:

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer

def sklearn_extract(topk=10, cut_all=False):
    stopwords = ['一星都不想给,动不动就登录不上,啥垃圾玩意儿']
    # 第一步,先进行分词
    words = jieba.lcut(stopwords[0], cut_all=cut_all)
    # 第二步,去除停用词
    words = " ".join([i for i in words if (i not in stopwords and i != '')])
    vectorizer = CountVectorizer()
    transformer = TfidfTransformer()
    X = vectorizer.fit_transform([words]) # 将文本转为词频矩阵
    tfidf = transformer.fit_transform(X) # 计算tf-idf
    word = vectorizer.get_feature_names_out() # 获取词袋模型中的所有词语
    weight = tfidf.toarray() # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
    keyword = [(wd, score) for wd, score in zip(word, weight[0])]
    keyword = sorted(keyword, key=lambda x: x[1], reverse=True)[:topk]
    for k, score in keyword:
        print(YELLOW % 'sklearn: {} {}'.format(k, score))

CountVectorizer:该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频

TfidfTransformer:该类会统计每个词语的tf-idf权值

在这里插入图片描述

6. Rake算法

  Rake实际上提取的是关键的短语,并且倾向于较长的短语,在英文中,关键词通常包括多个单词,但很少包含标点符号和停用词,例如and,the,of等,以及其他不包含语义信息的单词

Rake算法首先使用标点符号将文本分成若干分句,然后对于每一个分句,使用停用词作为分隔符将分句分为若干短语,这些短语作为最终提取出的关键词的候选词

然后将其中每个单词的得分累加,并进行排序,RAKE将候选短语总数的前三分之一的认为是抽取出的关键词!

测试代码实现如下:

def rake_extract(topk=10):
    swLibList = ['一星都不想给,动不动就登录不上,啥垃圾玩意儿']
    conjLibList = []
    rawtextList = pseg.cut(swLibList[0])

    textList = []
    listofSingleWord = dict()
    lastWord = ''
    poSPrty = ['m', 'x', 'uj', 'ul', 'mq', 'u', 'v', 'f']
    meaningfulCount = 0
    checklist = []
    for eachWord, flag in rawtextList:
        checklist.append([eachWord, flag])
        if eachWord in conjLibList or not notNumStr(
                eachWord) or eachWord in swLibList or flag in poSPrty or eachWord == '\n':
            if lastWord != '|':
                textList.append("|")
                lastWord = "|"
        elif eachWord not in swLibList and eachWord != '\n':
            textList.append(eachWord)
            meaningfulCount += 1
            if eachWord not in listofSingleWord:
                listofSingleWord[eachWord] = Word(eachWord)
            lastWord = ''

    newList = []
    tempList = []
    for everyWord in textList:
        if everyWord != '|':
            tempList.append(everyWord)
        else:
            newList.append(tempList)
            tempList = []

    tempStr = ''
    for everyWord in textList:
        if everyWord != '|':
            tempStr += everyWord + '|'
        else:
            if tempStr[:-1] not in listofSingleWord:
                listofSingleWord[tempStr[:-1]] = Word(tempStr[:-1])
                tempStr = ''

    for everyPhrase in newList:
        res = ''
        for everyWord in everyPhrase:
            listofSingleWord[everyWord].updateOccur(len(everyPhrase))
            res += everyWord + '|'
        phraseKey = res[:-1]
        if phraseKey not in listofSingleWord:
            listofSingleWord[phraseKey] = Word(phraseKey)
        else:
            listofSingleWord[phraseKey].updateFreq()

    outputList = dict()
    for everyPhrase in newList:

        if len(everyPhrase) > 5:
            continue
        score = 0
        phraseString = ''
        outStr = ''
        for everyWord in everyPhrase:
            score += listofSingleWord[everyWord].returnScore()
            phraseString += everyWord + '|'
            outStr += everyWord
        phraseKey = phraseString[:-1]
        freq = listofSingleWord[phraseKey].getFreq()
        if freq / meaningfulCount < 0.01 and freq < 3:
            continue
        outputList[outStr] = score

    sorted_list = sorted(outputList.items(), key=operator.itemgetter(1), reverse=True)
    for keyword in sorted_list:
        print(YELLOW % 'rake: {} {}'.format(keyword[0], keyword[1]))

这个提取算法的效果相比前面几个,显得是有点越来越离谱:

在这里插入图片描述

7. hanlp情感分析

  这里再给大家介绍一个用于文本情感分析的开源工具hanlp,像我们在做评论的情感分析时,想区分这条评论的内容是一个正向的还是负面的,它支持一个在线演示:

在这里插入图片描述

情感分析任务的目标是判断上面这段文本的情感极性。 情感极性为[-1, 1]之间的数值,数值的正负代表正负面情绪,数值的绝对值代表情感的强烈程度

8. 大语言模型

  最后我们使用最火的GPT大语言模型来提取我们的文本关键词,个人感觉更加贴近理想效果:

在这里插入图片描述

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式计算】副本数据Replicated Data

作用&#xff1a;可靠性、高性能、容错性 问题&#xff1a;如何保持一致、如何更新 问题&#xff1a;存在读写/写写冲突 一个简单的方法就是每个操作都保持顺序&#xff0c;但是因为网络延迟会导致问题 Data-centric models: consistency model?? ??? 读取时&#xff0c…

7-1_MSPI_NANDFLASH SDK例程详解

1.代码示例路径 PRJ_M66_4.3.3\boards\apollo4l_blue_eb\examples\interfaces\mspi_ds35x1ga_quad_example\src\mspi_ds35x1ga_quad_example.c 本文中主要讲解初始化流程内容 2.MSPI通信示意图 SCK&#xff08;Serial Clock&#xff09;&#xff1a;串行时钟&#xff0c;用于…

web:[HCTF 2018]WarmUp

题目 点进页面&#xff0c;页面只有一张滑稽脸&#xff0c;没有其他的提示信息 查看网页源代码&#xff0c;发现source.php&#xff0c;尝试访问一下 跳转至该页面&#xff0c;页面显示为一段php代码&#xff0c;需要进行代码审计 <?phphighlight_file(__FILE__);class emm…

BCC源码下载

接前一篇文章&#xff1a;BCC介绍 1. GitHub地址 上一篇文章中已提到&#xff0c;BCC的github地址是&#xff1a;https://github.com/iovisor/bcc。 页面如下所示&#xff1a; 2. 源码下载 打开终端&#xff0c;创建好要存放BCC源码的目录&#xff0c;进入此目录。 然后&…

【计算机网络】——传输层

//图片取自王道&#xff0c;仅做交流学习 一、传输层提供的服务 物理层、数据链路层、网络层是通信子网。 传输层&#xff1a;它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层 为应用层提供通信服务使用网络层的服务 网络层提供主机之间的逻辑通信。 1、传输…

go sync.Map包装过的对象nil值的判断

被sync.Map包装过的nil 对象&#xff0c;是不能直接用if xxx nil的方式来判断的 func testnil() *interface{} {return nil }func main() {var ptr *interface{}test : testnil()//p &Person{}fmt.Printf("ptr 的值为 : %v\n", ptr)fmt.Printf("ptr 的值…

控价与数据分析的关系

品牌在做线上控价时&#xff0c;会面对许多的数据&#xff0c;如店铺数据、行业数据&#xff0c;当这些数据仅仅只是拿来做监测低价输出低价报表使用&#xff0c;是没有发挥其最大作用的&#xff0c;因为商品链接的字段较丰富&#xff0c;涉及的内容会包含销量、评价量、促销信…

pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)

利用Anaconda创建pytorch虚拟环境 前提&#xff1a;成功安装Anaconda&#xff0c;确保可以打开NVIDIA控制面板 开始-》搜索“Anaconda Prompt” 打开后输入&#xff1a;conda create -n 你的虚拟环境名 python3.9。输入y&#xff0c;继续安装&#xff0c;完成。 输入&#…

容器适配器

除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff1a;stack、queue和priority_queue适配器。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。适配器本质上是一种机制&#xff0c;能使某种事物的行为看起来像另外一种事物一样。 所有容器…

C++笔记之尾置返回类型(trailing return type)

C笔记之尾置返回类型(trailing return type) 文章目录 C笔记之尾置返回类型(trailing return type)1.尾置返回类型的一些示例用法2.尾置返回类型对泛型编程的好处3.尾置返回类型通常在以下情况下派上用场4.既然auto可以自动类型推断&#xff0c;那为什么还需要尾置返回类型&…

微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning的在线课程 微调大型语言模型(一)的第一课&#xff1a;为什么要微调(Why finetune)。 我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月&#xff0c;那么如果我们向ChatGPT询问2022年以后发生的事情&#xff0c;它可能会产生…

K8S-Pod 进阶

Pod 进阶 一、资源限制&#xff08;业务cpu 内存&#xff09;1.定义2.Pod 和 容器 的资源请求和限制3.CPU 资源单位4.内存 资源单位5.示例 二、健康检查&#xff1a;又称为探针&#xff08;Probe&#xff09;1.定义2.探针的三种规则&#xff1a;3.Probe支持三种检查方法4.示例 …

一位autosar开源爱好者(非本博主)

https://github.com/autoashttps://github.com/autoas该爱好者 Email&#xff1a; paraifoxmail.com 另外在https://club.rt-thread.org/ask/question/a124ee65268bed5f.html 汽车电子嵌入式操作系统符合Autosar规范的静态os&#xff1a;GaInOS 发布于 2013-01-03 22:09:11 …

vite + vue3 + js 搭建组件库 + 核心配置与使用

vite.config.js 这个官网有写 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path" // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],server:{open:true, //自动打开浏览port:8088 //默认…

「大数据-0」虚拟机VMware安装、配置、使用、创建大数据集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

机器学习(18)---朴素贝叶斯

朴素贝叶斯 一、概述1.1 概率分类器1.2 贝叶斯工作原理1.3 贝叶斯的性质 二、sklearn中的朴素贝叶斯2.1 贝叶斯分类器2.2 高斯朴素贝叶斯GaussianNB2.3 探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集2.4 探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度 一、概…

Three.js 实现导出模型文件(.glb,.gltf)功能 GLTFExporter

Three.js提供了导出&#xff08;.glb,.gltf&#xff09;文件的API GLTFExporter 用于实现场景内容导出模型文件的功能 导出模型文件主要使用 parse 方法&#xff0c;该方法接收三个参数&#xff1a; 1.scene&#xff1a;要导出的场景对象。 2.onComplete&#xff1a;解析完成…

Deformable DETR(2020 ICLR)

Deformable DETR&#xff08;2020 ICLR&#xff09; detr训练epochs缩小十倍&#xff0c;小目标性能更好 Deformable attention 结合变形卷积的稀疏空间采样和Transformer的关系建模能力 使用多层级特征层特征,不需要使用FPN的设计&#xff08;直接使用backbone多层级输出&a…

cgroup version jdk version k8s

bug info: in centos, linux 3.10, cgroup:v1, service works well. in ubuntu 22.04 LTS, linux 5, systemd:v2, service is always crash on boot, or running some minutes then killed by OOM. deploy.yaml文件相关内容: specify limits:memory 1000M in yaml, killed …

区域气象-大气化学在线耦合模式(WRFChem)在大气环境领域实践技术应用

随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。近年来&#xff0c;严重的大气污染问题已经明显影响国计民生&#xff0c;引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因…