Зачем это нужно
При переводах текстов удобно иметь программу, которая не только находит грамматические ошибки, но и предлагает варианты замены неправильно написанного слова. В отличии от известных текстовых процессоров такая программа должна иметь простую и быструю смену языков проверки при их достаточном количестве. Нужно также предусмотреть фильтр для исключения непереводимых обозначений. Всё перечисленное можно реализовать на 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)
foxin
25.03.2017 11:11+13Ирония судьбы: статья про грамматику изобилует грамматическими ошибками.
rahna
25.03.2017 15:52+2Я надеялся, что это обыграется в тексте статьи. А получился какой-то UAZ Patriot..)
Scorobey
26.03.2017 11:44Ирония когда при переводе открыто 10 словарей вместо одной короткой программы.
daiver19
25.03.2017 12:55+3Я не понимаю, почему эти статьи продолжают появляться. Они явно не несут никакой ценности.
antage
25.03.2017 14:41+5Автор точно понимает чем отличается грамматика от орфографии? Я в статье никакого намека на проверку грамматики или грамматический анализ не увидел.
LingvoLena
25.03.2017 16:30-6Программа с удобным интерфейсом. Быстрое переключение языков. Не делает не нужных исправлений в адресах. Программа проверяет орфографию, потому название.с лишней претензией.
rSedoy
У вас очень ужасный код ((
iroln
Автор такой код пишет с первой статьи. Думаю, тут не исправить уже ничего.
Scorobey
Очень «содержательный» комментарий.А сами что либо написать не побывали.
rSedoy
Первой мыслью было указать на конкретные ваши ошибки, но они настолько «детские» и очевидные для обычного программиста, что нет смысл указывать на них на сайте уровня Хабра.
Scorobey
Со столь скромными Вашими результатами говорить от имени настоящих программистов думаю Вам не стоит.Кроме того когда голословные заявления нечем подтвердить от досады употребляют характеристики «детские» и тому подобные.Если Вы сами написали правильный код дайте ссылку. Но на таком серьёзном форуму у Вас 0. Будьте корректны с самооценкой.
rSedoy
Ага, в дело пошел аргумент «сперва добейся» ;)
Ладно, укажу на насколько косяков
1. Почитайте про pep8
2. Для чего тут первая строка?
3. Каша в голове с импортами
4. Не надо так делать
достаточно
5.
Ловить общий except очень плохо, а pass тут не нужен
И т.п., дальше надоело в этом трэше разбираться.
Scorobey
Объясняю
w['key']=0
w['key']=t
Обновление словаря для смены надписи
import tkinter as tk
from tkinter import * Первое для открытия окна второе для подключения всех модулей библиотеки
if len(tex)!=0:
elif len(tex)==0: Вырвано из контекста — два разных условия а остальные тоже есть
Вы уверены что не надо так делать???
Вы утверждаете овить общий except очень плохо, а pass тут не нужен
Это правильно в общем случае а для библиотеки pyenchant без отлова конкретики работает быстрее.
rSedoy
К сожалению, этого вашего комментария вполне достаточно чтобы понять, что указывать на ваши ошибки бессмысленно.
saluev
Попробуем пробить этот барьер.
первая строка бессмысленна, потому что этот код совершенно, по всем параметрам эквивалентен кодуВам товарищ объясняет, что в коде
Scorobey
Вы открыли новую характеристику кода «ужасный» что она в сравнении с читаемостью быстродействием и дружественным интерфейсом.
rSedoy
Огорчу вас, ваш код «нечитаемый», про «с дружественным интерфейсом» очень смешно ;)
Scorobey
Python читает а Вы нет. Очень смешно…
rSedoy
//_-)
iroln
Код читают люди, а не Python. Вы серьёзно всё это? :)