Зачем это нужно


При переводах текстов удобно иметь программу, которая не только находит грамматические ошибки, но и предлагает варианты замены неправильно написанного слова. В отличии от известных текстовых процессоров такая программа должна иметь простую и быструю смену языков проверки при их достаточном количестве. Нужно также предусмотреть фильтр для исключения непереводимых обозначений. Всё перечисленное можно реализовать на Python, Для этого нужно скачать библиотеку PyEnchant, например здесь[1]. Настроить эту библиотеку и добавить словари для русского языка.

Код программы


Модули библиотеки и пустой словарь для названия языка.

# -*- coding: utf-8 -*-
import enchant
from enchant.checker import SpellChecker
from enchant.tokenize import EmailFilter, URLFilter

Передача данных при выборе языка в программу.

def get(event):
        t=str(l.get(event.widget.curselection()))
        w['key']=0
        w['key']=t
        lab = tk.Label(root, text="", font="Arial 12")
        lab.grid_remove()
        lab = tk.Label(root, text= "Выбран язык -%s--Ввод: поля 1-текст, 2-слово. Вывод поле 3-результат"%t, font="Arial 12")
        lab.grid(row=0, column=0)

Проверка правописания одного слова.

def pravopus():
        t=w['key']
        d = enchant.Dict(t)   
        tex=txt_0.get(1.0, END).strip()
        if len(tex)!=0:
                m=d.check(tex)
                if m:
                        txt.insert(END, "Слово-%s-написано правильно\n"%tex)
                else:
                        txt.insert(END, "Слово--%s- написано не правильно, нужно так-%s- \n"%(tex,str(d.suggest(tex))))
        elif len(tex)==0:
                txt.insert(END, "Введите слово!!!\n")

Проверка правописания фрагмента текста с исключением Email и URL.

def tokenise():
        try:
                t=w['key']
                txt.delete(1.0, END)
                p= enchant.Dict(t)
                d=  SpellChecker(t,filters=[EmailFilter,URLFilter])
                tex=txt_1.get(1.0, END).strip()
                d.set_text(tex)
                k=0
                for err in d:
                        k=k+1
                        txt.insert(END, "ERROR:",err.word, p.suggest(err.word))
                        txt.insert(END, "\n")
                if k==0:
                        txt.insert(END, 'Предложение написано правильно\n')
        except:
                txt.insert(END, "Ошибка ввода!!!\n")
                pass

Очистка полей и интерфейс tkinter.

def clearn():
        txt_0.delete(1.0, END)
        txt_1.delete(1.0, END)
        txt.delete(1.0, END)
import tkinter as tk    
from tkinter import *
root = tk.Tk()       
main_menu = Menu(root)
root.config(menu=main_menu)
file_menu = Menu(main_menu)
main_menu.add_cascade(label="Орфография", menu=file_menu)
file_menu.add_command(label="Проверка блока текста", command=tokenise)
file_menu.add_command(label="Очистка всех полей", command=clearn)
file_menu.add_command(label="Выход", command=root.destroy)
lab = tk.Label(root, text="Выбирите язык", font="Arial 12")
l = tk.Listbox(root,takefocus=True, width=6,height=5,font="Arial 12")
txt = tk.Text(root, width=64,height=5,font="Arial 12",wrap=WORD)
txt_0 = tk.Text(root, width=64,height=1,font="Arial 12",wrap=WORD)
txt_1 = tk.Text(root, width=64,height=5,font="Arial 12",wrap=WORD)
but = tk.Button(root,text="Проверить слово",command=pravopus)
lab.grid(row=0, column=0)
txt_1.grid(row=1, column=0)
txt_0.grid(row=2, column=0)
txt.grid(row=3, column=0)
l.grid(row=3, column=1)
but.grid(row=4, column=0)
l.insert(END,'en_AU', 'en_GB', 'en_US', 'de_DE', 'fr_FR', 'ru_RU', 'uk_UA')    
l.bind("<<ListboxSelect>>", get)
root.tk.mainloop()

Работа программы


Пример работы с русскими словами.



Пример работы с английским предложением.



Пример работы с немецким предложением.



1. Python проверка орфографии (windows, linux) — PyEnchant
Поделиться с друзьями
-->

Комментарии (24)


  1. rSedoy
    25.03.2017 11:02
    +5

    У вас очень ужасный код ((


    1. iroln
      26.03.2017 01:01
      +5

      Автор такой код пишет с первой статьи. Думаю, тут не исправить уже ничего.


    1. Scorobey
      26.03.2017 01:41
      -7

      Очень «содержательный» комментарий.А сами что либо написать не побывали.


      1. rSedoy
        26.03.2017 07:14
        +1

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


        1. Scorobey
          26.03.2017 10:48
          -6

          Со столь скромными Вашими результатами говорить от имени настоящих программистов думаю Вам не стоит.Кроме того когда голословные заявления нечем подтвердить от досады употребляют характеристики «детские» и тому подобные.Если Вы сами написали правильный код дайте ссылку. Но на таком серьёзном форуму у Вас 0. Будьте корректны с самооценкой.


          1. rSedoy
            26.03.2017 11:05
            +4

            Ага, в дело пошел аргумент «сперва добейся» ;)
            Ладно, укажу на насколько косяков
            1. Почитайте про pep8
            2. Для чего тут первая строка?

            w['key']=0
            w['key']=t
            

            3. Каша в голове с импортами
            import tkinter as tk    
            from tkinter import *
            

            4. Не надо так делать
            if len(tex)!=0:
            elif len(tex)==0:
            

            достаточно
            if tex:
            else:
            

            5.
            except:
                txt.insert(END, "Ошибка ввода!!!\n")
                pass
            

            Ловить общий except очень плохо, а pass тут не нужен

            И т.п., дальше надоело в этом трэше разбираться.


            1. Scorobey
              26.03.2017 11:26
              -6

              Объясняю
              w['key']=0
              w['key']=t
              Обновление словаря для смены надписи
              import tkinter as tk
              from tkinter import * Первое для открытия окна второе для подключения всех модулей библиотеки
              if len(tex)!=0:
              elif len(tex)==0: Вырвано из контекста — два разных условия а остальные тоже есть
              Вы уверены что не надо так делать???
              Вы утверждаете овить общий except очень плохо, а pass тут не нужен
              Это правильно в общем случае а для библиотеки pyenchant без отлова конкретики работает быстрее.


              1. rSedoy
                26.03.2017 11:34
                +2

                К сожалению, этого вашего комментария вполне достаточно чтобы понять, что указывать на ваши ошибки бессмысленно.


              1. saluev
                26.03.2017 19:30
                +3

                Попробуем пробить этот барьер.
                Вам товарищ объясняет, что в коде

                w['key']=0
                w['key']=t
                первая строка бессмысленна, потому что этот код совершенно, по всем параметрам эквивалентен коду
                w['key']=t


    1. Scorobey
      26.03.2017 11:06
      -5

      Вы открыли новую характеристику кода «ужасный» что она в сравнении с читаемостью быстродействием и дружественным интерфейсом.


      1. rSedoy
        26.03.2017 11:09
        +6

        Огорчу вас, ваш код «нечитаемый», про «с дружественным интерфейсом» очень смешно ;)


        1. Scorobey
          26.03.2017 11:53
          -5

          Python читает а Вы нет. Очень смешно…


          1. rSedoy
            26.03.2017 11:56
            +3

            //_-)


          1. iroln
            27.03.2017 12:55
            +3

            Код читают люди, а не Python. Вы серьёзно всё это? :)


  1. foxin
    25.03.2017 11:11
    +13

    Ирония судьбы: статья про грамматику изобилует грамматическими ошибками.


    1. rahna
      25.03.2017 15:52
      +2

      Я надеялся, что это обыграется в тексте статьи. А получился какой-то UAZ Patriot..)


    1. Scorobey
      26.03.2017 11:44

      Ирония когда при переводе открыто 10 словарей вместо одной короткой программы.


  1. daiver19
    25.03.2017 12:55
    +3

    Я не понимаю, почему эти статьи продолжают появляться. Они явно не несут никакой ценности.


  1. antage
    25.03.2017 14:41
    +5

    Автор точно понимает чем отличается грамматика от орфографии? Я в статье никакого намека на проверку грамматики или грамматический анализ не увидел.


  1. LingvoLena
    25.03.2017 16:30
    -6

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


    1. kez
      25.03.2017 23:32
      +3

      Это любовь с первого^W первой статьи


      1. Scorobey
        26.03.2017 01:50
        -5

        Это математика 0 в любой степени 0


      1. saluev
        26.03.2017 19:32
        +2

        У людей, может, идёт своя, тонкая игра…


  1. tytar
    26.03.2017 15:53
    +1

    мне кажется достаточно было взять NLPK + pymorph