Giter VIP home page Giter VIP logo

text_generator's Introduction

text_generator

  1. This is simple python text generator module.

  2. Train.py module is used for creating model based on input text.

  3. Model is generated using bigrams and cumilative distribution.

  4. Model is saved into a file using python pickle module.

  5. Generate.py generates text of given length using model from train.py

  6. Both scripts have command-line interface.

  7. All information about usage is provided by --help in the command-line.

text_generator's People

Contributors

garrrikkotua avatar

Watchers

 avatar  avatar  avatar  avatar

text_generator's Issues

Добавить with или обработку исключения

text_generator/train.py

Lines 29 to 31 in b865074

file = open(input_dir, 'r')
yield file
file.close()

Нужно обернуть место работы с файлом в with блок, чтобы даже в случае генерации исключения все файлы закрылись + неплохо бы написать предупреждение, что все файлы будут закрыты после итерирования по генератору (иначе пользователь может случайно наткнуться на исключение при попытке обернуть генератор листом и использовать после этого файлы)

Убрать чтение из модели в train.py

d = previous_bigrams(model)

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

Правильно читать постановку задачи - это важно. Если есть какие-то вопросы, то их нужно задавать до того как делать что-то, и главное просто из головы ничего не брать, потому что заказчик (постановщик задачи) обычно не просто так формирует требования, а собирается исходя из них (и больше не из чего) использовать результат.

Убрать проверку на расширение

if filename.endswith('.txt'):

Строго говоря, в задаче не было сказано, что на вход подаются файлы в формате txt. Тебе могут прийти json, xml, csv и прочие форматы файлов, которые содержат текст и которые можно прочитать без трудностей (ну то есть xlsx или doc не придет и это гарантируется)

Использовать стандартные способы сериализации

text_generator/train.py

Lines 79 to 82 in 9d2d037

with open(model, 'w') as file: # writing model to file
for bigram in d:
w1, w2 = bigram
file.write('{} {} {}\n'.format(w1, w2, d[bigram]))

Вместо записи в своем собственном формате лучше использовать csv, json или pickle (лучше одно из двух последних). Во-первых, это избавит тебя от необходимости обрабатывать запись модели циклами. Во-вторых, использование готовых библиотек избавит от возможных ошибок и позволит другим проще пользоваться сохраненными тобой моделями.

Убрать копирования кода

text_generator/train.py

Lines 39 to 46 in 9d2d037

if lowercase:
for file in files:
for line in file:
yield line.lower()
else:
for file in files:
for line in file:
yield line

Копипаст - это плохо. Если ты потом захочешь чуть-чуть изменить логику, то придется ее менять в двух местах сразу. Лучше условие внести внутрь цикла, например, так:
yield line.lower() if lowercase else line

Убрать *start*

text_generator/train.py

Lines 63 to 66 in 9d2d037

b1 = '*start*'
for b2 in words:
yield (b1, b2)
b1 = b2

Идея твоя понятна в принципе, но она порождает неверное поведение генератора, который на seed *start* генерирует текст. Подумай как решить эту проблему

Описание скрипта

import argparse as ap

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

Создать main

text_generator/train.py

Lines 104 to 112 in 9d2d037

parse = ap.ArgumentParser(description='Train on some text')
parse.add_argument('-i', '--input-dir', help='Input directory',
default='', required=True)
parse.add_argument('-m', '--model',
help='Path to the file where model will be saved',
required=True)
parse.add_argument('--lc', action='store_true', help='Make text lowercase')
args = parse.parse_args()
train(args.input_dir, args.model, args.lc)

Весь этот кусок кода лучше вынести в main, чтобы можно было использовать потом отдельные методы из твоего скрипта в других

Исправить обработку завершающего слова

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

Ускорить генерацию слов

total = sum(w for w in model[current_word].values())
r = random.uniform(0, total)
upto = 0
for c, w in model[current_word].items():
if upto + w >= r:
return c
upto += w

Цикл - это медленно, особенно если у тебя для слова есть много вариантов следующего, переделай на numpy.random.choice. Получится в два раза меньше кода и работать будет быстрее.

Можно убрать else

if seed == '':
return random.choice(list(model.keys()))
else:
if seed not in model.keys():
raise ValueError('Invalid seed')
return seed

У тебя в условии возвращается значение, то есть нет смысла писать else (тем более ты же этого не делаешь в следующей проверке)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.