福利!一套简单、好用、有效的文本摘要代码,无偿分享大家

如何有效分享代码(分享代码的软件大全)

我是@老K玩代码,非IT创业者。专注分享实战项目和行业资讯,已累计分享超1000实战项目!

前言

资源在文末

文本摘要是现在自然语言处理中非常常见,应用也比较广泛的任务类型,商用化的接口也有很多,比如百度大脑以及飞浆提供的api。但缺点是需要支付费用,而且大多都有起始门槛,算下来价格并不便宜,所以并不推荐个人用户。

与其用别人的,不如动手自给自足。老K写了一个基础的文本摘要代码,打算分享给大家。

本着”授人以鱼不如授人以渔“的观念,本篇文章先教后送,只想要代码的可以直接拉到文章末尾

本次分享的代码旨在抛砖引玉,后续会陆续分享更多有意思的实战项目,建议

如何有效分享代码(分享代码的软件大全)

文本摘要介绍

文本摘要(Text Summarization)是自然语言处理任务中一种重要且常见的任务,可以将冗长的原始文本转换成包含关键词信息的精简文本。帮助用户在只阅读摘要文本就能获取文章主旨和内容的实用目的。

在现实场景中,用得到文本摘要的地方颇多,如:

新闻摘要,在新闻推送时应用较多;文章速读,语文教学中协助提炼思想和核心内容;论文题干,为论文的摘要提供参考;搜索引擎,根据搜索需求呈现结果的核心内容;

文本摘要模型

文本摘要的适用模型有很多,常见的可以分为两大类:抽取型摘要概要型摘要

一. 抽取型摘要(Extraction based Summarization)

在长文本中提取的词句,组成文本。

其优点是简单、、易于理解

缺点则是容易产生语法或逻辑错误

以下是常见的几个抽取型摘要的作业思路:

1. 基于词频:

将文档拆分为句子,利用诸如tfidf的词频统计模型,根据词频权重计算出整句权重,提取高权重的句子组成摘要。

本文的代码也将基于该逻辑来实现。

2. 基于textrank

textrank是基于google的pagerank算法衍生出来的解决方案,依照pagerank算法给每个句子一个”对络重要程度”的得分,提取得分高的句子组成摘要。

3. 基于词嵌入聚类

词嵌入聚类(embedding clustering)是将拆分后的句子表示为句子向量,再用诸如K-means的聚类方法将句子分成多个簇,再从每个簇里摘取句组成摘要。

二. 概要型摘要

基于深度学习技术,实现对原始文本的理解和精简,生成代表原始文本重要信息的新短语以及句子。

其优点是有效克服语法错误的问题

缺点则是模型训练成本较高,且需要大量标记数据

以下是常见的几个概要型摘要的作业思路:

1. 基于seq2seq模型

训练一个seq2seq模型(如transformer),以监督学习的方式生成文本摘要。

实战部分

1. 引入依赖库

from collections import defaultdict
from nltk.tokenize importsent_tokenize, word_tokenize
from stringimport punctuation
import jieba
from heapq import nlargestcollections是python自带的一个标准库,用来处理各种集合,我们这次需要用到它的defaultdict,它可以给我实例化一个定义好数据类型的dict;nltk是非常强大的自然语言处理工具库,以后我可能会专门做一系列关于nltk为主题的文章。这次我们会用到它的tokenize组件,用来对文本进行拆分;punctuation是string中自带的一个标点符号类;jieba是最常用的中文分词工具,人尽皆知就不赘述了;heapq中的nlargest,功能如其名,是用来筛选值的工具。

2. 文本预处理

text = raw.replace(“。”, “. “).replace(“,”, “, “).replace(“””, “””).replace(““”, “””)
text = text.replace(“!”, “! “).replace(“?”, “? “).replace(“:”, “: “).replace(“;”, “; “)
text= .join(jieba.lcut(text))由于,我们应用的nltk是基于英语语言实现的库,所以我们先要把获得到的文本根据英文规则重置;首先,是用来判断和拆分句子的标点符号,我们统一换成半角符号;其次,用来判断单词的空格符号,我们利用jieba 分词后重新整理文本。sents= sent_tokenize(text)
token= [word_tokenize(sent) for sent in sents]利用nltk的sent_tokenize方法将文本拆分为句子;利用nltk的word_tokenzie方法将句子进一步拆分为单词,即token。

3. 词频统计

freq = defaultdict(int)
for word in jieba.lcut(text):
if word not in list(punctuation) and word != ” “:
freq[word] += 1利用defaultfict生成默认值为0的dict;遍历jieba分词后的单词;使用包括punctuation在内的库,对word进行过滤;进行词频的统计。m = max(freq.values())
forword in freq:
freq[word] /= m计算得到的词频数;根据词频,将所有word的词频转换为频率。

4. 提取句

ranking = defaultdict(int)
for i, sent in enumerate(token):
for word in sent:
if word in freq:
ranking[i] += freq[word]用freq的结果作为权重,计算出每个句子的得分。idx = nlargest(sent_len, ranking, key=ranking.get)
idx = sorted(idx)利用nlargest方法,从ranking中获取句子权重的sent_len个句子,作为句;用sorted将句索引根据顺序排列。

5. 整理输出

summary = [sents[i].replace(, ) for i inidx]
summary =“n”.join(summary)
print(summary)根据获取到的句子索引idx,将句子从语料中提取出来;用n将句子组合成摘要;进行输出。

总结和说明

以上代码仅为抛砖引玉,供入门使用。模型思路本身简单,但实际应用效果仍然比较。 后续会考虑出几期textrank、bertsum以及transformer的案例代码分享,有需要的可以

以下是完整代码,如有需要,也可到同名公微,关键词textsum :

from collections import defaultdict

from nltk.tokenize import sent_tokenize, word_tokenize
from string import punctuation
import jieba
from heapq import nlargest

text =“Your Text Here.”

text = text.replace(“。”, “. “).replace(“,”, “, “).replace(“””, “””).replace(““”, “””)
text = text.replace(“!”, “! “).replace(“?”, “? “).replace(“:”, “: “).replace(“;”, “; “)
text = .join(jieba.lcut(text))

sents= sent_tokenize(text)
token = [word_tokenize(sent)for sent in sents]

freq = defaultdict(int)
for word in jieba.lcut(text):
if word notin list(punctuation)and word != ” “:
freq[word] += 1

m = max(freq.values())
for word in freq:
freq[word] /= mranking = defaultdict(int)
for i, sent in enumerate(token):
for word in sent:
if word in freq:
ranking[i] += freq[word]
idx = nlargest(13, ranking, key=ranking.get)
idx = sorted(idx)

summary = [sents[i].replace(, )for i in idx]
summary = “n”.join(summary)

print(summary)

作者介绍

如何有效分享代码(分享代码的软件大全)

我是@老K玩代码,非IT创业者。专注分享实战项目和行业资讯,已累计分享超1000实战项目!

全同名,欢迎通过各种渠道和我交流。