Giter VIP home page Giter VIP logo

text_generator's Issues

Убрать *start*

text_generator/train.py

Lines 63 to 66 in 9d2d037

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

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

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

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. Получится в два раза меньше кода и работать будет быстрее.

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

text_generator/train.py

Lines 29 to 31 in b865074

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

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

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

if filename.endswith('.txt'):

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

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

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

Создать 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, чтобы можно было использовать потом отдельные методы из твоего скрипта в других

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

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

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

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

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

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

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 (лучше одно из двух последних). Во-первых, это избавит тебя от необходимости обрабатывать запись модели циклами. Во-вторых, использование готовых библиотек избавит от возможных ошибок и позволит другим проще пользоваться сохраненными тобой моделями.

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

import argparse as ap

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

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

d = previous_bigrams(model)

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

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

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.