LINUX.ORG.RU

Как в python определить как разделить строку

 


0

2

Распределяю перевод субтитров в файл субтитров.

Имеется файл субтитров (пусть без временных меток и с одним предложением)

And to make sure you know how to get the
 most out of this training.
B файл перевода (для теста с переводом одного предложения)
And to make sure you know how to get the most out of this training.
И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.

Написал на Python небольшой скрипт для определения длин строк и их отношений.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

i = 0

for line in open("txt"):
    Line = line.strip()
    print(len(Line), "- длина строки во втором цикле:", Line)
    if i == 0:
        FirstLine = Line
        LenFirstLine = len(Line)
    elif i == 1:
        SecondLine = Line
        LenSecondLine = len(Line)
    else:
        print("i больше 1")
    i = i + 1

Divide_LenFisrtLine_by_LenSecondLine = round(LenFirstLine / LenSecondLine, 2)
print("- Отношение строки в", LenFirstLine, "к",
      LenSecondLine, ":", Divide_LenFisrtLine_by_LenSecondLine)
print(Divide_LenFisrtLine_by_LenSecondLine)


for line in open("srt"):
    srt = line.strip()
    print(len(srt), "- длина строки в первом цикле:", srt)
    if srt in FirstLine:
        print(srt)
        print(len(srt), "- длина строки в проверке:", srt)
        Divide_srt_by_LenFirstLine = round(len(srt) / LenFirstLine, 2)
        print(Divide_srt_by_LenFirstLine, "=",
              "длина:", srt, "/", "длина:", FirstLine)
        ChooseBlockFromSecondLine = round(
            Divide_srt_by_LenFirstLine * LenSecondLine)
        print(ChooseBlockFromSecondLine, "= ( длина:", srt,
              "/ длина:", FirstLine, ") * длина:", SecondLine)

Вывод скрипта:

67 - длина строки во втором цикле: And to make sure you know how to get the most out of this training.
85 - длина строки во втором цикле: И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.
- Отношение строки в 67 к 85 : 0.79
0.79
40 - длина строки в первом цикле: And to make sure you know how to get the
And to make sure you know how to get the
40 - длина строки в проверке: And to make sure you know how to get the
0.6 = длина: And to make sure you know how to get the / длина: And to make sure you know how to get the most out of this training.
51 = ( длина: And to make sure you know how to get the / длина: And to make sure you know how to get the most out of this training. ) * длина: И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.
26 - длина строки в первом цикле: most out of this training.
most out of this training.
26 - длина строки в проверке: most out of this training.
0.39 = длина: most out of this training. / длина: And to make sure you know how to get the most out of this training.
33 = ( длина: most out of this training. / длина: And to make sure you know how to get the most out of this training. ) * длина: И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.

Получил индекс - 51 - индекс знака, от которого нужно плясать по переводу строки.

Надо ведь найти самый близкий пробел к этому индексу и сделать срез, верно? Этот срез подставить в первую строки субтитров. Но это потом.

Пример:

Английский текст:

And to make sure you know how to get the
 most out of this training.
Перевод:
И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.
Скрипт показал что нужно переводить где-то на 51 знаке:
И чтобы убедиться, что вы знаете, как получить макСимальную отдачу от этого обучения.
Это знак сделал заглавной буквой «С» в слове «макСимальную». Как сделать из текста, состоящий из одной строки, зная индекс 51 - знака где примерно нужно переводить на новую строку:
И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.
текст состоящий из двух строк:
И чтобы убедиться, что вы знаете, как получить 
максимальную отдачу от этого обучения.
?

Перемещено true_admin из general

Я ничего не понял. Лучше если ты покажешь пример входных данных, выходных данных и суть преобразования.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Английский текст:

And to make sure you know how to get the
 most out of this training.
Перевод:
И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.
Скрипт показал что нужно переводить где-то на 51 знаке:
И чтобы убедиться, что вы знаете, как получить макСимальную отдачу от этого обучения.
Это знак сделал заглавной буквой «С» в слове «макСимальную» Как сделать из текста, состоящий из одной строки:
И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.
текст состоящий из двух строк:
И чтобы убедиться, что вы знаете, как получить 
максимальную отдачу от этого обучения.
?

chemtech ()
Ответ на: комментарий от chemtech
#!/usr/bin/python3

import textwrap

t='И чтобы убедиться, что вы знаете, как получить максимальную отдачу от этого обучения.'

print(textwrap.fill(t, width=50))

anonymous ()

Либо разбиваешь на строго определённое количество символов в строке(например 50 как уже подсказали), либо когда получил позицию с которой будешь разбивать(51 в твоём примере), проверяешь, не попал ли в слово, если попал, то соответственно сдвигаешь позицию назад до пробела или вперед до пробела :)

xterro ★★★★★ ()

Ну вот решение «в лоб». Не запускал.

Разбивает на 2, 3... строки.

def split_subtitles(content, length=51, max_length=70):
    if len(content) < max_length:
        return content
    
    words = content.split(" ")
    parts = []
    part = ""
    i = 0
    for w in words:    
        i += 1
        part = "%s %s" % (part, w)
        if len(part) > length or len(words) == i:
            parts.append(part.strip())
            part = ""
    
    return parts

pi11 ★★★★★ ()
Ответ на: комментарий от anonymous

textwrap.fill Самое подходящее! :)

А как получить строки?

for line in textwrap.fill(t, width=51):
    Line = line.readline()
    print(Line)
не хочет

chemtech ()
Ответ на: комментарий от chemtech
for i in textwrap.fill(t, width=50).split('\n'):
  print('>', i)
anonymous ()
Ответ на: комментарий от pi11

Разделяет вот так:

['И чтобы убедиться, что вы знаете, как получить максимальную', 'отдачу от этого обучения.']

Почему слово максимальную в первой строке, а не во второй... А как получить отдельно первую строку? У первой строки индекс - 0, но куда его ввести?

chemtech ()

Господи, я думал, это предложение Diff останется в рамках шутки или чисто гипотетической идеи, но ты прямо решил его воплотить...

Не пляши от символов, пляши от токенов.

Если подходить серьёзно, посмотри в сторону nltk и имеющихся там средств токенизации и выравнивания.

proud_anon ★★★★★ ()
Ответ на: комментарий от chemtech

Уже подсказали встроенное решение - textwrap, лучше его используй. Мой код делает примерно тоже самое. Максимальную в первой строке - ну так код работает. Либо уменьши length - либо проверки делать на длину слова.

А как получить отдельно первую строку?

result = split_subtitles(text)
print result[0] <- первая строка тут
pi11 ★★★★★ ()

Перевод - не перенос.

zz ★★★★ ()
Ответ на: комментарий от anonymous

import textwrap

В питоне даже на это батарейки есть, не дают программисту алгоритм обдумать =)

Siado ★★★★★ ()
Последнее исправление: Siado (всего исправлений: 1)

почему просто не разбиваешь большую русс.строку на подстроки, где их количество равно количеству англ.строк?

Deleted ()
Ответ на: комментарий от Siado

есть во всех скриптовых языках, ничего особенного :)

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.