как изменить программу проверки орфографии Питера Норвига, чтобы получить больше предложений на слово

Я попробовал код Питера Норвига для проверки орфографии на http://norvig.com/spell-correct.html но как мне изменить его, чтобы получить больше предложений, а не только 1 правильное написание

import re
from collections import Counter

def words(text):
     return re.findall(r'\w+', text.lower())

WORDS = Counter(words(open('big.txt').read()))

def P(word, N=sum(WORDS.values())): 
    "Probability of `word`."
    return WORDS[word] / N

def correction(word): 
    "Most probable spelling correction for word."
    return max(candidates(word), key=P)

def candidates(word): 
    "Generate possible spelling corrections for word."
    return (known([word]) or known(edits1(word)) or known(edits2(word)) or 
           [word])

def known(words): 
    "The subset of `words` that appear in the dictionary of WORDS."
    return set(w for w in words if w in WORDS)

def edits1(word):
    "All edits that are one edit away from `word`."
    letters    = 'abcdefghijklmnopqrstuvwxyz'
    splits     = [(word[:i], word[i:])    for i in range(len(word) + 1)]
    deletes    = [L + R[1:]               for L, R in splits if R]
    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
    replaces   = [L + c + R[1:]           for L, R in splits if R for c in 
                  letters]
    inserts    = [L + c + R               for L, R in splits for c in 
    letters]
    return set(deletes + transposes + replaces + inserts)

def edits2(word): 
    "All edits that are two edits away from `word`."
    return (e2 for e1 in edits1(word) for e2 in edits1(e1))import re

person Yusuf    schedule 14.04.2017    source источник


Ответы (1)


Вы можете использовать функцию candidates.

Это дает вам

  • исходное слово, если оно уже правильно
  • в противном случае все известные слова с расстоянием редактирования 1 до исходного слова
  • если нет кандидата с расстоянием 1, то все кандидаты с расстоянием 2
  • если в предыдущем падеже ничего не было, то исходное слово

Если кандидаты найдены в случае 2 или 3, то возвращаемый набор может содержать более одного предложения.

Однако, если возвращается исходное слово, вы не знаете, так ли это, потому что оно правильное (случай 1) или потому, что нет близких кандидатов (случай 4).

Однако,

этот подход (способ реализации edits1()) является грубой силой, и он действительно неэффективен для длинных слов, и становится хуже, если вы добавляете больше символов (например, для поддержки других языков). Рассмотрим что-то вроде simstring для эффективного поиска слов с похожим написанием в большой коллекции.

person lenz    schedule 14.04.2017
comment
››› import simstring ››› db = simstring.reader('web1tuni/web1tuni.db') ››› db.measure = simstring.cosine ››› db.threshold = 0,9 ››› db.retrieve('приблизительно' ) ('приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно', 'приблизительно' ') почему он показывает эти слова, которые неверны в соответствии со словарем. Я также пробовал библиотеку pyenchant для предложений по проверке орфографии, но он также показывает предложения, которые не имеют смысла - person Yusuf; 17.04.2017
comment
Потому что web1tuni — это не словарь, а набор слов, найденных в Интернете. Я не уверен, почему он содержит биграммы, поскольку название предполагает, что он должен состоять только из униграмм. - person lenz; 17.04.2017
comment
в любом случае я мог бы избежать этих неправильных предложений слов? я пробовал много английских слов в текстовых файлах, но многие из них содержат неправильные слова. при использовании библиотеки pyenchant я использовал официально предоставленный словарь en_US, но все же он дает предложения для helo с некоторыми неправильными словами, такими как «he lo» ['helo'] ['hole', 'hello', 'helot', 'гало', ' герой', 'ад', 'держал', 'руль', 'помощь', 'он ло'] ['грп'] ['гр', 'горп', 'хватка', 'разрыв', 'гип', 'гр п'] - person Yusuf; 20.04.2017
comment
Если вы принимаете gr как аббревиатуру (а также отдельные буквы), то каждое из предложенных вами предложений является правильным английским словом (ищите их в словарь, если вы мне не верите). Если вы хотите найти наиболее вероятные кандидаты, вы можете, например, рассматривать частоты unigram (или n-gram). - person lenz; 21.04.2017