NLP 中文拼写检测纠正论文SOTA FASPell github 源码介绍
wptr33 2025-01-19 00:40 33 浏览
NLP 开源项目
[1] nlp-hanzi-similar 汉字相似度: https://github.com/houbb/nlp-hanzi-similar
[2] word-checker 中英文拼写检测: https://github.com/houbb/word-checker
[3] pinyin 汉字转拼音: https://github.com/houbb/pinyin
[4] opencc4j 繁简体转换: https://github.com/houbb/opencc4j
[5] sensitive-word 敏感词: https://github.com/houbb/sensitive-word
前言
大家好,我是老马。
下面学习整理一些其他优秀小伙伴的设计和开源实现。
FASPell
https://github.com/iqiyi/FASPell
FASPell
该仓库(根据GNU通用公共许可证v3.0许可) 包含构建当前最佳(到2019年初)中文拼写检查器所需的所有数据和代码,可以以此复现我们的同名论文中的全部实验:
FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradigm LINK[7]
此论文发表于 the Proceedings of the 2019 EMNLP Workshop W-NUT: The 5th Workshop on Noisy User-generated Text。
使用本代码与数据时,请按如下信息引用我们的论文:
@inproceedings{hong2019faspell,
title = "{FASP}ell: A Fast, Adaptable, Simple, Powerful {C}hinese Spell Checker Based On {DAE}-Decoder Paradigm",
author = "Hong, Yuzhong and
Yu, Xianguo and
He, Neng and
Liu, Nan and
Liu, Junhui",
booktitle = "Proceedings of the 5th Workshop on Noisy User-generated Text (W-NUT 2019)",
month = nov,
year = "2019",
address = "Hong Kong, China",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/D19-5522",
pages = "160--169",
}
概述
中文拼写检查(CSC)的任务通常仅考虑对中文文本中的替换错误进行检测和纠正。
其他类型的错误(例如删除/插入错误)相对较少。
FASPell是中文拼写检查器,可让您轻松完成对任何一种中文文本(简体中文文本;
繁体中文文本; 人类论文; OCR结果等)的拼写检查,且拥有最先进的性能。
性能
下述表格描述了FASPell在SIGHAN15测试集上的性能。
句子级性能为:
精确率 | 召回率 | |
检错 | 67.6% | 60.0% |
纠错 | 66.6% | 59.1% |
字符级性能为:
精确率 | 召回率 | |
检错 | 76.2% | 67.1% |
纠错 | 73.5% | 64.8% |
这意味着10个错误检测/纠正中大约7个是正确的,并且可以成功检测/纠正10个错误中的6个。
使用方法
以下是能够指导您构建中文拼写检查器的步骤指南。
依赖
python == 3.6
tensorflow >= 1.7
matplotlib
tqdm
java (仅在使用树编辑距离时需要)
apted.jar (同上,仅在使用树编辑距离时需要)
数据准备
在此步骤中,您将在此处[8]下载所有数据。
数据包括拼写检查数据(用于训练和测试)以及用于计算字符相似度的字符特征。
由于FASPell中使用的大多数数据来自其他提供商,所以请注意下载的数据应转换为我们所需的格式。
在仓库中,我们提供了一些示例数据来占位。下载好全部数据后请用相同的文件名覆盖它们。
完成此步骤后,如果您有兴趣,则可以使用以下脚本来计算字符相似度:
$ python char_sim.py 午 牛 年 千
请注意,FASPell仅采用字符串编辑距离进行计算 相似。 如果您对使用树编辑距离计算相似度感兴趣 ,您需要下载(从 这里[9])并编译一个 树编辑距离可执行文件“ apted.jar”到主目录,然后运行:
$ python char_sim.py 午 牛 年 千 -t
训练
我们强烈建议您在实施此步骤之前阅读我们的论文。
共有三个训练步骤(按顺序)。 点击链接
获得他们的详细信息:
1.预训练掩码语言模型:请参阅此处[10]
2.微调训练掩码语言模型:请参阅此处[11]
3.训练CSD过滤器:请参见此处[12]
运行拼写检查器
检查您的目录结构是否如下:
FASPell/
- bert_modified/
- create_data.py
- create_tf_record.py
- modeling.py
- tokenization.py
- data/
- char_meta.txt
- model/
- fine-tuned/
- model.ckpt-10000.data-00000-of-00001
- model.ckpt-10000.index
- model.ckpt-10000.meta
- pre-trained/
- bert_config.json
- bert_model.ckpt.data-00000-of-00001
- bert_model.ckpt.index
- bert_model.ckpt.meta
- vocab.txt
- plots/
...
- char_sim.py
- faspell.py
- faspell_configs.json
- masked_lm.py
- plot.py
现在,您应该可以使用以下命令对中文句子进行拼写检查:
$ python faspell.py 扫吗关注么众号 受奇艺全网首播
您还可以检查文件中的句子(每行一个句子):
$ python faspell.py -m f -f /path/to/your/file
如要在测试集上测试拼写检查器,请将faspell_configs.json中的"testing_set"设置为测试集的路径并运行:
$ python faspell.py -m e
您可以将faspell_configs.json中的"round"设置为不同的值,并运行上述命令以找到最佳的回合数。
数据
中文拼写检查数据
1.人类生成的数据:
?SIGHAN-2013 shared task on CSC: LINK[13]?SIGHAN-2014 shared task on CSC: LINK[14]?SIGHAN-2015 shared task on CSC: LINK[15]
2.机器生成的数据:
?我们论文中使用的OCR结果:
?Tst_ocr: LINK[16]?Trn_ocr: LINK[17]
要使用我们的代码,拼写检查数据的格式应按照以下例子:
错误字数 错误句子 正确句子
0 你好!我是張愛文。 你好!我是張愛文。
1 下個星期,我跟我朋唷打算去法國玩兒。 下個星期,我跟我朋友打算去法國玩兒。
0 我聽說,你找到新工作,我很高興。 我聽說,你找到新工作,我很高興。
1 對不氣,最近我很忙,所以我不會去妳的。 對不起,最近我很忙,所以我不會去妳的。
1 真麻煩你了。希望你們好好的跳無。 真麻煩你了。希望你們好好的跳舞。
3 我以前想要高訴你,可是我忘了。我真戶禿。 我以前想要告訴你,可是我忘了。我真糊塗。
中文字符特征
我们使用来自两个开放数据库提供的特征。 使用前请检查其许可证。
数据库名 | 数据链接 | 使用的文件 | |
字形特征※ | 漢字データベースプロジェクト(汉字数据库项目)[18] | LINK[19] | ids.txt |
字音特征 | Unihan Database[20] | LINK[21] | Unihan_Readings.txt |
※ 请注意,原始 ids.txt 本身不提供笔划级别的IDS(出于压缩目的)。 但是,您可以使用树递归(从具有笔画级IDS的简单字符的IDS开始)来为所有字符自己生成笔画级IDS。
可以与我们的代码一起使用的特征文件(char_meta.txt)应该具有格式如下:
unicode编码 字符 CJKV各语言发音 笔划级别的IDS
U+4EBA 人 ren2;jan4;IN;JIN,NIN;nhan ?丿?
U+571F 土 du4,tu3,cha3,tu2;tou2;TWU,THO;DO,TO;th? ??一丨一
U+7531 由 you2,yao1;jau4;YU;YUU,YUI,YU;do ??丨??一丨一
U+9A6C 马 ma3;maa5;null;null;null ???一
U+99AC 馬 ma3;maa5;MA;MA,BA,ME;m? ????一?一一丨?灬
其中:
?CJKV各语言发音的字符串遵循格式:MC;CC;K;JO;V;?当一个语言中的字符是多音字时,可能的发音用,分隔;?当一个字符不存在某个语言的发音时,用null来做占位符。
小结
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次相遇。
- 上一篇:Java基础 - javac命令详解之编译
- 下一篇:前经纪人还原邓紫棋名字注册原因
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
如何将AI助手接入微信(打开ai手机助手)
-
Java面试必考问题:什么是乐观锁与悲观锁
-
SparkSQL——DataFrame的创建与使用
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)