Задача подсчета частоты употребления определенных букв в английских и русских текстах является одним из этапов лингво-статистического анализа. В каталоге Каталог лингвистических программ и ресурсов в Cети отсутствует программа на Python для решения указанной задачи.

На форумах по Python встречаются отдельные части такой программы, однако они ориентированы на один язык, главным образом английский. Учитывая это обстоятельство мной разработана программа для статистической обработки, как для русских, так и для английских текстов.

Импорт и начальные переменные


import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
import fileinput
import matplotlib as mpl

mpl.rcParams['font.family'] = 'fantasy'
mpl.rcParams['font.fantasy'] = 'Comic Sans MS, Arial'

Открытие файла с английским текстом


def w_open_ing():
     aa=ord('a')
     bb=ord('z')
     op = askopenfilename()
     main(op,aa,bb)

Открытие файла с русским текстом


def w_open_rus():
     aa=ord('а')
     bb=ord('ё')
     op = askopenfilename()
     main(op,aa,bb)

Универсальная обработка данных для обоих языков


def main(op,aa,bb):
     alpha = [chr(w) for w in range(aa,bb+1)]   #обратное преобразование кода в символы
     f = open(op , 'r') 
     text = f.read()
     f.close()
     alpha_text = [w.lower() for w in text if w.isalpha()]   #выбор только букв и привидение их к нижнему регистру
     k={}      #создание словаря для подсчета каждой буквы
     for i in alpha:     #заполнение словаря
          alpha_count =0
          for item in alpha_text:
               if item==i:
                    alpha_count = alpha_count + 1
          k[i]= alpha_count
     z=0
     for i in   alpha:      #графическая визуализация данных в поле формы
          z=z+k[i]
     a_a=[]
     b_b=[]
     t= ('|\tletter\t|\tcount\t|\tpercent,%\t\n')
     txt.insert(END,t)
     t=('|----------------------------|-----------------------------|---------------------------|\n')
     txt.insert(END,t)
     for i in  alpha:       #графическая визуализация данных в поле формы
         persent = round(k[i] * 100.0 / z,2)
         t=( '|\t%s\t|\t%d\t|\t%s\t\n' % (i, k[i], persent))
         txt.insert(END,t)
         a_a.append(i)
         b_b.append(k[i])
     t=('|----------------------------|-----------------------------|---------------------------|\n' )
     txt.insert(END,t)
     t=('Total letters: %d\n' % z)
     txt.insert(END,t)
     people=a_a     #подготовка данных для построения диаграммы
     y_pos = np.arange(len(people))
     performance =b_b     #подготовка данных для построения диаграммы
     plt.barh(y_pos, performance)
     plt.yticks(y_pos, people)
     plt.xlabel('Quantity(amount) of the uses of the letter in the text')
     plt.title('The letters of the alphabet')
     plt.show()       #визуализация диаграммы

Очистка поля


def clear_text():
        txt.delete(1.0, END)

Запись данных из поля в файл


def save_file():
        save_as = asksaveasfilename()
        try:
                x =txt.get(1.0, END) 
                f = open(save_as, "w")
                f.writelines(x.encode('utf8'))
                f.close()
        except:
                pass

Закрытие программы


def close_win():
     if askyesno("Exit", "Do you want to quit?"):
          tk.destroy()

Стандартный интерфейс ткинтер


tk= Tk()
main_menu = Menu(tk)
tk.config(menu=main_menu)
file_menu = Menu(main_menu)
main_menu.add_cascade(label="Aphabet", menu=file_menu)
file_menu.add_command(label="English text", command= w_open_ing)
file_menu.add_command(label="Russian text", command= w_open_rus)
file_menu.add_command(label="Save file", command=save_file)
file_menu.add_command(label="Cleaning", command=clear_text)
file_menu.add_command(label="Exit", command=close_win)
txt = Text(tk, width=72,height=10,font="Arial 12",wrap=WORD)
txt.pack()
tk.mainloop()

Преимущества


  • Программа написана на Python, что упрощает ее использование в BigARTM и Gensim.
  • Учитывает разницу русских букв «ё» и «е».
  • Имеет графический интерфейс и при этом «распространяет свободно».
Поделиться с друзьями
-->

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


  1. Crandel
    05.03.2017 17:53
    +9

    Позволю себе оставить несколько замечаний.
    1) Все переменные надо называть так, чтобы было понятно их назначение, а не а_а и b_b. — Через месяц при необходимости что-то исправить или добавить фичу — надо будет потратить кучу времени на вникание в код.
    2) В питоне считается нормой открывать файли через контекстные менеджеры with
    3) Ваше посторение таблицы никуда не годится, сначала лучше все посчитать, постоить список словарей


    [{'letter': l, 'count': c, 'percent': p}]

    А потом передать этот список в отдельную функцию, которая уже будет создавать таблицу по шаблону, что-то типа такого


    # Body
    for data in data_list:
        '| {letter} | {count} | {percent} |'.format(data)

    4) Ну и обработка ошибок должна быть объязательно


  1. Amet13
    05.03.2017 20:40
    +8

    SomeOneWhoCares и Scorobey либо один и тот же человек, либо два одногруппника.
    Слишком много студенческих статей по питону за последнюю неделю, плюс перекрестные комментарии в топиках.

    UPD: Вот еще один LingvoLena
    Один вопрос, зачем?


    1. Evgenym
      05.03.2017 22:31
      +1

      Вероятно, близится защита диплома и хочется поделиться с миром своими наработками.


      1. Amet13
        05.03.2017 23:02
        +1

        Ну что ж, ждем тогда

        парсинг сайтов с использованием lxml, urlib3 и pyparcing


        1. YaakovTooth
          09.03.2017 03:46
          +1

          Слишком сложные технологии, регулярные выражения и велосипед на сокетах — вот это действительно ждём.


  1. daiver19
    05.03.2017 23:51
    +2

    Вы, похоже, промахнулись ресурсом, куда хотели запостить это.