精华内容
下载资源
问答
  • FASPell该仓库(根据GNU通用公共许可证v3.0许可)包含构建当前最佳(到2019年初)中文拼写检查器所需的所有数据和代码,可以以此复现我们的同名论文中的全部实验:FASPell: A Fast, Adaptable, Simple, Powerful Chinese...

    FASPell

    该仓库(根据GNU通用公共许可证v3.0许可)

    包含构建当前最佳(到2019年初)中文拼写检查器所需的所有数据和代码,可以以此复现我们的同名论文中的全部实验:

    FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker

    Based On DAE-Decoder Paradigm LINK

    此论文发表于 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 (同上,仅在使用树编辑距离时需要)

    数据准备

    在此步骤中,您将在此处下载所有数据。 数据包括拼写检查数据(用于训练和测试)以及用于计算字符相似度的字符特征。

    由于FASPell中使用的大多数数据来自其他提供商,所以请注意下载的数据应转换为我们所需的格式。

    在仓库中,我们提供了一些示例数据来占位。下载好全部数据后请用相同的文件名覆盖它们。

    完成此步骤后,如果您有兴趣,则可以使用以下脚本来计算字符相似度:

    $ python char_sim.py 午 牛 年 千

    请注意,FASPell仅采用字符串编辑距离进行计算

    相似。 如果您对使用树编辑距离计算相似度感兴趣

    ,您需要下载(从

    这里)并编译一个

    树编辑距离可执行文件“ apted.jar”到主目录,然后运行:

    $ python char_sim.py 午 牛 年 千 -t

    训练

    我们强烈建议您在实施此步骤之前阅读我们的论文。

    共有三个训练步骤(按顺序)。 点击链接

    获得他们的详细信息:

    预训练掩码语言模型:请参阅此处

    微调训练掩码语言模型:请参阅此处

    训练CSD过滤器:请参见此处

    运行拼写检查器

    检查您的目录结构是否如下:

    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"设置为不同的值,并运行上述命令以找到最佳的回合数。

    数据

    中文拼写检查数据

    人类生成的数据:

    SIGHAN-2013 shared task on CSC:

    LINK

    SIGHAN-2014 shared task on CSC:

    LINK

    SIGHAN-2015 shared task on CSC:

    LINK

    机器生成的数据:

    我们论文中使用的OCR结果:

    Tst_ocr: LINK

    Trn_ocr: LINK

    要使用我们的代码,拼写检查数据的格式应按照以下例子:

    错误字数错误句子正确句子

    0你好!我是張愛文。你好!我是張愛文。

    1下個星期,我跟我朋唷打算去法國玩兒。下個星期,我跟我朋友打算去法國玩兒。

    0我聽說,你找到新工作,我很高興。我聽說,你找到新工作,我很高興。

    1對不氣,最近我很忙,所以我不會去妳的。對不起,最近我很忙,所以我不會去妳的。

    1真麻煩你了。希望你們好好的跳無。真麻煩你了。希望你們好好的跳舞。

    3我以前想要高訴你,可是我忘了。我真戶禿。我以前想要告訴你,可是我忘了。我真糊塗。

    中文字符特征

    我们使用来自两个开放数据库提供的特征。 使用前请检查其许可证。

    数据库名

    数据链接

    使用的文件

    ※ 请注意,原始 ids.txt 本身不提供笔划级别的IDS(出于压缩目的)。 但是,您可以使用树递归(从具有笔画级IDS的简单字符的IDS开始)来为所有字符自己生成笔画级IDS。

    可以与我们的代码一起使用的特征文件(char_meta.txt)应该具有格式如下:

    unicode编码字符CJKV各语言发音笔划级别的IDS

    U+4EBA人ren2;jan4;IN;JIN,NIN;nhân⿰丿㇏

    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来做占位符。

    掩码语言模型

    预训练

    如要复现本文中的实验或立即获得预先训练的模型,可以下载

    预训练好的模型。

    将预训练模型相关所有文件放在model/pre-trained/目录下。

    微调训练

    为了产生我们论文所述的微调样本,请运行以下命令

    $ cd bert_modified

    $ python create_data.py -f /path/to/training/data/file

    $ python create_tf_record.py --input_file correct.txt --wrong_input_file wrong.txt --output_file tf_examples.tfrecord --vocab_file ../model/pre-trained/vocab.txt

    然后,您需要做的就是继续按照GitHub BERT for BERT中所述的预训练命令来继续训练预训练模型,唯一不同的是使用预训练模型作为初始的checkpoint。

    将经过微调的模型的检查点文件放在model/fine-tuned/下。 然后,将faspell_configs.json中的"fine-tuned"设置为微调模型的路径。

    CSD

    训练在CSD可能会花费您很多时间,因为比较麻烦。

    训练CSD时的总体设置

    如论文所述,我们需要为每组候选字符手动找到一条过滤曲线。 在此代码中,我们包括一个小hack:每组候选字符都划分为两个子候选字符组,我们需要找到每个子候选字符组的过滤曲线。 划分标准是排名第一的候选字符是否与原始字符不同(即top_difference=True/False)。 这个hack很有帮助,因为我们观察top_difference的值对 把握度-相似度 散点图上的候选字符的分布有很大的影响。您在训练过程中应该也会观察到。

    我们建议按照如下顺序来为每组子候选字符组来寻找过滤曲线:

    top_difference=True, sim_type='shape', rank=0

    top_difference=True, sim_type='shape', rank=1

    top_difference=True, sim_type='shape', rank=2

    ... , ... , ...

    top_difference=True, sim_type='sound', rank=0

    top_difference=True, sim_type='sound', rank=1

    top_difference=True, sim_type='sound', rank=2

    ... , ... , ...

    top_difference=False, sim_type='shape', rank=0

    top_difference=False, sim_type='shape', rank=1

    top_difference=False, sim_type='shape', rank=2

    ... , ... , ...

    top_difference=False, sim_type='sound', rank=0

    top_difference=False, sim_type='sound', rank=1

    top_difference=False, sim_type='sound', rank=2

    要使sim_type ='shape',需要在faspell_configs.json中设置"visual": 1和"phonological": 0; 要使sim_type ='sound',您需要设置"visual":0和"phonologic":1(保持"union_of_sims": false,这让字形相似度的散点图上的曲线和字音相似度的散点图上曲线能独立寻找。)。 要使rank = n,请设置"rank": n。

    在您准备开始训练之前请注意,如果每组都使用一遍掩码语言模型去生成候选字符的话可能会花费您很多时间。 因此,我们建议在训练过程中的第一组时保存生成的候选字符矩阵,然后对后面的组重复使用它们。 将"dump_candidates"设置为保存路径可以保存候选字符。 对于以后的组,将"read_from_dump"设置为true。

    为每组候选字符训练过滤器的工作流程

    对每组top_difference=True的子候选字符组,运行:

    $ python faspell.py -m e -t -d

    对每组top_difference=False的子候选字符组,运行:

    $ python faspell.py -m e -t

    然后,您将在目录plots/下看到相应的.png图。 请注意,还会有一张放大的高把握度、低相似度角(右下角)候选字符分布.png图(因为其中候选字符分布过于密集),以帮助您找到最佳曲线。

    对于每个子组,您可以使用散点图找到曲线,然后将其作为函数放入Curves类中(如果候选对象位于曲线下方,则返回False),然后在Filter类的__init__()中调用该函数

    训练完成后的设置

    训练完成后,请记住将"union_of_sims"更改为true(这将强制对两种不同类型的相似度对结果进行并集,而不考虑"visual"和"phonological"的值)。 将"rank"设置为训练中的最高等级。同时,将"dump_candidates"更改为''(空字符串),将"read_from_dump"更改为false。

    展开全文
  • 然而,尽管在大多数研究中拼写错误已被简化为替换错误以及最近多个公开任务的努力,中文拼写检查仍然是一项困难的任务。而且,英语等类似语言的方法几乎不能直接用于中文,因为中文单词之间没有定界符,且单词缺乏...

    本文介绍了爱奇艺被 EMNLP 2019 接收的一篇论文。

    论文:FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradigm

    开源链接:https://github.com/iqiyi/FASPell

    “两个瓶颈”

    自1990年代初期开展了一些开拓性工作以来,关于检测和纠正中文文本中的拼写错误的研究已过很长时间。然而,尽管在大多数研究中拼写错误已被简化为替换错误以及最近多个公开任务的努力,中文拼写检查仍然是一项困难的任务。而且,英语等类似语言的方法几乎不能直接用于中文,因为中文单词之间没有定界符,且单词缺乏形态上的变化,使得任何汉字的句法和语义解释都高度依赖其上下文。

    几乎所有以前的中文拼写检查模型都部署了一个通用范式,其中将每个汉字的固定的相似字符集(称为困惑集或混淆集)用作候选项,然后用一个过滤器选择最佳候选项作为待纠错句子中的替换字符。这种朴素的设计面临两个主要瓶颈,而其负面影响未能在过去的提出的方案中得到缓解:

    1.在稀缺的中文拼写检查数据上的过拟合问题

    由于中文拼写检查数据需要乏味繁冗的专业人力工作,因为一直资源不足。为了防止模型的过拟合,Wang等人(2018)提出了一种自动方法来生成伪拼写检查数据。但是,当生成的数据达到40k句子时,其拼写检查模型的精度不再提高。Zhao等人(2017)使用了大量的语言学规则来过滤候选项,但结果却比我们的表现差,尽管我们的模型没有利用任何语言学知识。

    2.困惑集的使用所带来的汉字字符相似度利用上的不灵活性和不充分性问题。

    困惑集因为是固定的,因此并非在任何语境、场景下都能包含正确候选项(一个比较极端的例子是,如果困惑集按照繁体中文制定,那么繁体中文的 “體”和“休”肯定不在困惑集的同一组相似字符中,但是在简体中文中对应的“体”和“休”缺是相似字符,如果错误文本中是把“休”写成了“体”,那么繁体中文困惑集下就无法检出,必须专门再制定一个简体困惑集才可以),这会极大降低检测的召回率(不灵活性问题);另外,困惑集中的字符的相似性的信息有损失,没有得到充分利用,因为一个字符在困惑集中相似字符是无差别对待的,然而事实上每两个字符间的相似度明显是有差别的,因此会影响检测的精确率(不充分性)。Zhang等人 (2015)提出了考虑了很多并没有字符相似度重要的特征(例如分词)来弥补字符相似度利用上的不充分性,但这会为其模型添加更多不必要的噪音。

    论文概述

    论文提出一个基于新范式的中文拼写检查器– FASPell。新的范式包括去噪自动编码(DAE)和解码器。与以前的SOTA模型相比,新范式使得我们的拼写检查器可以更快地进行计算,易于通用于简体或繁体、人类或机器产生的各类场景下的中文文本,结构更简单,错误检测和纠正性能更强大。这四点成就,是因为新的范式规避了两个瓶颈。第一,DAE通过利用无监督预训练方法(如BERT,XLNet,MASS等),减少了监督学习所需的中文拼写检查数据量(<10,000个句子)。第二,解码器有助于消除困惑集的使用,因为它在灵活和充分地利用汉字相似性这一关键特征上的不足。

    论文贡献和方法

    本论文提出通过更改中文拼写检查的范式来规避上述的两个瓶颈。作为主要贡献,并以我们在提出的中文拼写检查模型FASPell为例,这种新范式的最一般形式包括一个降噪自动编码器(DAE)和一个解码器。DAE生成可以将错误文本修改为正确文本的可能的候选项矩阵,解码器在这个矩阵中寻找最佳候选项路径作为输出。DAE因为可以在大规模正常语料数据上无监督训练而仅在中文拼写检查数据上fine-tune,避免了过拟合问题。另外,只要DAE足够强大,所有的语意上可能的候选字符都可以出现,且候选字符是根据周围语境即时生成的,这避免了困惑集所带来的不灵活性;解码器根据量化的字符相似度和DAE给出的字符的语境把握度来过滤出正确的替换字符,这样字符相似性上的细微差别信息都可以得到充分利用。

    本文提出的模型FASPell中,DAE是由BERT中的掩码语言模型(MLM)来充当,解码器是本文提出的把握度-字符相似度解码器(CSD)来充当,如下如所示:

    CSD中使用的量化的字符相似度也是本文提出的,较过去提出的字符相似度量化方法,我们的方法更加精准。我们在字形上采用Unicode标准的IDS表征,它可以准确描述汉字中的各个笔画和它们的布局形式,这使得即使是相同笔画和笔画顺序的(例如“田”与“由”,“午”与“牛”)的汉字之间也拥有不为1的相似度,与此相比,过去基于纯笔画或者五笔、仓颉编码的计算方法则粗糙很多。在字音上我们使用了所有的CJK语言中的汉字发音,尽管我们只是对中文文本检错纠错,但是实验证明考虑诸如粤语、日语音读、韩语、越南语的汉字发音对提高拼写检查的性能是有帮助的,而过去的方法均只考虑了普通话拼音。

    CSD的训练阶段,利用训练集文本通过MLM输出的矩阵,逐行绘制语境把握度-字符相似度散点图,确定能将FP和 TP分开的最佳分界曲线。推理阶段,逐行根据分界线过滤掉FP得到TP结果,然后将每行的结果取并集得到最终替换结果。以前述图片为例,句子首先通过fine-tune训练好的MLM模型,得到的候选字符矩阵通过CSD进行解码过滤,第一行候选项中只有“主”字没有被CSD过滤掉,第二行只有“著”字未被过滤掉,其它行候选项均被分界线过滤清除,得到最终输出结果,即“苦”字被替换为为“著”,“丰”被替换为“主”。

     

    论文实验和结果

    论文在4个数据集上分别进行了消融实验,证明了MLM的fine-tune和CSD分别对FASPell性能的贡献,实验也证明FASPell达到了SOTA的准确性。

     点击阅读原文,获取论文全文!

    end

    也许你还想看

    2019 ICME论文解析:爱奇艺首创实时自适应码率算法评估系统

    干货|文本舆情挖掘的技术探索和实践

    扫一扫下方二维码,更多精彩内容陪伴你!

    展开全文
  • 中文翻译,Peter大师深入浅出讲述如果一步步优化并且测试拼写检查工具,如果你和我一样是AI初学者, 那么就跟着大师脚步学习吧。 #!/usr/bin/env python import re, collections def words(text): return re....

    经典书籍《人工智能-一种现代方法》作者Peter Norvig写过一个关于拼写检查文章,原文

    中文翻译,Peter大师深入浅出讲述如果一步步优化并且测试拼写检查工具,如果你和我一样是AI初学者,

    那么就跟着大师脚步学习吧。

    #!/usr/bin/env python
    import re, collections
    def words(text): return re.findall('[a-z]+', text.lower())
    
    def train(features):
        model = collections.defaultdict(lambda :1)
        for f in features:
            model[f] += 1
        return model
    NWORDS = train(words(file('big.txt').read()))
    
    alphabet = 'abcdefghijklmnopqrstuvxwz'
    
    def edits1(word):
        splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
        deletes = [a + b[1:] for a, b in splits if b]
        transposes = [a + b[1] + b[0] + b[2:] for a,b in splits if len(b)>1]
        replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b]
        inserts = [a + c + b for a, b in splits for c in alphabet]
        return set(deletes + transposes + replaces + inserts)
    
    def know_edits2(word):
        return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
    
    def know(words): return set(w for w in words if w in NWORDS)
    
    def correct(word):
        candidates = know([word]) or know(edits1(word)) or know_edits2(word) or [word]
        return max(candidates, key=NWORDS.get)
    

     测试correct函数,输入单词,程序自动输出纠正单词。

    工作原理分析:

    1 probability Theory

      以上代码是如何运行。给定一个单词我们尽量选择单词正确的拼写方式(当然单词可能就是正确拼写)。我们无法准确知道那个才是真正正确写法,例如"lates"正确写法可能是"late"或者 "latest",因此我们采用概率工具进行纠正。我们通过载给定单词w的所有可能纠正单词c中找出概率最大的那个单词数学表达如下:

      argmaxc P(c|w)   (1)

    根据贝叶斯原理,等价于:

      argmaxc P(w|c) P(c) / P(w)  (2)

    因为p(w)对于所有可能c都是一样,所以我们忽略,以上公式可以简化为:

      argmaxc P(w|c) P(c)  (3)

    表达式(3)有3个部分,我们从右边往左边分析:

      1. P(c), 表示候选纠正单词c本身存在概率。这叫做语言模型(language model):它回答c出现在英文文献中可能性。因此,P("the)概率比较大,而P("zxzxzx")概率比较小。

      2. P(w|c)表示w可能被输入而此时作者想要输入是c,这是错误模型(error model):它回答当输入者想要输入c但是却打错成w的可能性。

      3. argmaxc,控制机制,枚举所有可能c选项数值然后从中选中可能性最大那个。

    接下来我们展示代码如何工作:

    首先,我们读入一个大文本文件big.txt,它包含一百万单词。文件搜集各个领域词汇,可以保证词汇完整性以及代表性。将文本作为训练数据,获得各个单词出现频率字典。即train函数:

    def words(text): return re.findall('[a-z]+', text.lower())
    def train(features):
        model = collections.defaultdict(lambda: 1)
        for f in features:
            model[f] += 1
        return model
    NWORDS = train(words(file('big.txt').read()))

    最后产生NOWORDS字典,单词是索引,数值是单词在big文件中出现次数+1,任何没有出现单词默认数值是1。

    接下来,枚举出所有给定单词w的可能纠正c,我们先给出edit distance只有1的情况:c可能是在w基础上经过4中操作,曾删改插(deletion,transposition, alterationinsertion)。实现函数如下:

    def edits1(word):
       splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]
       deletes    = [a + b[1:] for a, b in splits if b]
       transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
       replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]
       inserts    = [a + c + b     for a, b in splits for c in alphabet]
       return set(deletes + transposes + replaces + inserts)

    如果edit distance距离是2情况,只要递归就行

    def edits2(word):
        return set(e2 for e1 in edits1(word) for e2 in edits1(e1))

     

    以上可能产生许多不可能的单词,所以我们需要剔除那么不是单词的c。通过查找NWORDS实现:

    def known_edits2(word):
        return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

    我们已经解决P(c)问题,接下来就是错误模型,P(w|c),我们需要一定数据来训练错误模型,但是作者提供一种比较简单但是可能不是特别精确方法:那就是假设单词不出现错误概率最高,一个edit distance,2个距离再次,最后如果都没有就返回给定单词:

    def known(words): return set(w for w in words if w in NWORDS)

    def correct(word):
        candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
        return max(candidates, key=NWORDS.get)

    Evaluation:

    接下我们评估这个模型的准确程度,作者手动输入发现系统工作不错。

    大师决定自己到网上下载错误拼写数据,我们可以在这个网站下载http://www.dcs.bbk.ac.uk/~ROGER/corpora.html,wikipedia.dat。Peter大师测试代码如下:

    tests1 = { 'access': 'acess', 'accessing': 'accesing', 'accommodation':
        'accomodation acommodation acomodation', 'account': 'acount', ...}
    
    tests2 = {'forbidden': 'forbiden', 'decisions': 'deciscions descisions',
        'supposedly': 'supposidly', 'embellishing': 'embelishing', ...}
    
    def spelltest(tests, bias=None, verbose=False):
        import time
        n, bad, unknown, start = 0, 0, 0, time.clock()
        if bias:
            for target in tests: NWORDS[target] += bias
        for target,wrongs in tests.items():
            for wrong in wrongs.split():
                n += 1
                w = correct(wrong)
                if w!=target:
                    bad += 1
                    unknown += (target not in NWORDS)
                    if verbose:
                        print '%r => %r (%d); expected %r (%d)' % (
                            wrong, w, NWORDS[w], target, NWORDS[target])
        return dict(bad=bad, n=n, bias=bias, pct=int(100. - 100.*bad/n), 
                    unknown=unknown, secs=int(time.clock()-start) )
    
    print spelltest(tests1)
    print spelltest(tests2) ## only do this after everything is debugged
    

     我们分析测试程序:

    输入测试数据是字典,索引是单词正确拼写,即c,value是它可能错误拼写方式,是一个中间用空格字符串。

    我们需要测试出错次数bad,以及训练模型没有包含单词unknown次数,命中率pct,具体如何实现就看上面代码。本人直接下载数据,wikipedia.dat然后分词,大家有兴趣可以看一下我的测试代码(在最底下)。

    调试结果:

    wrong:  similiarity
    correct:  similarity
    target:  similarity
    wrong:  consolodated
    correct:  consolidated
    target:  consolidated
    wrong:  surrepetitious
    correct:  surrepetitious
    target:  surreptitious
    ***********
    wrong:  surreptious
    correct:  surreptious
    target:  surreptitious
    ***********
    wrong:  desireable
    correct:  desirable
    target:  desirable
    wrong:  contravercial
    correct:  controversial
    target:  controversial
    wrong:  controvercial
    correct:  controversial
    target:  controversial
    wrong:  comandos
    correct:  commands
    target:  commandos
    ***********
    wrong:  commandoes
    correct:  commander
    target:  commandos
    ***********
    {'unknown': 2, 'secs': 0, 'bad': 4, 'pct': 100, 'n': 1852}

     

    本人测试代码,release_1_corrector是拼写上面代码,请自行改正:

    #!/usr/bin/env python
    import re, collections
    import sys
    sys.path.append('/home/wenwt/machingLearning/source/')
    from release_1_corrector import NWORDS
    from release_1_corrector import correct
    
    def words_test():
        data = open('wikipedia.dat', 'r')
        text = data.read()
        data.close()
        words = text.split('\n')
        return words
    
    def dict_test(words):
        pattern = '^[$][a-z]+'
        spell_dict = collections.defaultdict(lambda :[])
        target = None
        for word in words:
            if re.findall(pattern, word):
                target = word[1:]
            else:
                spell_dict[target].append(word)
        return spell_dict
    
    def evaluation(tests):
        import time
        n, bad, unknown, start = 0, 0, 0, time.clock()
        debug = 1
        for target, wrongs in tests.items():
            for wrong in wrongs:
                n += 1
                debug += 1
                if debug > 10:
                    break
                print 'wrong: ', wrong
                w = correct(wrong)
                print 'correct: ', w
                print 'target: ', target
                if target != w:
                    print('***********')
                    bad += 1
                    unknown += w in NWORDS
    
        return dict(bad=bad, n=n, pct=int(100-100*bad/n), unknown=unknown, secs=int(time.clock()-start))
    
    spell_dict = dict_test(words_test())
    spell_test = evaluation(spell_dict)
    print spell_test
    

     

    转载于:https://www.cnblogs.com/wenwangt/articles/spellingCorrection.html

    展开全文
  • 项目简介本项目用于单词拼写检查。目前支持英文单词拼写检测,后期将引入中文拼写检测。特性说明支持英文的单词纠错可以迅速判断当前单词是否拼写错误可以返回最佳匹配结果可以返回纠正匹配列表,支持指定返回列表的...

    项目简介

    本项目用于单词拼写检查。

    目前支持英文单词拼写检测,后期将引入中文拼写检测。

    特性说明

    支持英文的单词纠错

    可以迅速判断当前单词是否拼写错误

    可以返回最佳匹配结果

    可以返回纠正匹配列表,支持指定返回列表的大小

    错误提示支持 i18n

    支持大小写、全角半角格式化处理

    支持自定义词库

    v0.0.5 最新变更

    支持基本的中文拼写检测

    快速开始

    JDK 版本

    Jdk 1.7+

    maven 引入

    com.github.houbb

    word-checker

    0.0.5

    gradle 引入

    compile group: 'com.github.houbb', name: 'word-checker', version: '0.0.4'

    测试案例

    会根据输入,自动返回最佳纠正结果。

    final String speling = "speling";

    Assert.assertEquals("spelling", EnWordCheckers.correct(speling));

    核心 api 介绍

    核心 api 在 EnWordCheckers 工具类下。

    功能

    方法

    参数

    返回值

    备注

    判断单词拼写是否正确

    isCorrect(string)

    待检测的单词

    boolean

    返回最佳纠正结果

    correct(string)

    待检测的单词

    String

    如果没有找到可以纠正的单词,则返回其本身

    判断单词拼写是否正确

    correctList(string)

    待检测的单词

    List

    返回所有匹配的纠正列表

    判断单词拼写是否正确

    correctList(string, int limit)

    待检测的单词, 返回列表的大小

    返回指定大小的的纠正列表

    列表大小 <= limit

    测试例子

    是否拼写正确

    final String hello = "hello";

    final String speling = "speling";

    Assert.assertTrue(EnWordCheckers.isCorrect(hello));

    Assert.assertFalse(EnWordCheckers.isCorrect(speling));

    返回最佳匹配结果

    final String hello = "hello";

    final String speling = "speling";

    Assert.assertEquals("hello", EnWordCheckers.correct(hello));

    Assert.assertEquals("spelling", EnWordCheckers.correct(speling));

    默认纠正匹配列表

    final String word = "goo";

    List stringList = EnWordCheckers.correctList(word);

    Assert.assertEquals("[go, good, too, god, got, oo, goot, foo]", stringList.toString());

    指定纠正匹配列表大小

    final String word = "goo";

    final int limit = 2;

    List stringList = EnWordCheckers.correctList(word, limit);

    Assert.assertEquals("[go, good]", stringList.toString());

    中文拼写纠正

    核心 api

    为降低学习成本,核心 api 和 ZhWordCheckers 中,和英文拼写检测保持一致。

    是否拼写正确

    final String right = "正确";

    final String error = "万变不离其中";

    Assert.assertTrue(ZhWordCheckers.isCorrect(right));

    Assert.assertFalse(ZhWordCheckers.isCorrect(error));

    返回最佳匹配结果

    final String right = "正确";

    final String error = "万变不离其中";

    Assert.assertEquals("正确", ZhWordCheckers.correct(right));

    Assert.assertEquals("万变不离其宗", ZhWordCheckers.correct(error));

    默认纠正匹配列表

    final String word = "万变不离其中";

    List stringList = ZhWordCheckers.correctList(word);

    Assert.assertEquals("[万变不离其宗]", stringList.toString());

    指定纠正匹配列表大小

    final String word = "万变不离其中";

    final int limit = 1;

    List stringList = ZhWordCheckers.correctList(word, limit);

    Assert.assertEquals("[万变不离其宗]", stringList.toString());

    格式化处理

    有时候用户的输入是各式各样的,本工具支持对于格式化的处理。

    大小写

    大写会被统一格式化为小写。

    final String word = "stRing";

    Assert.assertTrue(EnWordCheckers.isCorrect(word));

    全角半角

    全角会被统一格式化为半角。

    final String word = "string";

    Assert.assertTrue(EnWordCheckers.isCorrect(word));

    自定义词库

    自定义词库

    你可以在项目资源目录创建文件 resources/data/define_word_checker_en.txt

    内容如下:

    my-long-long-define-word,2

    my-long-long-define-word-two

    不同的词独立一行。

    每一行第一列代表单词,第二列代表出现的次数,二者用逗号 , 隔开。

    次数越大,在纠正的时候返回优先级就越高,默认值为 1。

    用户自定义的词库优先级高于系统内置词库。

    测试代码

    我们在指定了对应的单词之后,拼写检测的时候就会生效。

    final String word = "my-long-long-define-word";

    final String word2 = "my-long-long-define-word-two";

    Assert.assertTrue(EnWordCheckers.isCorrect(word));

    Assert.assertTrue(EnWordCheckers.isCorrect(word2));

    后期 Road-Map

    支持英文分词,处理整个英文句子

    支持中文分词拼写检测

    引入中文纠错算法,同音字和形近字处理。

    支持中英文混合拼写检测

    技术鸣谢

    Words 提供的原始英语单词数据。

    文档参考

    展开全文
  • VScode Latex 拼写检查

    2021-03-22 14:27:18
    latex 或markdown文件拼写检查工具 https://valentjn.github.io/vscode-ltex/docs/installation-and-usage.html#how-to-install-and-use 补充word表格转latex表格在线工具:https://www.tabl..
  • 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇. 比如说在搜索的时候键入 [speling], 在不到 0.1 秒的时间内, Google 会返回: 你要找的是不是 [spelling]. ...
  • 拼写检查-crx插件

    2021-04-04 12:04:32
    辅助拼写检查工具,在网页中的输入框选中一段文字使用。 本插件用于对网页中的内容进行拼写检查。1.安装插件后,在网页中刷新,并点击右上角插件图标,在弹出的页面中点击按钮以启用插件。2.在任何页面选中一段...
  • 火狐浏览器使用拼写检查

    千次阅读 2017-12-18 15:59:51
    使用拼写检查Firefox 可以自动检查您在文本框中输入的包含超过一行的的单词的拼写错误。 只要您输入一个单词,就会...添加字典注意:Firefox 中文版本默认不附带任何字典,目前也暂无中文拼写检查工具可用。如果有需
  • 中文拼写检查 文本摘要&关键词提取 情感分析 文本转拼音 获取汉字偏旁部首 安装使用 安装方式 方式一 pip install xmnlp 方式二 git clone https://github.com/SeanLee97/xmnlp.git cd /path/to/xmnlp pip install ...
  • 【Eclipse】关闭单词拼写检查

    千次阅读 2017-11-15 16:10:02
    本来在Word中有拼写检查已经有人让人觉得有点烦,尤其在你打中文的时候,不过考虑到word作为一个输入工具,单词拼写在输入英文还是蛮有用的,也就算了。然而,Eclipse也跟风玩起这个玩意了,还默认开始,作为一个...
  •  上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇. 比如说在搜索的时候键入 [speling], 在不到 0.1 秒的时间内, Google 会返回: 你要找的是不是 [spelling]. ...
  • 自然语言处理中文 工具

    千次阅读 2015-09-04 08:06:10
    LingPipe目前已有很丰富的功能,包括主题分类(Top Classification)、命名实体识别(Named Entity Recognition)、词性标注(Part-of Speech Tagging)、句题检测(Sentence Detection)、查询拼写检查(Query ...
  • 它不但是记事本的一个很好的代替...其它功能包括 HTML 工具栏、用户工具栏、行号、标尺、URL 突出显示、自动完成、素材文本、列选择、强大的搜索和替换、多重撤销/重做、拼写检查、自定义快捷键,以及更多其它功能。
  • 1.增加对 CSS 动画(CSS animations)的支持 2.转移 Do-Not-Track(禁止追踪)工具以提高可发现性;...5.完善了部分语言的拼写检查 6.完善了 Linux 版本的桌面整合 7.WebGL 内容不再加载跨域WebGL纹理
  • 验证既可以检查拼写,也可以自动识别常见翻译问题,如截断或重叠的文本以及分配不正确的快捷键、加速键、存取键等。此外,Lingobit 还可以自动修复多数此类错误。 交换向导确保了管理人员、翻译人员和质量保证团队...
  •  拼写检查  导入/导出 WMF, EMF, BMP, JPEG, PNG, MNG, ICO, GIF 以及 PCX 格式  幻灯片播放  简单的数学公式  可以解方程的高级计算器  整合了MeeSoft Image Analyzer用来编辑位图以及其他扩展格式  ...
  • 开发中不仅会涉及编程语言,其中有许多内容是面向人类而...一般 IDE 只会对程序中编程语言部分进行语法、样式与拼写检查,现在 IntelliJ IDEA 新增了一个可以检查编码时自然语言的插件 Grazie,它除了检查简单的...
  • EditPlus3工具

    2018-09-22 18:59:35
    editplus中文版是一款功能强大的文字处理...程序内嵌网页浏览器,其它功能还包含 FTP 功能、HTML 编辑、URL 突显、自动完成、剪贴文本、行列选择、强大的搜索与替换、多重撤销/重做、拼写检查、自定义快捷键,等等。
  • 为您提供TextPad 文本编辑工具下载,TextPad一款功能非常强大的...完全支持中文双字节、语法加亮、拼写检查、便易的宏功能 3.强大的查找替换和正则表达式、丰富的编辑操作、简易的排版功能 4.独到的字块操作、方便的
  • diagram designer中文版是一款轻量级的ER图绘制工具,这个矢量图像编辑筹建流程图...拼写检查 (参见下面的词典) 导入/导出 WMF, EMF, BMP, JPEG, PNG, MNG, ICO, GIF 以及 PCX 格式 幻灯片播放 根据简单的数学表达式
  • 内置拼写检查工具,数据管理包括项目转换、项目比较及项目完整性检查。.EAP文件管理器可以修复EAP文件,压缩EAP文件,更改为设计模板,创建复制/同步样本,显示样本文件冲突。生成或导入MDG技术文件。一款非常不错的...
  • 一、文件增强 ... 重新载入按钮 重新载入 按原始时间戳保存 简单备份 二、编辑增强 插入空格 插入数字序列 绘制表格 文字转换为表格 删除行末空格 块粘帖 ... 拼写检查 拼写检查(英式英语) 拼写检查(美式英语)
  • 软件介绍: Visio2003_SP3精简版_简体中文企业版,本版本保留了Visio的全部功能!...内置拼写检查及信息检索工具,可以在多种信息检查和参考服务中查找文字,可以加载运行项及设计或结构图。支持宏及自动更改选项。
  • Sublime Text3中文

    2018-04-09 18:14:01
    Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。
  • Foxit Reader v4.0中文

    2010-06-30 20:20:59
    英文拼写检查:当您在填写英文表单或用typewriter插入英文文本时,这个工具可以帮助您检查英文拼写对错并在单词下标出曲线提示错误。如 果 您在拼错的单词上右击,您会看到一份建议替换的单词表。需另外下载安装一个...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 218
精华内容 87
关键字:

中文拼写检查工具