GithubHelp home page GithubHelp logo

textgenerator's People

Contributors

klevvit avatar

Watchers

 avatar

textgenerator's Issues

Подробнее описать скрипты в help

TextGenerator/train.py

Lines 21 to 35 in 421a2c4

description='Create model for generator.',
epilog='March 2018, Lev Kovalenko', add_help=True)
p.add_argument('--input-dir', '-i',
help='optional; path to directory with text files (and '
'with NO directories!!!), read from standard input '
'stream if not stated')
p.add_argument('--model', '-m', type=argparse.FileType('w'),
help='path to file for saving model')
p.add_argument('--lc', '-l', action='store_true',
help='optional; convert words to lowercase')
p.add_argument('--no-cleanup', '-nc', action='store_true',
help='optional; do not remove non-alphabetic symbols')
p.add_argument('--min-quantity', '-mq', type=int,
help='optional; minimal quantity of word pairs in text '
'for saving them to model')

Представь, что тебе прислали код и ты запускаешь --help, чтобы понять что это и как им пользоваться, пока это не очень понятно.

Поправить отступы

d = json.load(input_file) # Key: first_word,
# Val: {Key: second_word, Val: quantity1}

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

Убрать дублирование кода

TextGenerator/train.py

Lines 144 to 149 in 421a2c4

read_stream(sys.stdin, args.lc, not args.no_cleanup)
else:
file_list = get_all_files(input_dir)
for file_path in file_list:
f = open(file_path, 'r')
read_stream(f, args.lc, not args.no_cleanup)

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

Свести все в один хороший скрипт

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

В мастере должен быть максимально чистый, красивый и понятный код. А в репозитории не должно остаться "мертвых веток"

Заменить while на for

TextGenerator/train.py

Lines 96 to 109 in 421a2c4

while not is_end_of_stream:
line = process_string(line, lower, cleanup)
line = line.split()
for i in range(0, len(line) - 1):
pass
add_to_dict(line[i], line[i + 1])
new_line = stream.readline()
if new_line == '':
is_end_of_stream = True
if not line:
line = new_line
else:
line = line[-1] + ' ' + new_line
add_to_dict(line.replace(' ', ''), None)

Во-первых, зачем там pass?
Во-вторых, давай заменим цикл на for, чтобы избавиться от условий и лишних переменных.
В-третьих, не понимаю, что за странная манипуляция в последней строке.
В-четвертых, попробуй переделать добавление пар в словарь так, чтобы это было без цикла

Две попытки прочтения файла с моделью

d = json.load(input_file) # Key: first_word,
# Val: {Key: second_word, Val: quantity1}
line = input_file.readline()
while line != '':
tup = line.split(WORD_SEPARATOR)
d[tup[0]].append([tup[1], int(tup[-1])])
line = input_file.readline()
input_file.close()

Зачем ты после json.load пытаешься читать файл? Я же показывала на семинаре как минимум, что там никогда не будет выполняться цикл

Исправить использование глобальной константы

WORD_SEPARATOR = ' ' # Const

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

Упростить функцию process_string

TextGenerator/train.py

Lines 57 to 61 in 421a2c4

for char in dirty_string:
if char.isspace():
clean_string += ' '
elif not cleanup or char.isalpha():
clean_string += char

Сама по себе функция очень хорошая (потому что ее можно переиспользовать), но попробуй избавиться от циклов с помощью регулярных выражений (модуль re)

Сократить main

parser = create_parser()
args = parser.parse_args()
input_file = args.model
WORD_SEPARATOR = ' ' # Const
d = json.load(input_file) # Key: first_word,
# Val: {Key: second_word, Val: quantity1}
line = input_file.readline()
while line != '':
tup = line.split(WORD_SEPARATOR)
d[tup[0]].append([tup[1], int(tup[-1])])
line = input_file.readline()
input_file.close()
length = args.length
output_stream = args.output
if output_stream is None:
output_stream = sys.stdout
word = None
if args.seed is not None:
word = args.seed
if d.get(word) is None:
raise KeyError('No such word in texts')
output_stream.write(word + ' ')
length -= 1
for i in range(length):
next_words = d.get(word)
if not next_words:
word = random.choice(list(d.keys()))
else:
word = weighted_choice(next_words.items())
output_stream.write(word + ' ')
output_stream.close()

Он у тебя слишком длинный. Хороший main занимает несколько строк. Разбей его на логические куски, а они там есть еще, и добавь функций

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.