前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Serverless 实战:如何结合 NLP 实现文本摘要和关键词提取?

Serverless 实战:如何结合 NLP 实现文本摘要和关键词提取?

作者头像
腾讯云serverless团队
发布于 2020-06-06 14:10:19
发布于 2020-06-06 14:10:19
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

对文本进行自动摘要的提取和关键词的提取,属于自然语言处理的范畴。提取摘要的一个好处是可以让阅读者通过最少的信息判断出这个文章对自己是否有意义或者价值,是否需要进行更加详细的阅读;而提取关键词的好处是可以让文章与文章之间产生关联,同时也可以让读者通过关键词快速定位到和该关键词相关的文章内容。

文本摘要和关键词提取都可以和传统的 CMS 进行结合,通过对文章 / 新闻等发布功能进行改造,同步提取关键词和摘要,放到 HTML 页面中作为 Description 和 Keyworks。这样做在一定程度上有利于搜索引擎收录,属于 SEO 优化的范畴。

关键词提取

关键词提取的方法很多,但是最常见的应该就是 tf-idf 了。

通过 jieba 实现基于 tf-idf 关键词提取的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=('n', 'vn', 'v'))

文本摘要

文本摘要的方法也有很多,如果从广义上来划分,包括提取式和生成式。其中提取式就是在文章中通过 TextRank 等算法,找出关键句然后进行拼装,形成摘要,这种方法相对来说比较简单,但是很难提取出真实的语义等;另一种方法是生成式,通过深度学习等方法,对文本语义进行提取再生成摘要。

如果简单理解,提取式方式生成的摘要,所有句子来自原文,而生成式方法则是独立生成的。

为了简化难度,本文将采用提取式来实现文本摘要功能,通过 SnowNLP 第三方库,实现基于 TextRank 的文本摘要功能。我们以《海底两万里》部分内容作为原文,进行摘要生成。

原文

通过 SnowNLP 提供的算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from snownlp import SnowNLP
 
text = " 上面的原文内容,此处省略 "
s = SnowNLP(text)
print("。".join(s.summary(5)))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
自然就分成观点截然不同的两派:一派说这是一个力大无比的怪物。这种假设也不能成立。我到纽约时。说它是一块浮动的船体或是一堆大船残片。另一派说这是一艘动力极强的“潜水船”

初步来看,效果并不是很好,接下来我们自己计算句子权重,实现一个简单的摘要功能,这个就需要 jieba

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import jieba.analyse
import jieba.posseg
 
 
class TextSummary:
    def __init__(self, text):
        self.text = text
 
    def splitSentence(self):
        sectionNum = 0
        self.sentences = []
        for eveSection in self.text.split("\n"):
            if eveSection:
                sentenceNum = 0
                for eveSentence in re.split("!|。|?", eveSection):
                    if eveSentence:
                        mark = []
                        if sectionNum == 0:
                            mark.append("FIRSTSECTION")
                        if sentenceNum == 0:
                            mark.append("FIRSTSENTENCE")
                        self.sentences.append({
                            "text": eveSentence,
                            "pos": {
                                "x": sectionNum,
                                "y": sentenceNum,
                                "mark": mark
                            }
                        })
                        sentenceNum = sentenceNum + 1
                sectionNum = sectionNum + 1
                self.sentences[-1]["pos"]["mark"].append("LASTSENTENCE")
        for i in range(0, len(self.sentences)):
            if self.sentences[i]["pos"]["x"] == self.sentences[-1]["pos"]["x"]:
                self.sentences[i]["pos"]["mark"].append("LASTSECTION")
 
    def getKeywords(self):
        self.keywords = jieba.analyse.extract_tags(self.text, topK=20, withWeight=False, allowPOS=('n', 'vn', 'v'))
 
    def sentenceWeight(self):
        # 计算句子的位置权重
        for sentence in self.sentences:
            mark = sentence["pos"]["mark"]
            weightPos = 0
            if"FIRSTSECTION"in mark:
                weightPos = weightPos + 2
            if"FIRSTSENTENCE"in mark:
                weightPos = weightPos + 2
            if"LASTSENTENCE"in mark:
                weightPos = weightPos + 1
            if"LASTSECTION"in mark:
                weightPos = weightPos + 1
            sentence["weightPos"] = weightPos
 
        # 计算句子的线索词权重
        index = [" 总之 ", " 总而言之 "]
        for sentence in self.sentences:
            sentence["weightCueWords"] = 0
            sentence["weightKeywords"] = 0
        for i in index:
            for sentence in self.sentences:
                if sentence["text"].find(i) >= 0:
                    sentence["weightCueWords"] = 1
 
        for keyword in self.keywords:
            for sentence in self.sentences:
                if sentence["text"].find(keyword) >= 0:
                    sentence["weightKeywords"] = sentence["weightKeywords"] + 1
 
        for sentence in self.sentences:
            sentence["weight"] = sentence["weightPos"] + 2 * sentence["weightCueWords"] + sentence["weightKeywords"]
 
    def getSummary(self, ratio=0.1):
        self.keywords = list()
        self.sentences = list()
        self.summary = list()
 
        # 调用方法,分别计算关键词、分句,计算权重
        self.getKeywords()
        self.splitSentence()
        self.sentenceWeight()
 
        # 对句子的权重值进行排序
        self.sentences = sorted(self.sentences, key=lambda k: k['weight'], reverse=True)
 
        # 根据排序结果,取排名占前 ratio% 的句子作为摘要
        for i in range(len(self.sentences)):
            if i < ratio * len(self.sentences):
                sentence = self.sentences[i]
                self.summary.append(sentence["text"])
 
        return self.summary

这段代码主要是通过 tf-idf 实现关键词提取,然后通过关键词提取对句子尽心权重赋予,最后获得到整体的结果,运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testSummary = TextSummary(text)
print("。".join(testSummary.getSummary()))

可以得到结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/yb/wvy_7wm91mzd7cjg4444gvdjsglgs8/T/jieba.cache
Loading model cost 0.721 seconds.
Prefix dict has been built successfully.
看来,只有政府才有可能拥有这种破坏性的机器,在这个灾难深重的时代,人们千方百计要增强战争武器威力,那就有这种可能,一个国家瞒着其他国家在试制这类骇人听闻的武器。于是,我就抓紧这段候船逗留时间,把收集到的矿物和动植物标本进行分类整理,可就在这时,斯科舍号出事了。同样的道理,说它是一块浮动的船体或是一堆大船残片,这种假设也不能成立,理由仍然是移动速度太快

我们可以看到,整体效果要比刚才的好一些。

发布 API

通过 Serverless 架构,将上面代码进行整理,并发布。

代码整理结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re, json
import jieba.analyse
import jieba.posseg
 
 
class NLPAttr:
    def __init__(self, text):
        self.text = text
 
    def splitSentence(self):
        sectionNum = 0
        self.sentences = []
        for eveSection in self.text.split("\n"):
            if eveSection:
                sentenceNum = 0
                for eveSentence in re.split("!|。|?", eveSection):
                    if eveSentence:
                        mark = []
                        if sectionNum == 0:
                            mark.append("FIRSTSECTION")
                        if sentenceNum == 0:
                            mark.append("FIRSTSENTENCE")
                        self.sentences.append({
                            "text": eveSentence,
                            "pos": {
                                "x": sectionNum,
                                "y": sentenceNum,
                                "mark": mark
                            }
                        })
                        sentenceNum = sentenceNum + 1
                sectionNum = sectionNum + 1
                self.sentences[-1]["pos"]["mark"].append("LASTSENTENCE")
        for i in range(0, len(self.sentences)):
            if self.sentences[i]["pos"]["x"] == self.sentences[-1]["pos"]["x"]:
                self.sentences[i]["pos"]["mark"].append("LASTSECTION")
 
    def getKeywords(self):
        self.keywords = jieba.analyse.extract_tags(self.text, topK=20, withWeight=False, allowPOS=('n', 'vn', 'v'))
        return self.keywords
 
    def sentenceWeight(self):
        # 计算句子的位置权重
        for sentence in self.sentences:
            mark = sentence["pos"]["mark"]
            weightPos = 0
            if"FIRSTSECTION"in mark:
                weightPos = weightPos + 2
            if"FIRSTSENTENCE"in mark:
                weightPos = weightPos + 2
            if"LASTSENTENCE"in mark:
                weightPos = weightPos + 1
            if"LASTSECTION"in mark:
                weightPos = weightPos + 1
            sentence["weightPos"] = weightPos
 
        # 计算句子的线索词权重
        index = [" 总之 ", " 总而言之 "]
        for sentence in self.sentences:
            sentence["weightCueWords"] = 0
            sentence["weightKeywords"] = 0
        for i in index:
            for sentence in self.sentences:
                if sentence["text"].find(i) >= 0:
                    sentence["weightCueWords"] = 1
 
        for keyword in self.keywords:
            for sentence in self.sentences:
                if sentence["text"].find(keyword) >= 0:
                    sentence["weightKeywords"] = sentence["weightKeywords"] + 1
 
        for sentence in self.sentences:
            sentence["weight"] = sentence["weightPos"] + 2 * sentence["weightCueWords"] + sentence["weightKeywords"]
 
    def getSummary(self, ratio=0.1):
        self.keywords = list()
        self.sentences = list()
        self.summary = list()
 
        # 调用方法,分别计算关键词、分句,计算权重
        self.getKeywords()
        self.splitSentence()
        self.sentenceWeight()
 
        # 对句子的权重值进行排序
        self.sentences = sorted(self.sentences, key=lambda k: k['weight'], reverse=True)
 
        # 根据排序结果,取排名占前 ratio% 的句子作为摘要
        for i in range(len(self.sentences)):
            if i < ratio * len(self.sentences):
                sentence = self.sentences[i]
                self.summary.append(sentence["text"])
 
        return self.summary
 
 
def main_handler(event, context):
    nlp = NLPAttr(json.loads(event['body'])['text'])
    return {
        "keywords": nlp.getKeywords(),
        "summary": "。".join(nlp.getSummary())
    }

编写项目serverless.yaml文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nlpDemo:
  component:"@serverless/tencent-scf"
  inputs:
    name:nlpDemo
    codeUri:./
    handler:index.main_handler
    runtime:Python3.6
    region:ap-guangzhou
    description:文本摘要/关键词功能
    memorySize:256
    timeout:10
    events:
      -apigw:
          name:nlpDemo_apigw_service
          parameters:
            protocols:
              -http
            serviceName:serverless
            description:文本摘要/关键词功能
            environment:release
            endpoints:
              -path:/nlp
                method:ANY

由于项目中使用了 jieba,所以在安装的时候推荐在 CentOS 系统下与对应的 Python 版本下安装,也可以使用我之前为了方便做的一个依赖工具:

Serverless 实战:如何结合NLP实现文本摘要和关键词提取?

通过 sls --debug 进行部署:

Serverless 实战:如何结合NLP实现文本摘要和关键词提取?

部署完成,可以通过 PostMan 进行简单的测试:

Serverless 实战:如何结合NLP实现文本摘要和关键词提取?

从上图可以看到,我们已经按照预期输出了目标结果。至此,文本摘要 / 关键词提取的 API 已经部署完成。

总结

相对来说,通过 Serveless 架构做 API 是非常容易和方便的,可实现 API 的插拔行,组件化,希望本文能够给读者更多的思路和启发。

Serverless Framework 30 天试用计划

我们诚邀您来体验最便捷的 Serverless 开发和部署方式。在试用期内,相关联的产品及服务均提供免费资源和专业的技术支持,帮助您的业务快速、便捷地实现 Serverless!

详情可查阅:https://cloud.tencent.com/document/product/1154/38792

One More Thing

3 秒你能做什么?喝一口水,看一封邮件,还是 —— 部署一个完整的 Serverless 应用?复制以下链接至 PC 浏览器访问:

china.serverless.com/express

3 秒极速部署,立即体验史上最快的 Serverless  HTTP 实战开发!

传送门:

  • GitHub: github.com/serverless
  • 官网:serverless.com

点击阅读原文,访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ServerlessCloudNative 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TF-IDF应用:自动提取关键词、找相似文章、自动摘要
这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题。 有一篇很长的文章,我要用计算机提取它的关键词(Automatic Keyphrase extraction),完全不加以人工干预,请问怎样才能正确做到? 这个问题涉及到数据挖掘、文本处理、信息检索等很多计算机前沿领域,但是出乎意料的是,有一个非常简单的经典算法,可以给出令人相当满意的结果。它简单到都不需要高等数学,普通人只用10分钟就可以理解,这就是我今天想要介绍的TF-IDF (https://en.wikipedia.org/wiki/Tf%
机器学习AI算法工程
2018/03/13
4.4K0
TF-IDF应用:自动提取关键词、找相似文章、自动摘要
Serverless实践系列(一):如何通过SCF与自然语言处理为网站赋能
自然语言的内容有很多,今天本文所介绍的自然语言处理部分是“文本摘要”和“关键词提取”。在做博客的时候,经常会发一些文章,这些文章发出去了,有的很容易被搜索引擎检索,有的则很难,那么有没有什么方法,让博客对搜索引擎友好一些呢?
腾讯云serverless团队
2019/06/21
4360
SCF与自然语言处理为你的网站赋能
自然语言的内容有很多,今天本文所介绍的自然语言处理部分是“文本摘要”和“关键词提取”,很多朋友都应该有自己的博客,在做博客的时候,经常会发一些文章,这些文章发出去了,有的很容易被搜索引擎检索,有的则很难,那么有没有什么方法,让博客对搜索引擎友好一些呢?这里有一个好方法:
None-xiaomi
2019/05/10
10.6K1
深度解析NLP文本摘要技术:详解与实战
文本摘要是自然语言处理(NLP)的一个重要分支,其核心目的是提取文本中的关键信息,生成简短、凝练的内容摘要。这不仅有助于用户快速获取信息,还能有效地组织和归纳大量的文本数据。
TechLead
2023/10/21
2.9K0
深度解析NLP文本摘要技术:详解与实战
【NLP自然语言处理】TextRank揭秘:文本摘要与关键词提取的强大算法
小言从不摸鱼
2025/01/17
2920
【NLP自然语言处理】TextRank揭秘:文本摘要与关键词提取的强大算法
关于自然语言处理系列-关键词提取
自然语言处理包括中文分词、词性标注、关键词抽取、依存句法分析、文本分类接口情感分析、词义相似度计算、实体标识、文本摘要等等,慢慢来吧,看看一步步能到什么程度。本文实现的是关键词提取。
python与大数据分析
2022/03/11
5090
关于自然语言处理系列-关键词提取
中文NLP笔记:3. 关键词提取的几个方法
  TF-IDF :用于反映一个词对于某篇文档的重要性。过滤掉常见的词语,保留重要的词语
杨熹
2019/01/28
3.6K0
中文NLP笔记:3. 关键词提取的几个方法
nlp 关键词提取_nlp信息抽取
关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作。
全栈程序员站长
2022/09/29
1.1K0
nlp 关键词提取_nlp信息抽取
serverless在标签系统的应用
大部分业务系统,都有丰富的数据,比如商品,用户信息,物流信息等等。这里以电商为例,一个电商系统都有品类丰富的商品,用户数据,,如何对这些商品归门别类,如何去发掘这些商品的特性都是一个难题。难点在于商品种类多,以国内某电商为例,spu维度商品多达三百多万,size维度商品更是有两千万。这些商品被录入资料的时候信息往往是不准确的,一是因为商家为了搜索流量,会给商品加上各种不存在的属性,比如冬天的衣服,可能商家会加上夏天的标签,这样用户搜索夏装也能搜索出来。还有一点是资料维护不全,很多商品资料就简单几句描述,这些商品很可能就会淹没在海量商品中。除此之外,如何发掘商品的动态特征也不是人工能发现的,比如商品的限量趋势,动销率,口碑等等。那么就需要有一个手段,去挖掘商品的特征。
haimingli
2020/12/29
8310
关于自然语言处理系列-文本摘要提取
python最大的好处就是有无穷无尽的包资源,如何把这些包资源组合起来发挥其应有的价值也是一个很重要的工作。比如NLP的文本摘要提取就有几个现成的可以实现,如snownlp,goose3,sumy,虽然摘要效果未必理想。
python与大数据分析
2022/03/11
7180
关于自然语言处理系列-文本摘要提取
实战关键词提取
关键词是代表文章重要内容的一组词,在文献检索、自动文摘、文本聚类/分类等方面有着重要的应用。现实中大量的文本不包含关键词,这使得便捷获取文本信息更困难,所以自动提取关键词技术具有重要的价值和意义。
伊泽瑞尔
2022/05/31
8610
实战关键词提取
HanLP《自然语言处理入门》笔记--9.关键词、关键句和短语提取
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP
mantch
2020/02/21
3.4K0
HanLP《自然语言处理入门》笔记--9.关键词、关键句和短语提取
关于自然语言处理系列-文本摘要提取进阶
关于自然语言处理重要的一个部分是文本摘要,文本摘要的提取涉及到分词、断句、文本权重问题;分词前文已述,断句通过正则表达式完成;文本权重又包括句子的tfidf权重、文本相似度权重和句子的位置权重;关于权重又涉及到归一化处理和权重的权值等等。总的来说提取的摘要质量要比之前的snownlp、sumy、goose直接拿来用效果要好一些。
python与大数据分析
2022/03/11
6610
Jieba中文分词 (二) ——词性标注与关键词提取
上一篇jieba中文分词(一)分词与自定义字典已介绍了jieba中文分词安装,分词原理,分词方法,自定义字典,添加字典等多种常用分词方法。本篇将继续介绍jieba分词关键词提取、词性标注、及常见问题。
数据STUDIO
2021/06/24
8.3K0
python 中文情感分析 Snownlp库的使用
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode编码。
叶庭云
2020/09/17
12.1K0
python 中文情感分析  Snownlp库的使用
NLP基本工具之jieba:关键词提取、词性标注
jieba除了上一篇介绍的基本功能--分词之外,还可以进行关键词提取以及词性标注。
用户7164815
2020/04/26
3.2K0
python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库
“结巴”中文分词:做最好的 Python 中文分词组件,分词模块jieba,它是python比较好用的分词模块, 支持中文简体,繁体分词,还支持自定义词库。 jieba的分词,提取关键词,自定义词语。 结巴分词的原理 这里写链接内容 一、 基于结巴分词进行分词与关键词提取 1、jieba.cut分词三种模式 jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型 jieba.cut_for
学到老
2018/03/19
20.6K0
python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库
python snownlp情感分析简易demo
SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。MIT许可下发行。 其 github 主页 我自己修改了上文链接中的python代码并加入些许注释,以方便你的理解:
Ryan_OVO
2023/10/18
2930
python snownlp情感分析简易demo
初学者|今天掌握SnowNLP好不好
本文简绍了SnowNLP的使用方法,这是一个处理中文文本内容的python类库,其主要功能包括分词、词性标注、情感分析、汉字转拼音、繁体转简体、关键词提取以及文本摘要等等。
yuquanle
2019/05/27
1.8K0
文本挖掘(三)python 基于snownlp做情感分析
  简介:文本挖掘中,情感分析是经常需要使用到,而进行主题模型分析之前,对数据集进行文本分类再进行分析具有必要性,因为分类以后,每一类的主题才会更明显。而snownlp是一个python写的类库,可以方便的处理中文文本内容,主要看上了他的情感分类功能(二分类),分类是基于朴素贝叶斯的文本分类方法,当然也可以选择基于其他方法自己建立一个分词模型。
forxtz
2021/03/12
2.7K0
推荐阅读
相关推荐
TF-IDF应用:自动提取关键词、找相似文章、自动摘要
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验