54

我对 Python 和 NLTK 还很陌生。我正忙于一个可以执行拼写检查的应用程序(用正确的单词替换拼写错误的单词)。我目前在 Python 2.7、PyEnchant 和 NLTK 库上使用 Enchant 库。下面的代码是一个处理更正/替换的类。

from nltk.metrics import edit_distance

class SpellingReplacer:
    def __init__(self, dict_name='en_GB', max_dist=2):
        self.spell_dict = enchant.Dict(dict_name)
        self.max_dist = 2

    def replace(self, word):
        if self.spell_dict.check(word):
            return word
        suggestions = self.spell_dict.suggest(word)

        if suggestions and edit_distance(word, suggestions[0]) <= self.max_dist:
            return suggestions[0]
        else:
            return word

我编写了一个函数,它接收单词列表并对每个单词执行 replace(),然后返回这些单词的列表,但拼写正确。

def spell_check(word_list):
    checked_list = []
    for item in word_list:
        replacer = SpellingReplacer()
        r = replacer.replace(item)
        checked_list.append(r)
    return checked_list

>>> word_list = ['car', 'colour']
>>> spell_check(words)
['car', 'color']

现在,我不太喜欢这个,因为它不是很准确,我正在寻找一种方法来实现单词的拼写检查和替换。我还需要一些可以识别诸如“caaaar”之类的拼写错误的东西?有没有更好的方法来执行拼写检查?如果是这样,它们是什么?谷歌是如何做到的?因为他们的拼写建议非常好。

有什么建议么?

4

11 回答 11

50

您可以使用自动更正库在 python 中进行拼写检查。
示例用法:

from autocorrect import Speller

spell = Speller(lang='en')

print(spell('caaaar'))
print(spell('mussage'))
print(spell('survice'))
print(spell('hte'))

结果:

caesar
message
service
the
于 2018-01-16T11:48:34.450 回答
35

我建议您先仔细阅读Peter Norvig 的这篇文章。(我不得不做类似的事情,我发现它非常有用。)

以下功能,特别是您现在需要使您的拼写检查器更加复杂的想法:拆分,删除,转置和插入不规则单词以“纠正”它们。

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)

注意:以上是 Norvig 的拼写校正器的一个片段

好消息是您可以逐步添加并不断改进您的拼写检查器。

希望有帮助。

于 2012-12-18T17:13:45.810 回答
21

在 python 中进行拼写检查的最佳方法是:SymSpell、Bk-Tree 或 Peter Novig 的方法。

最快的是 SymSpell。

这是Method1:参考链接pyspellchecker

该库基于 Peter Norvig 的实现。

点安装 pyspellchecker

from spellchecker import SpellChecker

spell = SpellChecker()

# find those words that may be misspelled
misspelled = spell.unknown(['something', 'is', 'hapenning', 'here'])

for word in misspelled:
    # Get the one `most likely` answer
    print(spell.correction(word))

    # Get a list of `likely` options
    print(spell.candidates(word))

方法2 : SymSpell Python

pip install -U symspellpy

于 2019-02-17T18:24:41.943 回答
8

也许为时已晚,但我正在回答未来的搜索。要执行拼写错误更正,您首先需要确保该词不是荒谬的,也不是来自俚语,如 caaaar、amazzzing 等重复字母。所以,我们首先需要摆脱这些字母。正如我们所知,英语单词通常最多有 2 个重复的字母,例如,hello.,因此我们首先从单词中删除多余的重复,然后检查它们的拼写。要删除多余的字母,您可以使用 Python 中的正则表达式模块。

完成后,使用 Python 中的 Pyspellchecker 库来纠正拼写。

如需实施,请访问此链接:https ://rustyonrampage.github.io/text-mining/2017/11/28/spelling-correction-with-python-and-nltk.html

于 2019-04-03T10:10:04.073 回答
2

在终端

pip install gingerit

代码

from gingerit.gingerit import GingerIt
text = input("Enter text to be corrected")
result = GingerIt().parse(text)
corrections = result['corrections']
correctText = result['result']

print("Correct Text:",correctText)
print()
print("CORRECTIONS")
for d in corrections:
  print("________________")  
  print("Previous:",d['text'])  
  print("Correction:",d['correct'])   
  print("`Definiton`:",d['definition'])
 
于 2021-03-28T16:21:09.637 回答
2

试试jamspell - 它非常适合自动拼写纠正:

import jamspell

corrector = jamspell.TSpellCorrector()
corrector.LoadLangModel('en.bin')

corrector.FixFragment('Some sentnec with error')
# u'Some sentence with error'

corrector.GetCandidates(['Some', 'sentnec', 'with', 'error'], 1)
# ('sentence', 'senate', 'scented', 'sentinel')
于 2020-08-28T23:00:34.193 回答
1

拼写校正器->

如果您存储在其他地方,您需要将语料库导入到您的桌面上更改代码中的路径我还使用 tkinter 添加了一些图形,这只是为了解决非单词错误!

def min_edit_dist(word1,word2):
    len_1=len(word1)
    len_2=len(word2)
    x = [[0]*(len_2+1) for _ in range(len_1+1)]#the matrix whose last element ->edit distance
    for i in range(0,len_1+1):  
        #initialization of base case values
        x[i][0]=i
        for j in range(0,len_2+1):
            x[0][j]=j
    for i in range (1,len_1+1):
        for j in range(1,len_2+1):
            if word1[i-1]==word2[j-1]:
                x[i][j] = x[i-1][j-1]
            else :
                x[i][j]= min(x[i][j-1],x[i-1][j],x[i-1][j-1])+1
    return x[i][j]
from Tkinter import *


def retrieve_text():
    global word1
    word1=(app_entry.get())
    path="C:\Documents and Settings\Owner\Desktop\Dictionary.txt"
    ffile=open(path,'r')
    lines=ffile.readlines()
    distance_list=[]
    print "Suggestions coming right up count till 10"
    for i in range(0,58109):
        dist=min_edit_dist(word1,lines[i])
        distance_list.append(dist)
    for j in range(0,58109):
        if distance_list[j]<=2:
            print lines[j]
            print" "   
    ffile.close()
if __name__ == "__main__":
    app_win = Tk()
    app_win.title("spell")
    app_label = Label(app_win, text="Enter the incorrect word")
    app_label.pack()
    app_entry = Entry(app_win)
    app_entry.pack()
    app_button = Button(app_win, text="Get Suggestions", command=retrieve_text)
    app_button.pack()
    # Initialize GUI loop
    app_win.mainloop()
于 2013-11-20T09:46:55.507 回答
1

from autocorrect import spell 为此,您需要安装,更喜欢 anaconda,它仅适用于单词,而不适用于句子,所以这是您将面临的限制。

from autocorrect import spell
print(spell('intrerpreter'))
# output: interpreter
于 2018-12-28T11:17:46.190 回答
1

Spark NLP 是我使用的另一个选项,它运行良好。一个简单的教程可以在这里找到。https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/jupyter/annotation/english/spell-check-ml-pipeline/Pretrained-SpellCheckML-Pipeline.ipynb

于 2020-03-12T14:02:54.963 回答
1

pyspellchecker是解决此问题的最佳方法之一。pyspellchecker该库基于 Peter Norvig 的博客文章。它使用Levenshtein 距离算法来查找与原始单词 2 的编辑距离内的排列。有两种方法可以安装这个库。官方文档强烈推荐使用pipev包。

  • 安装使用pip
pip install pyspellchecker
  • 从源安装
git clone https://github.com/barrust/pyspellchecker.git
cd pyspellchecker
python setup.py install

以下代码是文档中提供的示例

from spellchecker import SpellChecker

spell = SpellChecker()

# find those words that may be misspelled
misspelled = spell.unknown(['something', 'is', 'hapenning', 'here'])

for word in misspelled:
    # Get the one `most likely` answer
    print(spell.correction(word))

    # Get a list of `likely` options
    print(spell.candidates(word))
于 2020-09-10T15:30:22.203 回答
0

你也可以试试:

点安装文本块

from textblob import TextBlob
txt="machne learnig"
b = TextBlob(txt)
print("after spell correction: "+str(b.correct()))

拼写纠正后:机器学习

于 2021-11-30T02:47:41.817 回答