上下文单词检查器提供更好的建议
重要的是要明白,识别候选人是否存在拼写错误是一项艰巨的任务。
拼写错误大致分为非单词错误 (NWE) 和真实单词错误 (RWE)。如果拼写错误的字符串是该语言中的有效单词,则称为 RWE,否则称为 NWE。
——莫诺吉特·乔杜里等人等人。 (2007)
该软件包目前专注于使用 BERT 模型纠正词汇外 (OOV) 单词或非单词错误 (NWE)。使用 BERT 的想法是在纠正 OOV 时使用上下文。为了改进这个包,我想扩展识别 RWE 的功能,优化这个包,并改进文档。
可以使用 pip 安装该软件包。你需要 python 3.6+
pip install contextualSpellCheck
注意:要在其他语言中使用,请检查examples
文件夹。
>> > import contextualSpellCheck
>> > import spacy
>> > nlp = spacy . load ( "en_core_web_sm" )
>> >
>> > ## We require NER to identify if a token is a PERSON
>> > ## also require parser because we use `Token.sent` for context
>> > nlp . pipe_names
[ 'tok2vec' , 'tagger' , 'parser' , 'ner' , 'attribute_ruler' , 'lemmatizer' ]
>> > contextualSpellCheck . add_to_pipe ( nlp )
>> > nlp . pipe_names
[ 'tok2vec' , 'tagger' , 'parser' , 'ner' , 'attribute_ruler' , 'lemmatizer' , 'contextual spellchecker' ]
>> >
>> > doc = nlp ( 'Income was $9.4 milion compared to the prior year of $2.7 milion.' )
>> > doc . _ . outcome_spellCheck
'Income was $9.4 million compared to the prior year of $2.7 million.'
或者您可以手动添加到 spaCy 管道!
>> > import spacy
>> > import contextualSpellCheck
>> >
>> > nlp = spacy . load ( "en_core_web_sm" )
>> > nlp . pipe_names
[ 'tok2vec' , 'tagger' , 'parser' , 'ner' , 'attribute_ruler' , 'lemmatizer' ]
>> > # You can pass the optional parameters to the contextualSpellCheck
>> > # eg. pass max edit distance use config={"max_edit_dist": 3}
>> > nlp . add_pipe ( "contextual spellchecker" )
< contextualSpellCheck . contextualSpellCheck . ContextualSpellCheck object at 0x1049f82b0 >
>> > nlp . pipe_names
[ 'tok2vec' , 'tagger' , 'parser' , 'ner' , 'attribute_ruler' , 'lemmatizer' , 'contextual spellchecker' ]
>> >
>> > doc = nlp ( "Income was $9.4 milion compared to the prior year of $2.7 milion." )
>> > print ( doc . _ . performed_spellCheck )
True
>> > print ( doc . _ . outcome_spellCheck )
Income was $ 9.4 million compared to the prior year of $ 2.7 million .
在管道中添加contextual spellchecker
后,您可以正常使用管道。可以使用扩展来访问拼写检查建议和其他数据。
>> > doc = nlp ( u'Income was $9.4 milion compared to the prior year of $2.7 milion.' )
>> >
>> > # Doc Extention
>> > print ( doc . _ . contextual_spellCheck )
True
>> > print ( doc . _ . performed_spellCheck )
True
>> > print ( doc . _ . suggestions_spellCheck )
{ milion : 'million' , milion : 'million' }
>> > print ( doc . _ . outcome_spellCheck )
Income was $ 9.4 million compared to the prior year of $ 2.7 million .
>> > print ( doc . _ . score_spellCheck )
{ milion : [( 'million' , 0.59422 ), ( 'billion' , 0.24349 ), ( ',' , 0.08809 ), ( 'trillion' , 0.01835 ), ( 'Million' , 0.00826 ), ( '%' , 0.00672 ), ( '##M' , 0.00591 ), ( 'annually' , 0.0038 ), ( '##B' , 0.00205 ), ( 'USD' , 0.00113 )], milion : [( 'billion' , 0.65934 ), ( 'million' , 0.26185 ), ( 'trillion' , 0.05391 ), ( '##M' , 0.0051 ), ( 'Million' , 0.00425 ), ( '##B' , 0.00268 ), ( 'USD' , 0.00153 ), ( '##b' , 0.00077 ), ( 'millions' , 0.00059 ), ( '%' , 0.00041 )]}
>> >
>> > # Token Extention
>> > print ( doc [ 4 ]. _ . get_require_spellCheck )
True
>> > print ( doc [ 4 ]. _ . get_suggestion_spellCheck )
'million'
>> > print ( doc [ 4 ]. _ . score_spellCheck )
[( 'million' , 0.59422 ), ( 'billion' , 0.24349 ), ( ',' , 0.08809 ), ( 'trillion' , 0.01835 ), ( 'Million' , 0.00826 ), ( '%' , 0.00672 ), ( '##M' , 0.00591 ), ( 'annually' , 0.0038 ), ( '##B' , 0.00205 ), ( 'USD' , 0.00113 )]
>> >
>> > # Span Extention
>> > print ( doc [ 2 : 6 ]. _ . get_has_spellCheck )
True
>> > print ( doc [ 2 : 6 ]. _ . score_spellCheck )
{$: [], 9.4 : [], milion : [( 'million' , 0.59422 ), ( 'billion' , 0.24349 ), ( ',' , 0.08809 ), ( 'trillion' , 0.01835 ), ( 'Million' , 0.00826 ), ( '%' , 0.00672 ), ( '##M' , 0.00591 ), ( 'annually' , 0.0038 ), ( '##B' , 0.00205 ), ( 'USD' , 0.00113 )], compared : []}
为了方便使用, contextual spellchecker
提供了您的代码可以使用的自定义 spacy 扩展。这使得用户更容易获得所需的数据。 contextualSpellCheck 提供了doc
、 span
和token
级别的扩展。下表总结了扩展。
spaCy.Doc
级别扩展扩大 | 类型 | 描述 | 默认 |
---|---|---|---|
doc.__.contextual_spellCheck | Boolean | 检查 contextualSpellCheck 是否添加为扩展 | True |
doc.__.performed_spellCheck | Boolean | 检查 contextualSpellCheck 是否识别出任何拼写错误并执行更正 | False |
doc.__.suggestions_spellCheck | {Spacy.Token:str} | 如果执行更正,它将返回拼写错误标记 ( spaCy.Token ) 与建议单词 ( str ) 的映射 | {} |
doc._.outcome_spellCheck | str | 更正的句子( str ) 作为输出 | "" |
doc._.score_spellCheck | {Spacy.Token:List(str,float)} | 如果识别出更正,它将返回拼写错误标记 ( spaCy.Token ) 与建议单词 ( str ) 的映射以及该更正的概率 | None |
spaCy.Span
级别扩展扩大 | 类型 | 描述 | 默认 |
---|---|---|---|
span._.get_has_spellCheck | Boolean | 检查 contextualSpellCheck 是否识别出任何拼写错误并在此范围内执行更正 | False |
span._.score_spellCheck | {Spacy.Token:List(str,float)} | 如果识别出更正,它将返回拼写错误标记 ( spaCy.Token ) 与建议单词 ( str ) 的映射以及此span 内标记的更正概率 | {spaCy.Token: []} |
spaCy.Token
级别扩展扩大 | 类型 | 描述 | 默认 |
---|---|---|---|
token.__.get_require_spellCheck | Boolean | 检查 contextualSpellCheck 是否识别出任何拼写错误并对此token 执行更正 | False |
token._.get_suggestion_spellCheck | str | 如果执行更正,它将返回建议的单词( str ) | "" |
token._.score_spellCheck | [(str,float)] | 如果识别出更正,它会返回建议的单词( str )和该更正的概率( float ) | [] |
目前,有一个简单的 GET API 可以帮助您入门。您可以在本地运行该应用程序并使用它。
查询:您可以使用端点 http://127.0.0.1:5000/?query=YOUR-QUERY 注意:您的浏览器可以处理文本编码
GET Request: http://localhost:5000/?query=Income%20was%20$9.4%20milion%20compared%20to%20the%20prior%20year%20of%20$2.7%20milion.
回复:
{
"success" : true ,
"input" : " Income was $9.4 milion compared to the prior year of $2.7 milion. " ,
"corrected" : " Income was $9.4 milion compared to the prior year of $2.7 milion. " ,
"suggestion_score" : {
"milion" : [
[
" million " ,
0.59422
],
[
" billion " ,
0.24349
],
...
],
"milion:1" : [
[
" billion " ,
0.65934
],
[
" million " ,
0.26185
],
...
]
}
}
candidateRanking
的最大编辑距离如果您喜欢该项目,请⭑该项目并表示您的支持!另外,如果您觉得当前的行为不符合预期,请随时提出问题。如果您可以帮助完成上述任何任务,请打开 PR,对文档和测试进行必要的更改。
如果您在学术工作中使用 contextualSpellCheck,请考虑使用以下 BibTex 条目引用图书馆:
@misc { Goel_Contextual_Spell_Check_2021 ,
author = { Goel, Rajat } ,
doi = { 10.5281/zenodo.4642379 } ,
month = { 3 } ,
title = { {Contextual Spell Check} } ,
url = { https://github.com/R1j1t/contextualSpellCheck } ,
year = { 2021 }
}
以下是我在开发此包时提到的一些项目/工作