Подделка фильма о пчелах

Я написал программу, которая берет исходный файл (сценарий «фильма о пчелах») и производит подсчет слов, уникальный подсчет слов и заменяет некоторые слова. На самом деле это просто спешная версия, поэтому, если есть какие-либо ошибки или способы исправить / сделать код более эффективным, сообщите мне.

Ссылка на сценарий: https://github.com/esker-luminous/Bee-Movie-Knock-off/blob/main/script.py — это очень большой файл.

Код:

file = open('script.py', 'r')

words = []
punctuation = '1234567890!@#$%^&*()_-+=-/*{}[];:'"<>~`|?'

for line in file:
    line = line.lower()
    for char in punctuation:
        line = line.replace(char, '')

    words += line.split()

print(len(words))
print(len(set(words)))
file.seek(0)

text = file.read()
print(text)
file.close()

word_replacement ={'bee': 'turtle', 'hive': 'cow', 'flower': 'algae', 'bees': 'turtle', 'flowers' : 'algae'}
for wor_repl in word_replacement.keys():
    text = text.replace(wor_repl, word_replacement[wor_repl])
file = open('knock off.py', 'w')
file.write(text)
file.close()

2 ответа
2

В той части, где вы впервые читаете файл, вы можете написать его так:

import collections
import re

file = open('bee_movie.txt', 'r')

text = ""
words = collections.Counter()
punctuation = '1234567890!@#$%^&*()_-+=-/*{}[];:'"\<>~`|?'
all_upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
all_lower = "abcdefghijklmnopqrstuvwxyz"
translation = str.maketrans(all_upper, all_lower, punctuation)

for line in file:
    text += line # concatenating like this is optimized in python 3
    words.update(line.translate(translation).split())

print(sum(words.values()))
print(len(words))
file.close()

В части, где вы заменяете слова, было бы быстрее, если бы вы использовали re.sub. Когда вы используете text.replace, он должен переделывать весь скрипт каждый раз, когда он используется.

Также вы должны сохранить текстовые файлы как файлы .txt, им не нужно расширение .py.

Кстати, вы можете импортировать строку и использовать string.ascii_uppercase, string.ascii_lowercase и string.punctuation, если вы не хотите вводить все символы.

  • 1

    @Peilonrayz спасибо за ваш вклад!

    — благодарный светящийся

  • 1

    @my_first_c_program большое спасибо за то, что дали мне знать! ценить это :))

    — благодарный светящийся

  • 1

    Не могли бы вы указать «конкатенация, как это оптимизировано в python 3». В последний раз я слышал, что это деталь реализации CPython, но я ничего не нашел об этом, когда искал ее в последний раз.

    — Пейлонрайз

  • 1

    Будьте осторожны при объединении CPython и Python. В этом посте говорится только о CPython.

    — Пейлонрайз

  • 2

    maketrans мне было интересно узнать; Я никогда раньше с этим не сталкивался. В целом мне это нравится больше, чем использование регулярного выражения для этого приложения.

    — Райндериен

это очень большой файл

Возможно, если вы работаете на микроконтроллере. В противном случае 52 КБ — это не считается большим и может легко поместиться в памяти много тысяч раз.

Примите во внимание следующие корректировки:

  • Не повторяйте строки, особенно потому, что ваш входной файл имеет странный формат, когда большинство предложений уже разбито на множество отдельных строк, это неэффективно. Просто прочтите все это в память.
  • Сообщите пользователю значение двух выводимых длин.
  • Избегайте явных close, и используйте with вместо этого диспетчер контекста.
  • Не перечитывайте свой файл; просто сохраните неизмененную версию его содержимого в памяти.
  • Не звони keys; вместо этого позвони items что дает вам и ключ, и ценность.
  • Избегайте зацикливания на каждом символе пунктуации. Вместо этого используйте str.transate чтобы удалить все совпадения за один проход.

Предлагается:

from string import ascii_lowercase, ascii_uppercase

with open('bee-movie.txt') as f:
    text = f.read()

trans = str.maketrans(ascii_uppercase, ascii_lowercase, r'1234567890!@#$%^&*()_-+=-/*{}[];:'"<>~`|?')
no_punc_text = str.translate(text, trans)

words = no_punc_text.split()
print('Total words:', len(words))
print('Total unique words:', len(set(words)))

word_replacement = {'bee': 'turtle', 'hive': 'cow', 'flower': 'algae',
                    'bees': 'turtles', 'flowers': 'algae'}
for source, dest in word_replacement.items():
    text = text.replace(source, dest)

with open('turtle-movie.txt', 'w') as f:
    f.write(text)

  • 1

    Спасибо тебе большое за это! ценю это 🙃

    — благодарный светящийся

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *