Как оптимизировать набор текста с помощью Python

Набор текста давно превратился в неотъемлемую часть нашей повседневной рутины. Поэтому умение оптимизировать процесс ввода текста с клавиатуры приносит огромную пользу тем, кто большую часть своего рабочего времени проводит за компьютером.

В статье я расскажу, как организован этот процесс у меня, и поделюсь скриптами и пакетами, которые использую для фиксации и визуализации своей производительности.

Зачем оптимизировать процесс набора текста?

Я инженер по машинному обучению, а значит  —  провожу большую часть рабочего времени за компьютером, занимаясь созданием моделей и написанием кода. Три года назад, изучая в магистратуре применение генеративно-состязательных сетей, я решил повысить продуктивность и немного поработать над своими навыками набора текста.

Научился печатать вслепую и уже через три месяца скорость печати у меня возросла с 60 до 95 слов в минуту (сегодня моя средняя скорость составляет около 105 слов в минуту). Это производительность при обычном вводе текста с клавиатуры. Скорость написания кода увеличилась с 35 до примерно 55–60 слов в минуту.

Такой прогресс здорово пригодился в работе и помог в моем хобби (в написании текстов). Думается, что нам всем будет полезно немного попрактиковаться в наборе текста.

Оптимизация набора текста

Перейдем сразу к коду! Весь процесс набора текста у меня организован очень просто и занимает около 5–10 минут в день.

Для того, чтобы практиковаться в наборе текста в терминале, я использую mltype. Это замечательный инструмент CLI (интерфейса командной строки): очень гибкий, с открытым исходным кодом и довольно аккуратный!

Для автоматизации процесса набора текста перейдем ко скрипту:

1. Импортируем зависимости

import os
import pathlib
import random
import pandas as pd
from datetime import datetime
import sys
import plotly.express as px
import plotly.graph_objs as go

2. Запускаем процесс набора текста с помощью mltype

def typePractice(typingDataset):
    files = list(typingDataset.iterdir())
    file = random.choice(files)
    with open(file, "r") as f:
        numberOfLines = len(f.readlines()) - 1
    
    if numberOfLines<=1:
        numberOfLines=2
    elif numberOfLines>10:
        numberOfLines=10

    os.system(f"mlt file --n-lines {numberOfLines} {file}")    


typingDatasetFolder = "path/to/your/typingDataset"
typingDataset = pathlib.Path(typingDatasetFolder)
typingPerformance = "path/to/your/typingPerformance.csv"
df = pd.read_csv(typingPerformance)
typePractice(typingDataset)

Здесь мы получаем все файлы Python в папке typingDataset, из которой выбираем случайный файл и отдаем его в вызов инструмента интерфейса командной строки mltype. Задаем количество строк этого файла параметром --n-lines, вот и все. Интерфейс для набора текста выглядит следующим образом:

Довольно минималистичный и работает отлично.

3. Фиксируем производительность при вводе текста и обновляем csv-файл, включив в него эту производительность

def updateTypingPerformance(df,datedPerformance, typingDfPath="path/to/typingPerformance.csv"):
    df.loc[len(df)] = datedPerformance
    df.to_csv(typingDfPath, index=False)
    return df

cont = "y"
while cont=="y":
    performance = []
    typePractice(typingDataset)
    date = str(datetime.now())
    wpm = input("What was the wpm?")

    acc = input("Waht was the accuracy?")

    performance.append(date)
    performance.append(wpm)
    performance.append(acc)

    updateTypingPerformance(df,performance)
    
    cont = input("Continue typing?")

Здесь мы получаем текущее время и фиксируем производительность с помощью встроенного метода Python input() (мне хотелось автоматизировать эту часть, но не удалось найти простой способ сделать это непосредственно из mltype).

Задействуем цикл while для бесконечного продолжения: так csv-файл с данными о производительности будет каждый раз обновляться.

4. Отображаем на графике

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from matplotlib import dates as mdates
from matplotlib import ticker


def plotTyping(typingDf):
    typingDf["wpm"] = pd.to_numeric(typingDf["wpm"])
    typingDf["accuracy"] = pd.to_numeric(typingDf["accuracy"])
    typingDf["date"] = pd.to_datetime(typingDf["date"])
    wpmAcc = typingDf.groupby("date")["wpm", "accuracy"].mean()
    wpm = wpmAcc["wpm"]
    acc = wpmAcc["accuracy"]
    fig, ax = plt.subplots(figsize=(15,7))
    ax.plot(wpm,label="wpm trend",color="red")
    ax.plot(acc, label="accuracy", color="green")
#     wpmAcc["wpm"].plot(label="wpm trend",color="red")
#     wpmAcc["accuracy"].plot(label="accuracy",color="green")
    ax.set_xticks(df["date"])
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
    ax.xaxis.set_minor_formatter(mdates.DateFormatter("%Y-%m-%d"))
    plt.gcf().autofmt_xdate()
    ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
    plt.xticks(rotation=45)
    plt.legend()
    plt.show()

if len(sys.argv)>1:
    if sys.argv[1]=="plot":
        plotTyping(df)

Здесь мы получаем простой график для текущей производительности при наборе текста. Зеленым цветом обозначены слова в минуту, а красным  —  процент точности. Как видите из графика, точность была в среднем выше 90 %, а скорость набора текста при написании кода  —  от 50 до 60 слов в минуту.

Заключение

Освоить быстрый набор текста  —  это круто, а написать код для автоматизации этого процесса  —  еще круче. Надеюсь, что статья оказалась полезной.

Спасибо за внимание!

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Lucas Soares: Optimized Typing with Python

Предыдущая статьяКак создать простого командного бота в Python
Следующая статьяОсновы Go: ввод-вывод файловой системы