Giter Site home page Giter Site logo

ethan-yt / guwenbert Goto Github PK

View Code? Open in Web Editor NEW
480.0 6.0 41.0 2.16 MB

GuwenBERT: 古文预训练语言模型(古文BERT) A Pre-trained Language Model for Classical Chinese (Literary Chinese)

License: Apache License 2.0

bert classical-chinese literary-chinese guwenbert transformers

guwenbert's Introduction

中文说明 | English



GitHub issues GitHub stars GitHub license

GuwenBERT是一个基于大量古文语料的RoBERTa模型。

在自然语言处理领域中,预训练语言模型(Pre-trained Language Models)已成为非常重要的基础技术。 目前互联网上存在大量的现代汉语BERT模型可供下载,但是缺少古文的语言模型。 为了进一步促进古文研究和自然语言处理的结合,我们发布了古文预训练模型GuwenBERT

对于古文的常见任务:断句,标点,专名标注,目前通常采用序列标注模型。这类模型非常依赖预训练的词向量或者BERT,所以一个好的语言模型可以大幅提高标注效果。经过实验,在古文NER任务中我们的BERT比目前最流行的中文RoBERTa效果提升6.3%,仅仅300步就可以达到中文RoBERTa的最终水平,特别适合标注语料不足的小数据集。使用我们的模型也可以减少数据清洗,数据增强,引入字典等繁琐工序,在评测中我们仅仅用了一个BERT+CRF的模型就可以达到第二名。

  • GuwenBERT基于殆知阁古代文献语料训练,其中包含15,694本古文书籍,字符数1.7B。所有繁体字均经过简体转换处理。

  • GuwenBERT的词表是基于古文语料构建的,取其中高频字符,大小为23,292。

  • 基于继续训练技术(Continue Training),GuwenBERT结合现代汉语RoBERTa权重和大量古文语料,将现代汉语的部分语言特征向古代汉语迁移以提升表现。

相关项目

  • CCLUE: 古文语言理解测评基准
  • GuwenModels: 古文自然语言处理模型合集, 收录互联网上的古文相关模型及资源.

在线体验

古文预训练语言模型

image

点击图片或这里跳转。第一次计算可能需要加载模型,请多等一会。

古文自然语言处理流水线

image

点击图片或这里跳转。

新闻

2021/7/25 和下游任务相关的模型、代码已经上传,欢迎star:https://github.com/Ethan-yt/guwen-models

2020/10/31 CCL2020会议分享:基于继续训练的古汉语语言模型 slides

2020/10/25 我们的模型已接入Huggingface Transformers,查看使用说明

2020/9/29 我们的模型获得2020年“古联杯”古籍文献命名实体识别评测大赛 二等奖

使用说明

Huggingface Transformers

依托于Huggingface Transformers,可轻松调用以下模型

  • ethanyt/guwenbert-base:12-layer, 768-hidden, 12-heads
  • ethanyt/guwenbert-large:24-layer, 1024-hidden, 16-heads

代码如下

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained("ethanyt/guwenbert-base")

model = AutoModel.from_pretrained("ethanyt/guwenbert-base")

Note: 由于本工作使用中文语料,RoBERTa原作Tokenizer是基于BPE算法的,对中文不太友好,所以这里使用BERT的分词器。这个配置已经写入config.json,所以直接使用AutoTokenizer会自动加载BertTokenizer, AutoModel会自动加载RobertaModel

模型下载

我们提供的模型是PyTorch版本,如果需要tensorflow版本请自行通过Transformers提供的转换脚本进行转换。

直接下载

通过huggingface官网直接下载:

https://huggingface.co/ethanyt/guwenbert-base

https://huggingface.co/ethanyt/guwenbert-large

拉到最下方点击"List all files in model" → 在弹框中下载每个文件。

镜像

**大陆境内用户如果无法直接下载huggingface hub的模型,可以使用以下镜像:

模型名称 大小 百度网盘
guwenbert-base 235.2M 链接 提取码: 4jng
guwenbert-large 738.1M 链接 提取码: m5sz

评测结果

2020年“古联杯”古籍文献命名实体识别评测大赛-第二名

本评测任务由古联(北京)数字传媒科技有限公司举办。古籍文献的整理和分析对数字人文研究和中华文化传承具有重要意义。命名实体识别在古籍文献处理过程中极为重要,是其他工作得以顺利开展的关键。该项工作会影响到古文自动标点、文白翻译等一系列自动化处理工作,因此,能够从古籍文献中自动识别出专名信息是一项非常重要且有价值的工作。

具体任务为:根据给定的古籍篇章,将候选篇章中的命名实体提取出来,并且按照既定类别进行归并。提取出来的实体名称大致分为两类:书名和其他专名(含人名、地名、朝代名、民族名等)。

数据集方面:分为训练数据和评测数据,涉及经、史、子、集等1900多篇古籍文本。训练数据为带有标签的文本文件,共计1063291字符(计空格),含11068组书名,10040组专名。

实体类型 Precision Recall F1
书名 77.50 73.73 75.57
其他专名 85.85 89.32 87.55
平均值 83.88 85.39 84.63

FAQ

有任何问题可以直接在Issue区留言,或者直接邮件联系我。这里会总结一些常见问题。

Q: “古联杯”评测数据集可以公开吗?

A: 和主办方通过邮件询问了一下,主办方表示不能公开,如有需要可以联系[email protected]

Q: 预训练时,阶段1和阶段2使用的是相同的语料吗?阶段1训练时是否掺入了现代汉语的语料?

A: 两个阶段的语料、任务相同,唯一不同的只是第一阶段冻结了Transformer层,以便学习embeddings

使用建议

  • 初始学习率是非常重要的一个参数,需要根据目标任务进行调整。
  • 对于需要用到CRF的模型,请将CRF层的学习率调大,一般为RoBERTa的100倍以上

预训练过程

Note: 本节介绍的是预训练的过程,微调不要参考本节配置

模型首先由hfl/chinese-roberta-wwm-ext初始化,然后按照以下两步训练:第一步,模型只更新Embedding层;第二步,所有参数共同更新。模型在 4 块 V100 上训练 120K 步(第一步 20K, 第二步 100K)。



详细的超参数设置如下:

Name Value
Batch size 2,048
Seq Length 512
Optimizer Adam
Learning Rate 2e-4(base), 1e-4 (large)
Adam-eps 1e-6
Weight Decay 0.01
Warmup 5K steps, linear decay of learning rate after.

引用

如果本文中的内容对你的研究工作有所帮助,欢迎在论文中引用本工作。由于论文尚未发表,可以暂时以脚注的形式

\footnote{GuwenBERT \url{https://github.com/ethan-yt/guwenbert}}.

免责声明

报告中所呈现的实验结果仅表明在特定数据集和超参组合下的表现,并不能代表各个模型的本质。 实验结果可能因随机数种子,计算设备而发生改变。 该项目中的内容仅供技术研究参考,不作为任何结论性依据。使用者可以在许可证范围内任意使用该模型,但我们不对因使用该项目内容造成的直接或间接损失负责。

感谢

本工作是基于中文BERT-wwm继续训练的。

guwenbert's People

Contributors

ethan-yt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

guwenbert's Issues

关于新建词表

看到说明说是基于现代汉语的参数训练的,可词表是重新排序后更新的,请问这样也能work吗?

预训练模型的问题

你好,我在调用你的guwenbert-tf的时候 会给我报错 如图
795c7cddecea5de7d833f6b7a61fd60

但是我用roberta的时候并不会

关于未来的工作计划

古文预训练模型真正的用途是下游任务的处理,目前这个repo只展示了语言模型和专名识别的结果,其中专名识别数据集按照主办方要求是不能公开的,所以未来的工作安排如下:

  1. 根据不同的下游任务整理规范的、划分好的数据集。目前数据来源我只知道可以通过daizhige获取,如果有推荐的其他开放数据源可以回帖补充。整理标准的数据集对整个古文研究都有很大的推进作用,可以便于评测和对比不同的模型表现。
  2. 断句任务。数据集可以通过移除标点生成。
  3. 加注标点任务。数据集生成方式同上。
  4. 书名识别任务。数据集通过抓取字典生成。

欢迎各位补充其他下游任务,注意任务必须是NLU类型任务,暂时不考虑生成式任务。

当然这些工作只有我一个人完成是比较困难的,欢迎有兴趣的朋友联系我,或者在Github留言,一起为促进古文研究的发展作出贡献。

添加新的标签

您好!请问如何添加新的标签?我希望增加新的标签,如[POS] [NEG],但是添加在vocab.txt里tokenizer还是无法识别,只能读取成'[' '[UNK]' ']'这样。而且如果增加了vocab.txt的行数,将token输入模型时还会报错index超界。

感觉效果不太好

fill-mask mask_token:
[CLS] 晋 太 元 中 , 武 [MASK]人 捕 鱼 为 业 。 [SEP]

[CLS] 晋 太 元 中 , 武 昌 人 捕 鱼 为 业 。 [SEP] 0.407
[CLS] 晋 太 元 中 , 武 陵 人 捕 鱼 为 业 。 [SEP] 0.199
[CLS] 晋 太 元 中 , 武 康 人 捕 鱼 为 业 。 [SEP] 0.147
[CLS] 晋 太 元 中 , 武 进 人 捕 鱼 为 业 。 [SEP] 0.082
[CLS] 晋 太 元 中 , 武 阳 人 捕 鱼 为 业 。 [SEP]

输入两个句子导致索引越界

使用其他模型名字可以使用(代码只改了模型名,全部使用transfomer 的Auto类),使用chinese-bert-wwm或者其他模型可以,但是使用guwenbert报cuda出错,在模型前馈计算时出错
image

请问从huggingface下载的模型怎么使用

你好:
我从huggingface上面下载了guwen-punc的模型,通过readme获得到了tokenizer和model。请问我该怎么才能或得到像在huggingface上面api那样或得到json呢

想请教一下模型结构的问题,为什么模型权重从pooler层之后就没有了

我发现您的模型与原本的roberta模型相比,从pooler层之后就少了一些层(用于MLM训练的一些层)。由于我本人需要用tensorflow版的checkpoint,所以将您的checkpoint转化为了tensorflow版,(可以确保转换脚本没有问题)但是发现在pooler层后少了以下最后几层:
cls/predictions/output_bias (DT_FLOAT) [21128]
cls/predictions/transform/LayerNorm/beta (DT_FLOAT) [768]
cls/predictions/transform/LayerNorm/gamma (DT_FLOAT) [768]
cls/predictions/transform/dense/bias (DT_FLOAT) [768]
cls/predictions/transform/dense/kernel (DT_FLOAT) [768,768]
cls/seq_relationship/output_bias (DT_FLOAT) [2]
cls/seq_relationship/output_weights (DT_FLOAT) [2,768]
global_step (DT_INT64) []
所以当我load权重的时候报错:
tensorflow.python.framework.errors_impl.NotFoundError: Key cls/predictions/transform/dense/kernel not found in checkpoint
意思是'cls/'这几层在checkpoint里没有。这是为什么呢?为什么您的权重会从pooler层后就没有了。。我开始以为是我的转换脚本有问题,后来直接去读您的pytorch checkpoins发现最后也确实是只有pooler那两层:
pooler.dense.weight
pooler.dense.bias
pooler层后面就没有Roberta TensorFlow checkpoint 'cls/'这几层,导致我的模型加载不了TensorFlow checkpoint, 很难受。。为什么会没有呢, 按理说在做MLM预训练的时候这几层必然是要有的才对,我也需要接着您的权重做MLM训练。

断句如何实现

作者您好,我想请问一下如何使用这个模型来进行断句。

Mask值

你好,我想问一下mask处格式是什么啊,比如输入是 [0, 55, 34, 76, 89, 1, 1, 1, 1],对应的mask是 [1, 1, 1, 1, 1, 0, 0, 0, 0]还是[0, 0, 0, 0, 0, 1, 1, 1, 1]呢?

sequence大小问题

您好,我想请教一下如果输入是一段很长的很长的古文(大于512),该如何处理序列呢

Tokenizer 工作异常

从Hugging Face使用了guwenbert,但是tokenization的结果仅仅是把一个句子分成一个个中文字符。想了解一下这是正常的吗。谢谢!

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('ethanyt/guwenbert-base')

text = '贪生养命事皆同,独坐闲居意颇慵。入夏驱驰巢树鹊,经春劳役探花蜂。石炉香尽寒灰薄,铁磬声微古锈浓。寂寂虚怀无一念,任从苍藓没行踪。'

tokens = tokenizer.tokenize(text)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(tokens)
print(ids)

结果:

`['贪', '生', '养', '命', '事', '皆', '同', ',', '独', '坐', '闲', '居', '意', '颇', '慵', '。', '入', '夏', '驱', '驰', '巢', '树', '鹊', ',', '经', '春', '劳', '役', '探', '花', '蜂', '。', '石', '炉', '香', '尽', '寒', '灰', '薄', ',', '铁', '磬', '声', '微', '古', '锈', '浓', '。', '寂', '寂', '虚', '怀', '无', '一', '念', ',', '任', '从', '苍', '藓', '没', '行', '踪', '。']

[1225, 38, 546, 190, 42, 94, 105, 5, 427, 424, 819, 231, 181, 1251, 4388, 4, 106, 452, 1571, 1367, 1779, 666, 2659, 5, 124, 224, 771, 980, 1806, 278, 2740, 4, 198, 2090, 389, 255, 353, 1864, 965, 5, 1148, 2761, 243, 547, 202, 7507, 2072, 4, 1185, 1185, 373, 843, 18, 10, 480, 5, 347, 122, 1155, 4338, 833, 49, 2353, 4]`

预训练语料

问一下,
1.你在预训练阶段使用的什么语料?大概多大规模?
2.预训练时,阶段1和阶段2使用的是相同的语料吗?阶段1训练时是否掺入了现代汉语的语料?

去停用词的问题

在做红楼梦对话的情感分析的时候找到了您的文章,想问一下,您这个项目在分词时有没有进行去停用词处理,如果用到了,方便参考一下您的去停用词表嘛。(本人纯小白,刚上手nlp方向,有较多疑惑,望您多包涵)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.