web-dev-qa-db-ja.com

Pythonのスペルチェッカー

私はPythonおよびNLTK。 Python-2.7、PyEnchant、およびNLTKライブラリー以下のコードは、修正/置換を処理するクラスです。

from nltk.metrics import edit_distance

class SpellingReplacer(object):
    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

単語のリストを受け取り、各単語に対してdef置換を実行し、単語のリストを返しますが、スペルが正しい関数を作成しました。

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」のようなスペルミスを検出できるものも必要ですか?スペルチェックを実行するより良い方法はありますか?もしそうなら、彼らは何ですか?たとえば、Googleのスペルサジェスタは非常に優れているので、どうすればよいでしょうか。助言がありますか

27
Mike Barnes

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のスペル修正プログラムの抜粋です

そして、良い知らせは、スペルチェッカーを徐々に追加して改善していくことができるということです。

お役に立てば幸いです。

26
Ram Narasimhan

autocorrectlibを使用して、Pythonのスペルチェックを行うことができます。
使用例:

from autocorrect import spell

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

結果:

caesar
message
service
the
25
Rakesh

pythonでのスペルチェックの最良の方法は、SymSpell、Bk-Tree、またはPeter Novigの方法によるものです。

最速のものはSymSpellです。

これはMethod1:参照リンク pyspellchecker

このライブラリは、Peter Norvigの実装に基づいています。

pip install 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))

Method2:SymSpell Python

pip install -U symspellpy

5
shaurya uppal

スペルコレクター->

tkinterを使用していくつかのグラフィックを追加したコードのパスを他の場所に変更した場合、デスクトップにコーパスをインポートする必要があります。これはWord以外のエラーに対処するためだけです!!

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()
1
ishaan arora

このための自動修正インポートスペルからインストールする必要があり、anacondaを優先し、文章ではなく単語に対してのみ機能するため、直面する制限になります。

autocorrect import spell print(spell( 'intrerpreter'))出力から:インタープリター

0

遅すぎるかもしれませんが、今後の検索に答えています。スペルミスの修正を実行するには、最初に、Wordが不条理なものではないこと、またはアルファベットを繰り返して、caaaar、amazzzingなどのスラングからではないことを確認する必要があります。したがって、まずこれらのアルファベットを取り除く必要があります。英語で知られているように、単語には通常最大2つのアルファベットが繰り返されます(例:こんにちは)。そのため、最初に単語から余分な繰り返しを削除してからスペルをチェックします。余分なアルファベットを削除するには、Pythonの正規表現モジュールを使用できます。

これが完了したら、Pythonのスペルを修正するためのPyspellcheckerライブラリを使用します。

実装については、このリンクをご覧ください: https://rustyonrampage.github.io/text-mining/2017/11/28/spelling-correction-with-python-and-nltk.html

0