Chinese NewsTitle Generation Project by GPT2.带有超级详细注释的中文GPT2新闻标题生成项目。

Overview

GPT2-NewsTitle

带有超详细注释的GPT2新闻标题生成项目

UpDate 01.02.2021

  • 从网上收集数据,将清华新闻数据、搜狗新闻数据等新闻数据集,以及开源的一些摘要数据进行整理清洗,构建一个较完善的中文摘要数据集。
  • 数据集清洗时,仅进行了简单地规则清洗。例如:清洗htlm标记、去除多余空字符、去除图片标记等。
  • 处理后数据集详细信息,见数据集描述
数据 原始数据/项目地址 处理后文件下载地址
清华新闻数据 地址 百度云盘 提取码: vhol
搜狗新闻数据 地址 百度云盘 提取码:ode6
nlpcc2017摘要数据 地址 百度云盘 提取码:e0zq
csl摘要数据 地址 百度云盘 提取码:0qot
教育培训行业摘要数据 地址 百度云盘 提取码:kjz3
lcsts摘要数据 地址 百度云盘 提取码:bzov
神策杯2018摘要数据 地址 百度云盘 提取码:6f4f
万方摘要数据 地址 百度云盘 提取码: p69g
微信公众号摘要数据 地址 百度云盘 提取码: 5has
微博数据 地址 百度云盘 提取码: 85t5
news2016zh新闻数据 地址 百度云盘 提取码: qsj1

数据集集合:百度云盘 提取码: 7am8

项目描述

  • 本项目是一个带有超级详细中文注释的基于GPT2模型的新闻标题生成项目。
  • 本项目参考了GPT2-ChineseGPT2-chitchatCDial-GPTGPT2等多个GPT2开源项目,并根据自己的理解,将代码进行重构,添加详细注释,希望可以帮助到有需要的人。
  • 本项目使用HuggingFace的transformers实现GPT2模型代码编写、训练及测试。
  • 本项目通过Flask框架搭建了一个Web服务,将新闻摘要生成模型进行工程化,可以通过页面可视化地体验新闻标题生成效果。
  • 本项目的代码详细讲解,可以自行阅读代码,也可查看代码注释介绍
  • 本项目提供的新闻标题模型是一个6层的小模型(其实是穷人没人卡,只能训练小模型),并且在训练该模型过程中,没有加载预训练的GPT2模型而是随机初始化的参数,并且训练轮数较少(5轮,还没收敛完),因此效果一般。如果想要更好效果的模型,可以按照个人需求训练一个模型。
  • 本项目的目的是带领大家走一遍GPT2生成模型的训练、测试及部署全部流程。

文件结构

  • config
    • config.json 模型的配置信息,包含n_ctx、n_embd、n_head、n_layer等。
  • vocab
    • vocab.txt 字典文件,该字典为大小为13317,删除了将原始字典中的“##中文”,并且增加了“[Content]”、“[Title]”、“[Space]”等标记。
  • data_dir 存放数据的文件夹
  • templates 存放html页面的文件夹
  • data_helper.py 数据预处理文件,将数据进行简单的清洗
  • data_set.py 数据类文件,定义模型所需的数据类,方便模型训练使用
  • model.py GPT2模型文件,主要对transformers包中GPT2LMHeadModel的重写,修改计算loss部分,只计算预测title部分的loss
  • train.py 通过新闻正文生成新闻标题的GPT2模型的训练文件
  • generate_title.py 根据训练好的模型,进行新闻标题生成,预测文件
  • http_server.py 构建web服务文件

运行环境

  • gevent == 1.3a1
  • flask == 0.12.2
  • transformers == 3.0.2

详细见requirements.txt文件

数据集

数据来源于新浪微博,数据链接:https://www.jianshu.com/p/8f52352f0748?tdsourcetag=s_pcqq_aiomsg

数据描述 下载地址
原始数据 百度网盘,提取码: nqzi
处理后数据 百度网盘,提取码: duba

原始数据为直接从网上下载的新闻数据,处理后数据为使用data_helper.py处理过的数据,可直接用于训练。

模型参数

详细见config/config.json文件

参数
initializer_range 0.02
layer_norm_epsilon 1e-05
n_ctx 512
n_embd 768
n_head 12
n_layer 6
n_positions 512
vocab_size 13317

注意:模型输入除了各个词的向量表示外,还包括文字段落向量表示和位置向量表示。

模型文件分享

模型 下载地址
GPT2模型 百度网盘,提取码: 165b

模型训练

python3 train.py
或
python3 train.py --output_dir output_dir/(自定义保存模型路径) 

训练参数可自行添加,包含参数具体如下:

参数 类型 默认值 描述
device str "0" 设置训练或测试时使用的显卡
config_path str "config/config.json" 模型参数配置信息
vocab_path str "vocab/vocab.txt" 词表,该词表为小词表,并增加了一些新的标记
train_file_path str "data_dir/train_data.json" 新闻标题生成的训练数据
test_file_path str "data_dir/test_data.json" 新闻标题生成的测试数据
pretrained_model_path str None 预训练的GPT2模型的路径
data_dir str "data_dir" 生成缓存数据的存放路径
num_train_epochs int 5 模型训练的轮数
train_batch_size int 16 训练时每个batch的大小
test_batch_size int 8 测试时每个batch的大小
learning_rate float 1e-4 模型训练时的学习率
warmup_proportion float 0.1 warm up概率,即训练总步长的百分之多少,进行warm up操作
adam_epsilon float 1e-8 Adam优化器的epsilon值
logging_steps int 20 保存训练日志的步数
eval_steps int 4000 训练时,多少步进行一次测试
gradient_accumulation_steps int 1 梯度积累
max_grad_norm float 1.0
output_dir str "output_dir/" 模型输出路径
seed int 2020 随机种子
max_len int 512 输入模型的最大长度,要比config中n_ctx小

或者修改train.py文件中的set_args函数内容,可修改默认值。

本项目提供的模型,共训练了5个epoch,模型训练损失和测试集损失分别如下:

模型其实还没有训练完全,按照loss走势,还可以继续训练。

模型测试

python3 generate_title.py
或
python3 generate_title.py --top_k 3 --top_p 0.9999 --generate_max_len 32

参数可自行添加,包含参数具体如下:

参数 类型 默认值 描述
device str "0" 设置训练或测试时使用的显卡
model_path str "output_dir/checkpoint-139805" 模型文件路径
vocab_path str "vocab/vocab.txt" 词表,该词表为小词表,并增加了一些新的标记
batch_size int 3 生成标题的个数
generate_max_len int 32 生成标题的最大长度
repetition_penalty float 1.2 重复处罚率
top_k int 5 解码时保留概率最高的多少个标记
top_p float 0.95 解码时保留概率累加大于多少的标记
max_len int 512 输入模型的最大长度,要比config中n_ctx小

测试结果如下:

从测试集中抽一篇
content:
今日,中国三条重要高铁干线——兰新高铁、贵广铁路和南广铁路将开通运营。其中兰新高铁是中国首条高原高铁,全长1776公里,最高票价658元。贵广铁路最贵车票320元,南广铁路最贵车票206.5元,这两条线路大大缩短西南与各地的时空距离。出行更方便了!中国“高铁版图”再扩容 三条重要高铁今日开通
title:
生成的第1个标题为:中国“高铁版图”再扩容 三条重要高铁今日开通
生成的第2个标题为:贵广铁路最高铁版图
生成的第3个标题为:出行更方便了!中国“高铁版图”再扩容三条重要高铁今日开通

从网上随便找一篇新闻
content:
值岁末,一年一度的中央经济工作会议牵动全球目光。今年的会议,背景特殊、节点关键、意义重大。12月16日至18日。北京,京西宾馆。站在“两个一百年”奋斗目标的历史交汇点上,2020年中央经济工作会议谋划着中国经济发展大计。习近平总书记在会上发表了重要讲话,深刻分析国内外经济形势,提出2021年经济工作总体要求和政策取向,部署重点任务,为开局“十四五”、开启全面建设社会主义现代化国家新征程定向领航。
title:
生成的第1个标题为:习近平总书记在京会上发表重大计划 提出2025年经济工作总体要求和政策
生成的第2个标题为:习近平总书记在会上发表重要讲话
生成的第3个标题为:习近平总书记在会上发表重要讲话,深刻分析国内外经济形势

解码采用top_k和top_p解码策略,有一定的随机性,可重复生成。

启动Flask服务

python3 http_server.py
或
python3 http_server.py --http_id "0.0.0.0" --port 5555

本地测试直接使用"127.0.0.1:5555/news-title-generate",如果给他人访问,只需将"127.0.0.1"替换成的电脑的IP地址即可。

具体如下图所示:

未来工作

  • 后期可能会将清华新闻数据、搜狗新闻数据等新闻数据集进行整理清洗,构建一个较完善的新闻标题数据集。
  • 后期可能会使用新闻数据训练一个小的GPT2预训练模型。
  • 后期可能会对已上传的新闻标题模型进行更新,训练一个效果较好的模型。

致谢

参考

Citing

@misc{GPT2-NewsTitle,
  author = {Cong Liu},
  title = {Chinese NewsTitle Generation Project by GPT2},
  year = {2020},
  publisher = {GitHub},
  journal = {GitHub repository},
  url="https://github.com/liucongg/GPT2-NewsTitle",
}

联系作者

e-mail:[email protected]

知乎:刘聪NLP

公众号:NLP工作站

Comments
  • 请问下具体配置,在实践代码过程中出现了Segmentation fault (core dumped)问题

    请问下具体配置,在实践代码过程中出现了Segmentation fault (core dumped)问题

    您好,想请问下您的具体配置,主要是版本问题,谢谢。 我的情况是,已经按照您给出的requirements进行了预装,其他环境如下: Python 3.7.6, CUDA 10.0,Tensorflow-gpu 2.0.0, Keras 2.3.1, Pytorch 1.3.1, cudNN 7.6 NVIDIA GeForce RTX 2080 Ti (矩池云) 在进行train.py时出现了Segmentation fault (core dumped)报错,无log文件也无具体报错信息。查询之后发现与TensorFlow等包的版本有关,想麻烦您share下更具体的信息,谢谢!

    opened by Adora2401 3
  • 分享几个有趣的结果,这个用来搞笑是挺不错的!

    分享几个有趣的结果,这个用来搞笑是挺不错的!

    输入的新闻正文为:参差感,或者说多元化,是今年《创造营2021》带来的一个大惊喜。学员的选角和发起人团的构成中,除了国际化这一特点外,学员们还有街舞、电竞、上班族等不同背景,发起人团成员来自影视、音乐、团体等不同领域——通过十期节目,《创造营2021》真实且深刻地呈现了不同成长背景下,多元文化、多元价值观碰撞与交流的过程。 生成的第1个标题为:“创造营2025” 生成的第2个标题为:《创造营space]营螂》真实于是什么样的? 生成的第3个标题为:学者:国际化的选角和发起人团体

    神评论:GPT2新技能:预测未来!坐等创造营2025

    输入的新闻正文为:从刘宇身上,能感受到的是十余年中国舞学习经历中所习得的文雅;赞多和力丸两位来自日本的世界级街舞舞者,展现出强悍的舞蹈实力,但同时二人身上又始终透露着来到异国他乡的彷徨失措;从夏威夷追梦到日本、再来到中国的米卡,则处处透露出对音乐的热爱,对友情的真诚。 生成的第1个标题为:中国舞蹈者:用力模仿奇幻 生成的第2个标题为:大写给力量 生成的第3个标题为:刘宇之父:中国的米卡

    神评论:中国的米卡成为了刘宇的父亲,米卡改国籍还可以收获一个儿子!

    opened by ghost 2
  • 想问问这是不是严格意义的GPT模型,个人感觉更像是类似于UniLM的Seq2Seq

    想问问这是不是严格意义的GPT模型,个人感觉更像是类似于UniLM的Seq2Seq

    感谢您的工作,因为初学所以对一些概念会比较抠字眼想搞明白,大佬见谅哈哈。您在模型优化时只计算了标题的loss,那么优化的就是P(标题|正文),一种条件概率,感觉这是一种seq2seq呀(有条件的语言模型),transformer同时作为了编码器和解码器,就和UniLM一样的思想,只是正文和标题您这里都用的GPT的单向注意力,而UniLM正文用双向,标题用单向。如果是严格意义的GPT,我的理解是无条件的语言模型,建模的是P(Y),而不是P(Y|X),会完整地“自己预测自己”,比如将正文标题拼接后作为一个完整的文本,然后错开一位,完整自己预测自己,当然这样的实现没有显式区分二者边界也不太适合实现标题生成,不知我的理解是否有误,谢谢大佬

    opened by anwjedb 2
  • checkpoint接着训练问题

    checkpoint接着训练问题

    您好:

    我想使用您在百度云上传的checkpoint接着往后训练几轮,但是报了一个警告好像是因为lr scheduler造成的。UserWarning: To get the last learning rate computed by the scheduler, please use get_last_lr(). warnings.warn("To get the last learning rate computed by the scheduler, " 跳过了第一轮epoch。

    想向您请教如何解决这个问题?

    非常感谢!

    opened by Sixy1204 1
  • 关于使用预训练GPT2权重的问题

    关于使用预训练GPT2权重的问题

    Hi,我使用预训练的GPT2模型(https://github.com/Morizeyao/GPT2-Chinese)并在微博数据上进行了实验,test_loss和train_loss都得到了大幅提升,如下图所示: 1636534305(1) 1636534317(1) 但是我是用测试集上的数据进行测试,却发现标题生成的效果似乎变差了, 1636534391(1) 1636534416(1) 不知道您对这个结果有什么看法?

    opened by Kaicheng-Yang0828 1
  • 是不是会出现 len(title_tokens) > self.max_len 的情况,这样会引起下面的 assert错误?

    是不是会出现 len(title_tokens) > self.max_len 的情况,这样会引起下面的 assert错误?

    def convert_feature(self, sample): ... input_ids = [] token_type_ids = [] # 对新闻正文进行tokenizer.tokenize分词 content_tokens = self.tokenizer.tokenize(sample["content"]) # 对新闻标题进行tokenizer.tokenize分词,注意tokenizer中已经将[Space]作为一个分隔符,不会切割成多个字符 title_tokens = self.tokenizer.tokenize(sample["title"].replace(" ", "[Space]")) # 判断如果正文过长,进行截断 if len(content_tokens) > self.max_len - len(title_tokens) - 3: content_tokens = content_tokens[:self.max_len - len(title_tokens) - 3] ...


    是不是会出现 len(title_tokens) > self.max_len 的情况,这样会引起下面的 assert错误?

    opened by 1024er 1
  • 使用pad_sequence了,是不是就不需要在上面extend了?

    使用pad_sequence了,是不是就不需要在上面extend了?

    def collate_func(batch_data): """ DataLoader所需的collate_fun函数,将数据处理成tensor形式 Args: batch_data: batch数据 Returns: """ batch_size = len(batch_data) # 如果batch_size为0,则返回一个空字典 if batch_size == 0: return {} input_ids_list, token_type_ids_list = [], [] # 获取一个batch数据中的最大长度 max_len = max([len(instance["input_ids"]) for instance in batch_data]) for instance in batch_data: # 按照batch中的最大数据长度,对数据进行padding填充 input_ids_temp = instance["input_ids"] input_ids_temp.extend([0]*(max_len-len(instance["input_ids"]))) token_type_ids_temp = instance["token_type_ids"] token_type_ids_temp.extend([0] * (max_len - len(instance["token_type_ids"]))) # 将list数据转换为tensor数据 # input_ids_list.append(torch.from_numpy(np.array(input_ids_temp, dtype=np.int32)).long()) # token_type_ids_list.append(torch.from_numpy(np.array(token_type_ids_temp, dtype=np.int32)).long()) input_ids_list.append(torch.tensor(input_ids_temp, dtype=torch.long)) token_type_ids_list.append(torch.tensor(token_type_ids_temp, dtype=torch.long)) return {"input_ids": pad_sequence(input_ids_list, batch_first=True, padding_value=0), "token_type_ids": pad_sequence(token_type_ids_list, batch_first=True, padding_value=0)}

    这个使用pad_sequence了,是不是就不需要在上面extend了?

    opened by 1024er 1
  • 你好,请问ModuleNotFoundError: No module named 'transformers.modeling_gpt2'

    你好,请问ModuleNotFoundError: No module named 'transformers.modeling_gpt2'

    出现一下错误怎么解决呢

    Traceback (most recent call last): File "E:\py\gpt1\generate_title.py", line 15, in from model import GPT2LMHeadModel File "E:\py\gpt1\model.py", line 14, in from transformers.modeling_gpt2 import GPT2PreTrainedModel, GPT2Model ModuleNotFoundError: No module named 'transformers.modeling_gpt2'

    opened by cxncoco 2
  • #关于BertTokenizer.from_pretrained()函数的一些问题

    #关于BertTokenizer.from_pretrained()函数的一些问题

    大佬,请问一下,在文件的实例化tokenizer和model下面的函数 image 这个图里面问题怎么解决 /usr/local/lib/python3.6/dist-packages/transformers/tokenization_utils_base.py:1656: FutureWarning: Calling BertTokenizer.from_pretrained() with the path to a single file or url is deprecated and won't be possible anymore in v5. Use a model identifier or the path to a directory instead. FutureWarning, load model ending! 我在本地运行python http_server.py是没有出现这个问题的,我根据提示将tokenizer = BertTokenizer.from_pretrained(args.vocab_path, do_lower_case=True)改为 tokenizer = BertTokenizer.from_pretrained('vocab/vocab.txt')do_lower_case=True 结果还是一样的结果 改为tokenizer = BertTokenizer.from_pretrained('vocab/vocab.txt')也不正确 改为tokenizer = BertTokenizer.from_pretrained('/cx/GPT2-NewsTitle-main/vocab/vocab.txt')`结果都是一样的,运行代码没有出现网页,求教

    opened by ashen1jqk 0
Owner
logCong
知乎:刘聪NLP 公众号:NLP工作站
logCong
A collection of Classical Chinese natural language processing models, including Classical Chinese related models and resources on the Internet.

GuwenModels: 古文自然语言处理模型合集, 收录互联网上的古文相关模型及资源. A collection of Classical Chinese natural language processing models, including Classical Chinese related models and resources on the Internet.

Ethan 66 Dec 26, 2022
Chinese real time voice cloning (VC) and Chinese text to speech (TTS).

Chinese real time voice cloning (VC) and Chinese text to speech (TTS). 好用的中文语音克隆兼中文语音合成系统,包含语音编码器、语音合成器、声码器和可视化模块。

Kuang Dada 6 Nov 8, 2022
vits chinese, tts chinese, tts mandarin

vits chinese, tts chinese, tts mandarin 史上训练最简单,音质最好的语音合成系统

AmorTX 12 Dec 14, 2022
Kashgari is a production-level NLP Transfer learning framework built on top of tf.keras for text-labeling and text-classification, includes Word2Vec, BERT, and GPT2 Language Embedding.

Kashgari Overview | Performance | Installation | Documentation | Contributing ?? ?? ?? We released the 2.0.0 version with TF2 Support. ?? ?? ?? If you

Eliyar Eziz 2.3k Dec 29, 2022
Kashgari is a production-level NLP Transfer learning framework built on top of tf.keras for text-labeling and text-classification, includes Word2Vec, BERT, and GPT2 Language Embedding.

Kashgari Overview | Performance | Installation | Documentation | Contributing ?? ?? ?? We released the 2.0.0 version with TF2 Support. ?? ?? ?? If you

Eliyar Eziz 2k Feb 9, 2021
Guide: Finetune GPT2-XL (1.5 Billion Parameters) and GPT-NEO (2.7 B) on a single 16 GB VRAM V100 Google Cloud instance with Huggingface Transformers using DeepSpeed

Guide: Finetune GPT2-XL (1.5 Billion Parameters) and GPT-NEO (2.7 Billion Parameters) on a single 16 GB VRAM V100 Google Cloud instance with Huggingfa

null 289 Jan 6, 2023
Kinky furry assitant based on GPT2

KinkyFurs-V0 Kinky furry assistant based on GPT2 How to run python3 V0.py then, open web browser and go to localhost:8080 Requirements: Flask trans

Sparki 1 Jun 11, 2022
Natural language processing summarizer using 3 state of the art Transformer models: BERT, GPT2, and T5

NLP-Summarizer Natural language processing summarizer using 3 state of the art Transformer models: BERT, GPT2, and T5 This project aimed to provide in

Samuel Sharkey 1 Feb 7, 2022
**NSFW** A chatbot based on GPT2-chitchat

DangBot -- 好怪哦,再来一句 卡群怪话bot,powered by GPT2 for Chinese chitchat Training Example: python train.py --lr 5e-2 --epochs 30 --max_len 300 --batch_size 8

Tommy Yang 11 Jul 21, 2022
Easy-to-use CPM for Chinese text generation

CPM 项目描述 CPM(Chinese Pretrained Models)模型是北京智源人工智能研究院和清华大学发布的中文大规模预训练模型。官方发布了三种规模的模型,参数量分别为109M、334M、2.6B,用户需申请与通过审核,方可下载。 由于原项目需要考虑大模型的训练和使用,需要安装较为复杂

null 382 Jan 7, 2023
A Chinese to English Neural Model Translation Project

ZH-EN NMT Chinese to English Neural Machine Translation This project is inspired by Stanford's CS224N NMT Project Dataset used in this project: News C

Zhenbang Feng 29 Nov 26, 2022
T‘rex Park is a Youzan sponsored project. Offering Chinese NLP and image models pretrained from E-commerce datasets

T‘rex Park is a Youzan sponsored project. Offering Chinese NLP and image models pretrained from E-commerce datasets (product titles, images, comments, etc.).

null 55 Nov 22, 2022
Toolkit for Machine Learning, Natural Language Processing, and Text Generation, in TensorFlow. This is part of the CASL project: http://casl-project.ai/

Texar is a toolkit aiming to support a broad set of machine learning, especially natural language processing and text generation tasks. Texar provides

ASYML 2.3k Jan 7, 2023
Toolkit for Machine Learning, Natural Language Processing, and Text Generation, in TensorFlow. This is part of the CASL project: http://casl-project.ai/

Texar is a toolkit aiming to support a broad set of machine learning, especially natural language processing and text generation tasks. Texar provides

ASYML 2.1k Feb 17, 2021
Integrating the Best of TF into PyTorch, for Machine Learning, Natural Language Processing, and Text Generation. This is part of the CASL project: http://casl-project.ai/

Texar-PyTorch is a toolkit aiming to support a broad set of machine learning, especially natural language processing and text generation tasks. Texar

ASYML 726 Dec 30, 2022
pkuseg多领域中文分词工具; The pkuseg toolkit for multi-domain Chinese word segmentation

pkuseg:一个多领域中文分词工具包 (English Version) pkuseg 是基于论文[Luo et. al, 2019]的工具包。其简单易用,支持细分领域分词,有效提升了分词准确度。 目录 主要亮点 编译和安装 各类分词工具包的性能对比 使用方式 论文引用 作者 常见问题及解答 主要

LancoPKU 6k Dec 29, 2022
Python library for processing Chinese text

SnowNLP: Simplified Chinese Text Processing SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob

Rui Wang 6k Jan 2, 2023
Chinese segmentation library

What is loso? loso is a Chinese segmentation system written in Python. It was developed by Victor Lin ([email protected]) for Plurk Inc. Copyright &

Fang-Pen Lin 82 Jun 28, 2022