Как сопоставить последовательную последовательность слов из списка в строку абзацев? - PullRequest
0 голосов
/ 06 апреля 2020

Мне очень тяжело с этой проблемой. Я все еще новичок, так что, конечно, ожидается.

Вот что я хочу:

Я пытаюсь использовать какой-то алгоритм принудительного выравнивания, чтобы извлечь начальные и конечные временные метки для транскрипта и аудиофайла.

Проблема в том, что аудиофайл содержит посторонние слова и предложения, которые намеренно удалены из стенограммы. (Например, «Можете ли вы переместить этот стул? Хорошо ...»)

К счастью, я нашел этот замечательный инструмент под названием Нежный , который очень точен и может выдержать эти несоответствия, отлично!

Я использовал этот инструмент для получения меток времени принудительного выравнивания на уровне слов.

Это тип вывода, который он мне дал ...

Слова , Обнаруженные слова , Время начала слова в секундах , Время окончания Word в секундах

,, 0,0, 0,07

вопрос, вопрос, 0,07, 0,19

, составляет 0,19, 0,33

....

А и 823, 823,2

и др. c.

Итак, теперь у меня есть файл CSV с метками времени для каждого слова (исключая пунктуацию, конечно), отлично!

Как теперь из этого получить временные метки для каждой строки в моем текстовом файле с расшифровкой?

Я знаю, что могу преобразовать секунды в часы-минуты-секунды. Очень просто. Но я не знаю, как я могу написать скрипт, который принимает текстовый файл, который выглядит следующим образом:

"Вопрос в следующем. Почему, черт возьми, это так сложно сделать? вы просто делаете начальную временную отметку для уровня предложения и уровня абзаца, если вы так точны?

Поэтому я сказал себе: может быть, у людей с переполнением стека есть решение, эти люди склонны быть очень рад приветствовать новичков! Очень теплый и услужливый, я никогда в своей жизни не был так благодарен за публикацию сообщения о том, как глупый новичок в переполнении стека ».

И каким-то образом анализирует CSV и получает время начала этого абзаца и время окончания. Я уже пытался сделать это, но я сталкиваюсь с самыми странными проблемами.

Некоторые определения, чтобы (попытаться) понять, что происходит в моем коде: «выровнять по index.csv» относится к CSV-файлу, о котором я говорил выше, из Gentle, за исключением того, что я добавил к нему индекс, так что что я могу исключить уже проанализированные слова Что я пытаюсь сделать в приведенном ниже коде? Я пытаюсь выяснить, могу ли я получить точную последовательность слов, которая соответствует каждому абзацу, и записать ее в CSV рядом с индексом абзаца. Почему? Потому что, если я могу это сделать, тогда я могу получить индекс первого слова и последнего слова для каждого абзаца и использовать этот индекс для извлечения меток времени из первого и последнего слов этого абзаца.

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

header_added = False
aligndict = {}
with open('align with index.csv', 'r') as f:
    csv_reader = csv.reader(f, delimiter=',')
    for row in csv_reader:
        index = row[0]
        start = row[3]
        end = row[4]
        word = row[1]
        #if index not in aligndict.keys():
        aligndict.update({index:[word, start, end]})

with open('transcript.txt', 'r') as f:
    lines = f.readlines()
paragraphindextimestamps = {}
words_start_end_index = {}
lastwordinalignment = 0
lastparagraphindex = 0.01 #arbitrary value
indextogetridof = set([])

lines_dict = {}
for index_for_line, line in enumerate(lines):
    lines_dict.update({index_for_line:line})

for index_for_paragraph, line in lines_dict.items():
    last2words = line.split()[-2:]
    listofwords = []
    if line == '\n':
        continue
    if line == '\n\n':
        continue
    if line == '\n\n\n':
        continue
    for index, wordstartend in aligndict.items():
        tobreakornot = False


        word_in_alignment = wordstartend[0]


        if word_in_alignment and lastwordinalignment in last2words:
            tobreakornot = True





        #at this point it seems to lose track of the index of paragraph right after the index in indextogetridof and continue

        if index in indextogetridof:
            continue

        indextogetridof.add(index)
        start = wordstartend[1]
        end = wordstartend[2]

        if index_for_paragraph not in words_start_end_index.keys():

            words_start_end_index.update({index_for_paragraph:[word_in_alignment]})

        elif index_for_paragraph in words_start_end_index.keys():

            words_start_end_index[index_for_paragraph].append([word_in_alignment])

        lastwordinalignment = word_in_alignment
        if tobreakornot == True:
            break
        lastparagraphindex = index_for_paragraph
    for index_for_paragraph_inside_dict, words in words_start_end_index.items():
        with open('paragraphindextimestamps.csv', 'a') as csv_writer:
            csv_writer = csv.writer(csv_writer, delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL)
            if not header_added:
                csv_writer.writerow(['Paragraph Index', 'Words in Alignment'])
                header_added = True
            csv_writer.writerow([index_for_paragraph_inside_dict, words])

for index_for_paragraph, words in words_start_end_index.items():

    with open('paragraphindextimestamps.csv', 'a') as csv_writer:
        csv_writer = csv.writer(csv_writer, delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL)
        if not header_added:
            csv_writer.writerow(['Paragraph Index', 'Words in Alignment'])
            header_added = True
        csv_writer.writerow([index_for_paragraph, words])

Так что же происходит, когда вы запускаете этот код? Ваш компьютер взрывается. Больше похоже на то, как ты взрываешься изнутри. Код дает надежду на вывод:

Индекс абзаца, выравнивание слов

2, ['words', ['The'], ['question' ], ['is'], ['this'], ['Why'] и др. c. (до конца первого абзаца / строки, отлично!)

3, ['So'], ['I'], ['сказали'], ['to'], ['себя' ] - подождите минуту, это продолжается до конца всего текста, каждое отдельное слово до конца заканчивается в этом небольшом ряду, и тогда больше не будет идеальных абзацев, как первый, сценарий просто заканчивается.

Буду рад любой помощи.

...