Предложение слова Python

Я ищу помощь в кодировании системы подсказки слов с использованием Python. При заданном вводе случайных последовательностей символов я хочу иметь возможность искать в списке слов и давать некоторые рекомендации по словам.

Я нашел в шкафах систему исправления правописания (https://norvig.com/spell-correct.html) при анализе функции «edits1» она дает некоторые результаты, однако они основаны на одном редактировании (например, включение одного «a» во входную строку).

Чего я хочу добиться, так это использовать более одной буквы, то есть гласных или согласных. например учитывая буквы «prt», поиск по словарю должен рекомендовать «часть» и «отдельно» и т. д.

Filler.py – https://norvig.com/spell-correct.html

            import re
            from collections import Counter

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

            WORDS = Counter(words(open('E:\\new\\words.txt').read())) #wordlist containing numerious word e.g. 'prut', 'prot', 'port', 'part', 'prat', 'pert', 'pret', 'apart'.

            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    = 'aeiouxyz'
                splits     = [(word[:i], word[i:])    for i in range(len(word) + 2)]
                inserts    = [L + c + R               for L, R in splits for c in letters]
                return set(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))

InputString.py

            import filler

            h = ['prt']
            for x in h:
                input = filler.candidates(h[0])
                print(input)

person Manifesto    schedule 18.02.2019    source источник
comment
Что ж, filler.py основан на двух или менее правках, а большее количество правок может быть легко выполнено с помощью цикла. Вопрос в том, сколько раз вы хотите редактировать и уверены ли вы, что согласные также используются для вставки, скажем, например. учитывая, что «bt», «но», «летучая мышь», «бит» должны быть рекомендованы, а «пояс», «завтрак» и т. д. также рекомендуются?   -  person C.K.    schedule 18.02.2019
comment
До четырех правок соответствовало бы моим требованиям. Должны использоваться только те гласные и согласные, которые указаны в переменной 'letters'.   -  person Manifesto    schedule 18.02.2019


Ответы (1)


Ну, я изменил ваш код. Класс Suggestor получает два параметра, max_times и letters, так что вы можете изменять их когда угодно и как угодно.

import re

from collections import Counter

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

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

class Suggestor:
    def __init__(self,max_times,letters):
        self.max_times = max_times
        self.letters = letters

    def candidates(self,word):
        return self.known(self.edited_word(word))

    def known(self,words):
        return set(w for w in words if w in WORDS)

    def edit(self,word):
        letters = self.letters
        splits = [(word[:i], word[i:]) for i in range(len(word) + 2)]
        inserts = [L + c + R for L, R in splits for c in letters]
        return list(set(inserts))

    def edited_word(self,raw_word):
        words = [[raw_word]]
        for i in range(self.max_times):
            i_times_words = []
            for word in words[-1]:
                i_times_words += self.edit(word)
            words.append(list(set(i_times_words)))
        return [w for word in words for w in word]

if __name__ == '__main__':
    word = 'prt'
    suggestor = Suggestor(max_times=4,letters='aeiouxyz')
    print(suggestor.candidates(word))

И вывод вышеуказанного теста:

{'партия', 'паритет', 'чистота', 'часть', 'порт', 'прото', 'порт', 'партия', 'апарт', 'параит', 'экспорт', 'работа', ' эксперт", "пират"}

Более того, я предлагаю проверить вероятности всех слов, и вы можете отфильтровать некоторые из них с помощью теоремы Байеса.

person C.K.    schedule 18.02.2019
comment
Большое спасибо, это именно то, что я искал! :) - person Manifesto; 18.02.2019