fastHan

fastHan

多任务中文NLP工具包

fastHan是一个基于BERT的多任务中文NLP工具包,支持分词、词性标注、依存分析和命名实体识别等任务。它能处理现代汉语和古汉语,还可进行中文AMR解析。fastHan采用联合训练模型,在多个数据集上表现优异。该工具使用方便,支持GPU加速,并提供模型微调功能,适用于各种中文NLP应用场景。

fastHan中文自然语言处理BERT多任务模型微调Github开源项目

fastHan

致歉:由于服务器故障导致fastHan模型参数丢失,目前暂停服务。我们将尽快开始下一版迭代,敬请期待。同时,如果您已经下载或保存了参数,恳请与我们联系,万分感谢。

简介

fastHan是基于fastNLP和pytorch实现的中文自然语言处理工具,使用方便,类似于spacy。

它的核心是基于BERT的联合模型,在15个语料库中进行训练,可以处理中文分词、词性标注、依存分析、命名实体识别等多项任务。

从fastHan2.0开始,fastHan在原有基础上增加了对古汉语分词和古汉语词性标注的处理能力。此外,fastHan还可以处理中文AMR任务。fastHan在各项任务中表现出色,在某些数据集上接近甚至超越了SOTA模型。

最后,如果您对古汉语分词、词性标注特别感兴趣,也可以关注我们实验室的另一项工作bert-ancient-chinese论文)。

英文版README请点击这里

引用

如果您在工作中使用了fastHan工具,可以引用这篇论文: Zhichao Geng, Hang Yan, Xipeng Qiu and Xuanjing Huang, fastHan: A BERT-based Multi-Task Toolkit for Chinese NLP, ACL, 2021.

@inproceedings{geng-etal-2021-fasthan,
  author = {Geng, Zhichao and Yan, Hang and Qiu, Xipeng and Huang, Xuanjing},
  title = {fastHan: A BERT-based Multi-Task Toolkit for Chinese NLP},
  booktitle = {Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing: System Demonstrations},
  year = {2021},
  pages = {99--106}, 
  url = {https://aclanthology.org/2021.acl-demo.12}
}

安装指南

fastHan需要以下依赖包:

  • torch>=1.8.0
  • fastNLP>=1.0.0
    • 特别注意:2.0版本之前的fastHan依赖的fastNLP版本低于1.0.0。
  • transformers>=4.0.0
  • fastHan2.0可能还使用了其他一些常见的包,如果在使用过程中遇到"找不到包"的提示,直接使用pip安装即可。
    • datasets==2.7.0
    • pandas==1.5.1
    • numpy==1.22.2

版本更新:

  • 1.1版本的fastHan与0.5.5版本的fastNLP会导致import error。如果使用1.1版本的fastHan,请使用0.5.0版本的fastNLP。
  • 1.2版本的fastHan修复了fastNLP版本兼容问题。1.2及以下版本的fastHan在输入句子的首尾包含空格、换行符时会产生BUG。如果字符串首尾包含上述字符,请使用strip函数处理输入字符串。
  • 1.3版本的fastHan自动对输入字符串进行strip函数处理。
  • 1.4版本的fastHan加入用户词典功能(仅限于分词任务)
  • 1.5版本的fastHan
    • 修正了Parsing任务中可能会出现的Value Error
    • 修改结果的返回形式,默认以list的形式返回
    • 可以通过url路径加载模型
  • 1.6版本的fastHan
    • 将用户词典功能扩展到所有任务
    • 可以在返回值中包含位置信息
  • 1.7版本的fastHan
    • 添加finetune功能
  • 2.0版本的fastHan
    • **训练数据集:**新增了《人民日报》数据集、《左传》数据集进行训练
    • **模型架构:**在原来的基础上引入了prompt技术,进一步提升了模型的能力
    • **问题修复:**修复了基础功能当传入的句子过多而导致显存、内存使用量剧增的问题
    • **新增功能:**新增了中文AMR能力

可执行如下命令完成安装:

pip install fastHan

或者可以通过github安装:

git clone git@github.com:fastnlp/fastHan.git
cd fastHan
python setup.py install

快速上手

使用fastHan非常简单,只需两步:加载模型、将句子输入模型。

加载模型

执行以下代码可以加载fastHan模型

from fastHan import FastHan
model=FastHan()

此时如果用户是首次初始化模型,将自动从服务器下载参数。 fastHan2.0模型基于12层BERT模型,如果需要使用更小的模型,可以下载fastHan2.0之前的版本。

执行以下代码可以加载FastCAMR模型:

from fastHan import FastCAMR
camr_model=FastCAMR()

此时若用户为首次初始化模型,将自动从服务器中下载参数。

此外,对于手动下载模型的用户以及保存过微调模型的用户,可以使用模型路径加载模型。下载压缩包并解压后,可将对应路径通过url参数传入。一则使用模型路径加载模型的例子如下:

model=FastHan(url="/remote-home/pywang/finetuned_model")
camr_model=FastCAMR(url="/remote-home/pywang/finetuned_camr_model")

输入句子

模型对句子进行依存分析、命名实体识别的简单例子如下:

sentence="郭靖是金庸笔下的男主角。"
answer=model(sentence)
print(answer)
answer=model(sentence,target="Parsing")
print(answer)
answer=model(sentence,target="NER")
print(answer)

模型将会输出如下信息:

[['郭靖', '是', '金庸', '笔', '下', '的', '男', '主角', '。']]
[[['郭靖', 2, 'top', 'NR'], ['是', 0, 'root', 'VC'], ['金庸', 4, 'nn', 'NR'], ['笔', 5, 'lobj', 'NN'], ['下', 8, 'assmod', 'LC'], ['的', 5, 'assm', 'DEG'], ['男', 8, 'amod', 'JJ'], ['主角', 2, 'attr', 'NN'], ['。', 2, 'punct', 'PU']]]
[[['郭靖', 'NR'], ['金庸', 'NR']]]

可选参数:

  • target: 可在'CWS', 'POS', 'CWS-guwen', 'POS-guwen', 'NER', 'Parsing'六个选项中取值,模型将分别进行中文分词(现代汉语)、词性标注(现代汉语)、中文分词(古代汉语)、词性标注(古代汉语)、命名实体识别、依存分析任务,模型默认进行CWS任务。
    • 词性标注任务包含了分词的信息,而依存分析任务又包含了分词任务。命名实体识别任务相较其他任务独立。
    • 模型的POS、Parsing任务均使用CTB标签集。NER使用msra标签集。
  • use_dict: 是否使用用户词典,默认为False。
  • return_list: 是否以list形式传递返回值。默认为True。
  • return_loc: 是否将词的位置信息返回,默认为False。可用于spanF metric的评估。

模型对句子进行中文CAMR的简单例子如下:

sentence = "这样 的 活动 还 有 什么 意义 呢 ?"
answer = camr_model(sentence)
for ans in answer:
    print(ans)

模型将会输出如下信息:

(x5/有-03
        :mod()(x4/还)
        :arg1()(x7/意义
                :mod()(x11/amr-unknown))
        :mode(x12/interrogative)(x13/expressive)
        :time(x2/的)(x3/活动-01
                :arg0-of(x2/的-01)(x1/这样)))

特别注意的是,输入到fastCAMR模型中的句子必须是用空格隔开分词的句子。如果原始的句子并没有经过分词,可以先通过fastHan的分词功能进行分词,在将通过空格分隔开词汇的句子输入到fastCAMR句子中。

切换设备

可使用模型的 set_device 函数,令模型在cuda上运行或切换回cpu,示例如下:

model.set_device('cuda:0')
model.set_device('cpu')
camr_model.set_device('cuda:0')
camr_model.set_device('cpu')

进阶功能

微调模型

用户可以根据自己的需求在新的数据集上进行微调,一则微调的例子如下方所示:

from fastHan import FastHan

model=FastHan()

# train data file path
cws_url='train.dat'

model.set_device(0)
model.finetune(data_path=cws_url,task='CWS',save=True,save_url='finetuned_model')

微调前设置set_device函数可实用GPU加速。微调时需要将用于训练的数据按格式放到一个文件里。

对于CWS任务,则要求每行一条数据,每个词用空格分隔开。

示例:

上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...

对于NER任务,要求按照MSRA数据集的格式与标签集。

示例: 对于CWS-guwen,由于训练样本的限制,本模型暂时不支持仅对古文进行分词训练。

对于POS-guwen,要求按照以下格式,每个句子占一行。

示例:

春秋/n 左傳/n 定公/nr
元年/t ,/w 春/n ,/w 王/n 正月/t 辛巳/t ,/w 晉/ns 魏舒/nr 合/v 諸侯/n 之/u 大夫/n 于/p 狄泉/ns ,/w 將/d 以/c 城/n 成周/ns 。/w
魏子/nr 蒞政/v 。/w
...

对于POS和依存句法分析,要求遵循CTB9的格式和标签集。

示例:

1       印度    _       NR      NR      _       3       nn      _       _
2       海军    _       NN      NN      _       3       nn      _       _
3       参谋长  _       NN      NN      _       5       nsubjpass       _       _
4       被      _       SB      SB      _       5       pass    _       _
5       解职    _       VV      VV      _       0       root    _       _

1       新华社  _       NR      NR      _       7       dep     _       _
2       新德里  _       NR      NR      _       7       dep     _       _
3       12月  _       NT      NT      _       7       dep     _       _
...

该函数有以下参数:

  • data_path: str,用于微调的数据集文件路径。
  • task: str,此次微调的任务,可选值'CWS','POS','CWS-guwen','POS-guwen','Parsing','NER'。
  • lr: float,微调的学习率。默认为1e-5。
  • n_epochs: int,微调的迭代次数,默认为1。
  • batch_size: int,每个batch的数据量,默认为8。
  • save: bool,是否保存微调后的模型,默认为False。
  • save_url: str,若保存模型,则此值为保存模型的路径。

camr_model也具有微调功能,以下是一个微调示例:

from fastHan import FastCAMR

camr_model=FastCAMR()

# 训练数据文件路径
cws_url='train.dat'

camr_model.set_device(0)
camr_model.finetune(data_path=cws_url,save=True,save_url='finetuned_model')

微调前使用set_device函数可启用GPU加速。微调时需要将用于训练的数据按格式放入一个文件中。

数据集文件的格式应遵循中文AMR语料库CAMR1.0的格式,如下所示。

示例:

# ::id export_amr.1322 ::2017-01-04
# ::snt 这样 的 活动 还 有 什么 意义 呢 ?
# ::wid x1_这样 x2_的 x3_活动 x4_还 x5_有 x6_什么 x7_意义 x8_呢 x9_? x10_
(x5/有-03 
    :mod()(x4/还) 
    :arg1()(x7/意义 
        :mod()(x11/amr-unknown)) 
    :mode()(x2/的) 
    :mod-of(x12/的而)(x1/这样))


# ::id export_amr.1327 ::2017-01-04
# ::snt 并且 还 有 很多 高层 的 人物 哦 !
# ::wid x1_并且 x2_还 x3_有 x4_很多 x5_高层 x6_的 x7_人物 x8_哦 x9_! x10_
(x11/and 
    :op2(x1/并且)(x3/有-03 
        :mod()(x2/还) 
        :arg1()(x7/人物 
            :mod-of(x6/的)(x5/高层) 
            :quant()(x12/-))) 
    :mode()(x13/- 
        :expressive()(x14/-)))
        
...

有关格式的含义请参阅中文AMR语料库CAMR1.0的标准。

该函数有以下参数:

  • :param str data_path: 用于微调的数据集文件路径。

  • :param float lr: 微调的学习率。默认为1e-5。

  • :param int n_epochs: 微调的迭代次数,默认为1。

  • :param int batch_size: 每个batch的数据量,默认为8。

  • :param bool save: 是否保存微调后的模型,默认为False。

  • :param str save_url: 若保存模型,则此值为保存模型的路径。

词典分词 用户可以使用模型的 add_user_dict 函数添加自定义词典,该词典会影响模型在分词任务中的权重分配。进行分词任务时,首先利用词典进行正向、反向最大匹配法进行分词,并将词典方法的分词结果乘上权重系数融入到深度学习模型的结果中。该函数的参数可以是由词组成的列表,也可以是文件路径(文件中的内容是由'\n'分隔开的词)。

用户可使用 set_user_dict_weight 函数设置权重系数(若不设置,默认为0.05)。我们在大规模的训练语料库中发现0.05-0.1即可取得较好的结果。条件允许的情况下,用户也可以自行设置验证集、测试集,找到最适合自己任务的权重系数。

添加完用户词典后,需要在调用模型时将 use_dict 参数设为True。

用户可调用 remove_user_dict 移除之前添加的用户词典。

使用用户词典影响分词的一则例子如下:

sentence="奥利奥利奥"
print(model(sentence))
model.add_user_dict(["奥利","奥利奥"])
print(model(sentence,use_dict=True))

输出为:

[['奥利奥利奥']]
[['奥利', '奥利奥']]

分词风格

分词风格指的是训练模型中文分词模块的10个语料库,模型可以区分这10个语料库,设置分词style为S即令模型认为现在正在处理S语料库的分词。所以分词style实际上是与语料库的覆盖面、分词粒度相关的。如本模型默认的CTB语料库分词粒度较细。如果想切换不同的粒度,可以使用模型的 set_cws_style 函数,例子如下:

sentence="一个苹果。"
print(model(sentence,'CWS'))
model.set_cws_style('cnc')
print(model(sentence,'CWS'))

模型将输出如下内容:

[['一', '个', '苹果', '。']]
[['一个', '苹果', '。']]

对语料库的选取参考了下方CWS SOTA模型的论文,共包括:SIGHAN 2005的 MSR、PKU、AS、CITYU 语料库,由山西大学发布的 SXU 语料库,由斯坦福的CoreNLP 发布的 CTB6 语料库,由国家语委公布的 CNC 语料库,由王威廉先生公开的微博树库 WTB,由张梅山先生公开的诛仙语料库 ZX,Universal Dependencies 项目的 UD 语料库。

输入与输出

输入模型的可以是单独的字符串,也可是由字符串组成的列表。在fastHan2.0之前,如果输入的是列表,模型将一次性处理所有输入的字符串,所以请自行控制 batch size。从FastHan2.0开始,将不受输入的list大小的限制。

模型的输出可以是Python的列表,也可以是fastHan中自定义的Sentence与Token类。模型默认返回列表。

如果将"return_list"参数设为False,模型将输出一个由sentence组成的列表,而每个sentence又由token组成。每个token本身代表一个被分好的词,有pos、head、head_label、ner、loc属性,代表了该词的词性、依存关系、命名实体识别信息、起始位置。

一则输入输出的例子如下所示:

sentence=["我爱踢足球。","林丹是冠军"]
answer=model(sentence,'Parsing',return_list=False)
for i,sentence in enumerate(answer):
    print(i)
    for token in sentence:
        print(token,token.pos,token.head,token.head_label)

上述代码将输出如下内容:

0
我 PN 2 nsubj
爱 VV 0 root
踢 VV 2 ccomp
足球 NN 3 dobj
。 PU 2 punct
1
林丹 NR 2 top
是 VC 0 root
冠军 NN 2 attr
! PU 2 punct

可在分词风格中选择'as'、'cityu'进行繁体字分词,这两项为繁体语料库。

此外,由于各项任务共享词表、词嵌入,即使不切换模型的分词风格,模型对繁体字、英文字母、数字均具有一定识别能力。

模型表现

泛化能力测试

对于NLP工具包来说,最重要的就是泛化能力,即在未知数据集里的表现。我们选取了样本较为复杂的Weibo数据集。我们在Weibo的dev集和test集进行了分词测试,并与jieba、THULAC、LTP4.0、SnowNLP进行了对比,对比结果如下(spanF metric)。

数据集SnowNLPjiebaTHULACLTP4.0 basefastHan largefastHan (微调后)
微博开发集0.79990.83190.86490.91820.93140.9632
微博测试集0.79650.83580.86650. 92050.93380.9664

作为可直接使用的工具,fastHan的准确率较SnowNLP、jieba、THULAC有显著提升。与LTP 4.0-base相比,fastHan的准确率更高,且模型更小(262MB:492MB)。 经过微调后,fastHan的准确率也有明显提升。

准确率测试

模型在以下数据集进行训练和准确性测试:

  • 中文分词:AS、CITYU、CNC、CTB、MSR、PKU、SXU、UDC、WTB、ZX
  • 命名实体识别:MSRA、OntoNotes
  • 词性标注和句法分析:CTB9

注:模型在训练NER OntoNotes时将其标签集转换为与MSRA一致。

模型在CTB分词语料库的前800句进行了速度测试,平均每句有45.2个字符。测试环境为个人电脑,Intel Core i5-9400f + NVIDIA GeForce GTX 1660ti,批处理大小为8。测试结果显示,依存分析运行速度较慢,其他任务运行速度大致相同。

最终模型的表现如下:

任务中文分词词性标注命名实体识别 MSRA古文分词古文词性标注命名实体识别 OntoNotes句法分析速度(句/秒),CPU速度(句/秒),GPU
SOTA模型97.193.1596.09————81.8281.71————
base模型97.2794.8894.33————82.8676.7125-5522-111
large模型97.4195.6695.50————83.8281.3814-2821-97
FastHan2.097.5095.9295.7993.2986.5382.7681.312-1020-60

表格中单位为百分比。中文分词的成绩是10项任务的平均成绩。SOTA模型的数据来自作者对网上资料及论文的查阅,如有遗漏请指正,不胜感激。

在fastHan2.0中,相关的古汉语处理已经达到了很高的水平。如果您追求更好的性能,并且对BERT及transformers库有一定了解,欢迎了解实验室的另一项工作bert-ancient-chinese

这五项SOTA表现分别来自以下五篇论文:

  1. Huang W, Cheng X, Chen K, et al. Toward Fast and Accurate Neural Chinese Word Segmentation with Multi-Criteria Learning.[J]. arXiv: Computation and Language, 2019.
  2. Hang Yan, Xipeng Qiu, and Xuanjing Huang. "A Graph-based Model for Joint Chinese Word Segmentation and Dependency Parsing." Transactions of the Association for Computational Linguistics 8 (2020): 78-92.
  3. Meng Y, Wu W, Wang F, et al. Glyce: Glyph-vectors for Chinese Character Representations[J]. arXiv: Computation and Language, 2019.
  4. Xiaonan Li, Hang Yan, Xipeng Qiu, and Xuanjing Huang. 2020. FLAT: Chinese NER using flat-lattice transformer. In Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics, pages 6836–6842, Online. Association for Computational Linguistics.

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多