Итак, я написал программу (пусть и уродливую), которая подсчитывает количество слов и экземпляров каждого уникального слова в заданном вводе.
Моя проблема в том, что я хочу использовать его для текстов песен, но большинство текстов песен содержат несколько разрывов абзаца.
У меня вопрос: как я могу использовать ввод текста с разрывами абзаца и сократить ввод до одной строки?
Это мой код на данный момент:
Song = {}
lines = []
while True:
line = input("")
if line:
lines.append(line)
else:
break
string = '\n'.join(lines)
def string_cleaner(string):
string = string.lower()
newString = ''
validLetters = " abcdefghijklmnopqrstuvwxyz"
newString = ''.join([char for char in string if char in validLetters])
return newString
def song_splitter(string):
string = string_cleaner(string)
words = string.split()
for word in words:
if word in Song:
Song[word] += 1
else:
Song[word] = 1
Ожидаемый ввод:
Well, my heart went "boom"
When I crossed that room
And I held her hand in mine
Whoah, we danced through the night
And we held each other tight
And before too long I fell in love with her
Now I'll never dance with another
(Whooh)
Since I saw her standing there
Oh since I saw her standing there
Oh since I saw her standing there
Желаемый результат:
This song has 328 words.
39 of which are unique.
This song is 11% unique words.
('i', 6)
('her', 4)
('standing', 3)
.... etc
Я новичок в программировании, поэтому я могу не знать всех сокращений, но моя проблема на данный момент заключается в том, что когда я пытаюсь ввести строку с разрывом абзаца (в IDLE), IDLE считывает разрыв абзаца как конец Вход. например, IDLE мог бы прочитать: «Но когда я вернусь к вам домой, я нахожу, что то, что вы делаете, заставит меня чувствовать себя хорошо // Знаешь, я работаю весь день, чтобы получить деньги, чтобы купить тебе вещи И это того стоит, чтобы просто услышать тебя. скажи, что собираешься дать мне все "как только", но когда ... чтобы ... чувствовать себя хорошо "
Возможно, вам следует указать в вопросе пример ввода и желаемый результат.
Пользовательский ввод: Ну, у меня сердце "бум", Когда я пересек эту комнату И я держал ее руку в своей Ого, мы танцевали всю ночь И мы крепко обнимали друг друга И вскоре я влюбился в нее Теперь я никогда не танцевать с другими (Ух) С тех пор, как я увидел ее стоящей О, с тех пор, как я увидел ее стоящей О, с тех пор, как я увидел ее стоящей там Желаемый результат что-то вроде: В этой песне 328 слов. 39 из которых уникальны. Эта песня на 11% состоит из уникальных слов. ('я', 6) ('она', 4) ('стоящая', 3) .... и т. д.
Напечатанные атрибуты не имеют значения ... Эта песня состоит из длинных слов бла-бла ... Я понимаю, что разрыв строки между «И я держал ее руку в своей» и «Ого, мы танцевали всю ночь» "обрабатывается так, как если бы пользователь" вводил "только строки до разрыва. Я пытаюсь найти способ избавиться от этого.






Следующий пример кода извлекает все слова (Только английский алфавит) из каждой строки и обрабатывает их (подсчитывает количество слов и извлекает экземпляры каждого уникального слова).
import re
MESSAGE = 'Please input a new line: '
TEST_LINE = '''
Well, my heart went "boom"
When I crossed that room
And I held her hand in mine
Whoah, we danced through the night
And we held each other tight
And before too long I fell in love with her
Now I'll never dance with another
(Whooh)
Since I saw her standing there
Oh since I saw her standing there well well
Oh since I saw her standing there
'''
prog = re.compile(r'\w+')
class UniqueWordCounter():
def __init__(self):
self.data = {}
def add(self, word):
if word:
count = self.data.get(word)
if count:
count += 1
else:
count = 1
self.data[word] = count
# instances of each unique word
set_of_words = UniqueWordCounter()
# counts the number of words
count_of_words = 0
def handle_line(line):
line = line.lower()
words = map(lambda mo: mo.group(0), prog.finditer(line))
for word in words:
global count_of_words
count_of_words += 1
set_of_words.add(word)
def run():
line = input(MESSAGE)
if not line:
line = TEST_LINE
while line:
'''
Loop continues as long as `line` is not empty
'''
handle_line(line)
line = input(MESSAGE)
count_of_unique_words = len(set_of_words.data.keys())
unique_percentage = count_of_unique_words / count_of_words
print('-------------------------')
print('This song has {} words.'.format(count_of_words))
print('{} of which are unique.'.format(count_of_unique_words))
print('This song is {:.2%} unique words.'.format(unique_percentage))
items = sorted(set_of_words.data.items(), key = lambda tup: tup[1], reverse=True)
items = ["('{}', {})".format(k, v) for k, v in items]
print('\n'.join(items[:3]))
print('...')
run()
Если вы хотите обрабатывать тексты в Другие языки, вам следует проверить этот ссылка на сайт.
Зачем вам нужно сокращать ввод до одной строки? Вы можете добавить все строки в список и пройти по нему.