摘要在目录前还是后(摘要查重吗)

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

摘要在目录前还是后(摘要查重吗)

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


前言

资源在文末

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

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

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

本次分享的代码旨在抛砖引玉,后续会陆续分享更多有意思的实战项目,建议关注频道、收藏文章

摘要在目录前还是后(摘要查重吗)


文本摘要介绍

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

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

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

文本摘要模型

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

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

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

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

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

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

1. 基于词频:

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

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

2. 基于textrank

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

3. 基于词嵌入聚类

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

二. 概要型摘要

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

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

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

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

1. 基于seq2seq模型

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


实战部分

1. 引入依赖库

from collections import defaultdict
from nltk.tokenize import sent_tokenize, word_tokenize
from string import punctuation
import jieba
from heapq import nlargest
  • collections是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())
for word 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 in idx]
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 not in list(punctuation) and word != " ":
        freq[word] += 1

m = max(freq.values())
for word in freq:
    freq[word] /= m

ranking = 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实战项目!

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

............试读结束............

查阅全文加微信3231169

如来写作网gw.rulaixiezuo.com(可搜索其他更多资料)

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 3231169@qq.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.qingsongxiezuo.com/585.html
(0)
上一篇 2022年6月22日 下午2:45
下一篇 2022年6月22日 下午2:45

相关推荐