СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Простая программа на PYTHON для граматического анализа слов и фрагментов текста в черновиках Recovery Mode

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


При переводах текстов удобно иметь программу, которая не только находит грамматические ошибки, но и предлагает варианты замены неправильно написанного слова. В отличии от известных текстовых процессоров такая программа должна иметь простую и быструю смену языков проверки при их достаточном количестве. Нужно также предусмотреть фильтр для исключения непереводимых обозначений. Всё перечисленное можно реализовать на 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
–6
~3100

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

+5
rSedoy ,  
У вас очень ужасный код ((
+5
iroln ,  

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

–7
Scorobey ,  
Очень «содержательный» комментарий.А сами что либо написать не побывали.
+1
rSedoy ,  
Первой мыслью было указать на конкретные ваши ошибки, но они настолько «детские» и очевидные для обычного программиста, что нет смысл указывать на них на сайте уровня Хабра.
–6
Scorobey ,  
Со столь скромными Вашими результатами говорить от имени настоящих программистов думаю Вам не стоит.Кроме того когда голословные заявления нечем подтвердить от досады употребляют характеристики «детские» и тому подобные.Если Вы сами написали правильный код дайте ссылку. Но на таком серьёзном форуму у Вас 0. Будьте корректны с самооценкой.
+4
rSedoy ,  
Ага, в дело пошел аргумент «сперва добейся» ;)
Ладно, укажу на насколько косяков
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 тут не нужен

И т.п., дальше надоело в этом трэше разбираться.
–6
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 без отлова конкретики работает быстрее.
+2
rSedoy ,  
К сожалению, этого вашего комментария вполне достаточно чтобы понять, что указывать на ваши ошибки бессмысленно.
+3
saluev ,  
Попробуем пробить этот барьер.
Вам товарищ объясняет, что в коде
w['key']=0
w['key']=t
первая строка бессмысленна, потому что этот код совершенно, по всем параметрам эквивалентен коду
w['key']=t
–5
Scorobey ,  
Вы открыли новую характеристику кода «ужасный» что она в сравнении с читаемостью быстродействием и дружественным интерфейсом.
+6
rSedoy ,  
Огорчу вас, ваш код «нечитаемый», про «с дружественным интерфейсом» очень смешно ;)
–5
Scorobey ,  
Python читает а Вы нет. Очень смешно…
+3
rSedoy ,  
//_-)
+3
iroln ,  

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

+13
foxin ,  

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

+2
rahna ,  
Я надеялся, что это обыграется в тексте статьи. А получился какой-то UAZ Patriot..)
0
+1 –1
Scorobey ,  
Ирония когда при переводе открыто 10 словарей вместо одной короткой программы.
+3
daiver19 ,  
Я не понимаю, почему эти статьи продолжают появляться. Они явно не несут никакой ценности.
+5
antage ,  

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

–6
LingvoLena ,  
Программа с удобным интерфейсом. Быстрое переключение языков. Не делает не нужных исправлений в адресах. Программа проверяет орфографию, потому название.с лишней претензией.
+3
kez ,   * (был изменён)

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

–5
Scorobey ,  
Это математика 0 в любой степени 0
+2
saluev ,  
У людей, может, идёт своя, тонкая игра…
+1
tytar ,  
мне кажется достаточно было взять NLPK + pymorph