|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
04-Апр-19 02:48
(5 лет 7 месяцев назад, ред. 04-Апр-19 02:48)
JoSevlad
Спасибо, но я просто не увидел и до сих пор не вижу самого скрипта, а на онлайн версии какая-то длинная статья
если что, простите за наглость спрашивать если что, каюсь что сам не вникал, думал может есть какой-то скрипт по образцу твоего для аенеаса
Если что - у меня винда 7 32 бит
UPD
протестировал Онлай разбивку от прогрматикВоркс, в онлайн разбивает на предложения.
Но выдает в ХМL, я могу переварить XML, ну лучше бы "оффлайн", и не XML
Попробую как нибудь, но плиз, если есть скрипт пошлите его?
Не XML, возможно с регулируемой длинной сегмента, на основе запятых или сложнсочиненных/составных предложений?
|
|
JoSevlad
Стаж: 13 лет 9 месяцев Сообщений: 1421
|
JoSevlad ·
04-Апр-19 13:43
(спустя 10 часов, ред. 04-Апр-19 13:43)
rexus1
Вот в этом сообщении весь процесс установки Pragmatic Segmenter для офф.лайн и скрипт. Скрипт для английского, но можно его открыть в блокноте и т.п. и там несложно разобраться, как язык поменять.
В онлайн-версии нужно просто вниз промотать страницу, там будет вкладка для выбора языка и поле для вставки текста.
По запятым не разбивает, потому либо очень длинные предложения потом вручную пробежаться, либо лезть глубоко в тему и самому скрипты писать, я выбрал первый путь, потому с более чем-то сложным не помогу, можно к Nickliverpool обратится, он в этом гораздо больше в теме.
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
05-Апр-19 10:49
(спустя 21 час, ред. 05-Апр-19 16:06)
JoSevlad
Спасибо, друг!!
Nickliverpool, может есть у тебя "завернутый" скрипт, который и по запятым может? JoSevlad
А я тут пока увидел твое сообщение, опять психанул и написал свой скрипт код в С#, думал за полчаса наваяю что нибудь простенькое, но получилось три интенсивных часа, и потом "отходить" еще два часа от усилия, что плохо.
Ну тем не менее, результаты у меня получились приличные, сейчас дам образец работы и описание алгоритма.
Сам код C#, с комментариями:
(сейчас отсюда не берите, исправленная версия на следующей странице)
скрытый текст
Код:
..
using io = System.IO;
..
static void _break_long_lines(string sz_file_descr, string[] ss_cont_descr)
{
string sz_line, sz_part_sep;
string[] ss_line, ss_line_2;
// maximal allowed line length in characters:
const int LINE_MAX_LEN = 125;
// minimal allowed phrase part length in words count:
const int LINE_MIN_WORD_CNT = 4;
for (int ii_line = 0; ii_line < ss_cont_descr.Length; ii_line++)
{
sz_line = ss_cont_descr[ii_line];
if (sz_line.Length < LINE_MAX_LEN)
{ // line is short enough:
io.File.AppendAllText(sz_file_descr, (io.File.Exists(sz_file_descr) ? Environment.NewLine : "") + sz_line.Trim());
}
else
{
ss_line = sz_line.Split();
bool broken = false; // just flag to mark success
bool allow_lower = false; // next word should start with uppercase or have not
int line_part_len = 0, move_dir = 1, line_middle = ss_line.Length / 2, move_idx;
sz_part_sep = "."; // initial line breaker
again_sep:
// we always try to break even every given line, so we always try to go from the middle point
for (int ii_line_part = 0; ii_line_part < line_middle; ii_line_part++)
{
move_dir = 1; // start with forward direction
again_dir: // to change direction for the same separator:
move_idx = line_middle + ii_line_part * move_dir;
line_part_len += ss_line[move_idx].Length;
if (ss_line[move_idx].ToLower() != "u.s." &&
!ss_line[move_idx].ToLower().EndsWith(" mr.") &&
!ss_line[move_idx].ToLower().EndsWith(" mrs.") &&
((ss_line[move_idx].EndsWith(sz_part_sep) ||
ss_line[move_idx].EndsWith(sz_part_sep + "\"")) &&
!ss_line[move_idx].StartsWith("\"")) &&
// probably we should somehow calculate the length of phrase part broken:
// line_part_len > LINE_MIN_LEN &&
// .. but it seems to be Ok enough to count only words,
// and allow only certain minimal requred words count,
// with this below following two lines:
LINE_MIN_WORD_CNT < ss_line.Length - move_idx &&
LINE_MIN_WORD_CNT < move_idx &&
((char.IsUpper(ss_line[move_idx + 1][0]) || allow_lower) || ss_line[move_idx + 1][0] == '"')
)
{
ss_line[move_idx] += Environment.NewLine;
line_part_len = 0;
broken = true;
break;
}
if (broken == false)
// have had no luck (otherwise the loop exits anyway, and actualy conditioning on "broken" is not required)
{
if (move_dir == 1)
{ // lets try our luck with backward direction, with the same shift:
move_dir = -1;
goto again_dir;
}
else
{
// nothing to do, lets proceed to the next shift/positioning from the line middle
}
}
}
ss_line_2 = string.Join(" ", ss_line).Replace(Environment.NewLine + " ", Environment.NewLine).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
if (ss_line_2.Length > 1)
{ // we are recursive, here we shold be broken for exactly two lines,
// if still too long the recursive part will take care for it again:
_break_long_lines(sz_file_descr, ss_line_2);
}
else
{
// lets try break by dots
if (sz_part_sep == ".") { sz_part_sep = "!"; allow_lower = false; goto again_sep; }
// no dots, lets try break by exclamations
if (sz_part_sep == "!") { sz_part_sep = "?"; allow_lower = false; goto again_sep; }
// no exclamations, lets try break by questions
if (sz_part_sep == "?") { sz_part_sep = ","; allow_lower = true; goto again_sep; }
// no questions, lets try break by commas
if (sz_part_sep == ",") {
// no commas also :(, so lets just write the line as it is:
io.File.AppendAllText(sz_file_descr, (io.File.Exists(sz_file_descr) ? Environment.NewLine : "") + sz_line.Trim());
}
}
}
}
}
Те кто шарит в алгоритмах/кодить могут высказаться по поводу моих способностей.
Что делает - разбивает придерживаясь "посередине" каждую слишком длинную строку по сепараторам в следующем проядке:
1.) Точка как конец преложения, буква в следующем слове должна быть в верхнем регистре.
Если нет, то переходим:
2.) Воскл. знак как конец преложения, буква в следующем слове должна быть в верхнем регистре.
Если нет, то переходим:
3.) Вопр. знак как конец преложения, буква в следующем слове должна быть в верхнем регистре.
Если нет, то переходим:
4.) запятая как разделитель фразы, буква в следующем слове не важно каком регистре
Если нет даже запятых, то Бох с ним, пишем целиком строку целиком как она есть
---
Кому непонятно как использовать - обращайтесь, отвечу.
Алгоритм достаточно вменяемый и "расширямый", т.е. можно доделать например разбивку сложно-сочиненных/подчиненых предложений по чему нибудь такому например "those who", "as" (но не буду)
В результате, берем например "однострочный" оригинал:
Цитата:
The kidnappers held up a group of foreign tourists at gunpoint in Queen Elizabeth National Park, grabbed two of them and disappeared into the bush. Uganda police say later the gang, using the phone of one of their victims, demanded a ransom of $500,000. They also say the kidnapped American is a 35-year-old woman.
.. получаем волшебным образом четыре строки-фразы:
Цитата:
The kidnappers held up a group of foreign tourists at gunpoint in Queen Elizabeth National Park,
grabbed two of them and disappeared into the bush.
Uganda police say later the gang, using the phone of one of their victims, demanded a ransom of $500,000.
They also say the kidnapped American is a 35-year-old woman.
.. и оргазмируем, уфф, вечер опять убит на дрочево алгопритмов вместо похода по бабам как у всех нормальных людей
P.S.
Обращy внимание, что, например, третья строка не разбита по запятым, так как и так укладывается в заданную длинну 125 букв, нам совсем не нужно дрочить каждую запятую, а лучше просто укладываться во вменяемую длину строки, поэтому алгоритм сделан достаточно умным чтобы делить на желательно равные и не слишком короткие части
|
|
JoSevlad
Стаж: 13 лет 9 месяцев Сообщений: 1421
|
JoSevlad ·
05-Апр-19 12:54
(спустя 2 часа 4 мин.)
rexus1
В принципе да, возможности разбивать по запятой, на основе длинны предложения явно не хватало.
Еще один момент, который был в том же Прагматике обнаружен. Некорректно обрабатывал кавычки, т.к. точка (вскл.-вопр. знаки) ставятся внутри, то последнюю кавычку отрезало и ставило в начало следующей строки. Особенно заметно, когда есть диалог таким способом написанный.
Пример:
Исходный текст "Кто-то что-то говорит." "Кто-то что-то отвечает." Результат:
"Кто-то что-то говорит.
" "Кто-то что-то отвечает.
" Ну и для непрограммистов, коих здесь большинство, неплохо бы разъяснить по скрипту выше - как им воспользоваться\потестить.
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
05-Апр-19 16:30
(спустя 3 часа, ред. 05-Апр-19 16:30)
JoSevlad
Кстати да, сейчас и у себя сделал более корректную работу с кавычками, и пришлось автокоррекцию исходного текста где перемешаны кавучки и знаки пунктуации, сейчас дам "было - стало" и по коду обьясню. Только вот не знаю, надо ли обьяснять что такой консольное приложение открытое в визуал студии?
Исходная строка:
Цитата:
1.) "How many times did mister Trump ask you to threaten an individual or entity on his behalf?" Cohen told Congresswoman Jackie Speier quite a few. "Fifty times?" "More." "A hundred times?" "More". "Two hundred times?" "More." "Five hundred times?" "Probably."
с заданным ограничением 125 символов, легким движением руки ... превращается
... превращается ... превращается ... в элегантные шорты:
Цитата:
1.) "How many times did mister Trump ask you to threaten an individual or entity on his behalf?"
2.) Cohen told Congresswoman Jackie Speier quite a few.
3.) "Fifty times?" "More." "A hundred times?" "More". "Two hundred times?" "More." "Five hundred times?" "Probably."
C заданным ограничением 50 символов:
Цитата:
1.) "How many times did mister Trump ask you to threaten an individual or entity on his behalf?"
2.) Cohen told Congresswoman Jackie Speier quite a few.
3.) "Fifty times?" "More." "A hundred times?"
4.) "More". "Two hundred times?"
5.) "More." "Five hundred times?" "Probably."
Предполагая что у вас есть Visual Studio, и вы можете сделать там "New C# console project",
вот весь программный код целиком,
с двумя сценариями тестирования/использования:
скрытый текст
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using io = System.IO; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// first scenario, probably better for test purposes
// input string array:
string[] ss_text_test_1 = new string[] {
// string to process:
"\"How many times did mister Trump ask you to threaten an individual or entity on his behalf?\" Cohen told Congresswoman Jackie Speier quite a few. \"Fifty times?\" \"More.\" \"A hundred times?\" \"More\". \"Two hundred times?\" \"More.\" \"Five hundred times?\" \"Probably.\"",
"In another incident, 53 migrants who left Morocco in a dinghy were reported missing after what a survivor said was a collision in the western Mediterranean."
};
_break_long_lines(
// where to save processed strings:
"c:\\aaa\\bbb\\ccc.txt",
// input string array:
ss_text_test_1); // SECOND SCENARIO
string sz_orig_file_path = "c:\\aaa\\bbb\\orig.txt";
string sz_dest_file_path = "c:\\aaa\\bbb\\fixed.txt";
// input string array read from disk file:
string[] ss_text_test_2 = io.File.ReadAllLines(sz_orig_file_path);
_break_long_lines(
// where to save processed strings:
sz_dest_file_path,
// input string array:
ss_text_test_2);
}
static void _break_long_lines(string sz_file_descr, string[] ss_cont_descr)
{
string sz_line, sz_part_sep;
string[] ss_line, ss_line_2;
// maximal allowed line length in characters:
const int LINE_MAX_LEN = 50;
// minimal allowed phrase part length in words count:
const int LINE_MIN_WORD_CNT = 4;
for (int ii_line = 0; ii_line < ss_cont_descr.Length; ii_line++)
{
sz_line = ss_cont_descr[ii_line];
if (sz_line.Length < LINE_MAX_LEN)
{ // line is short enough:
io.File.AppendAllText(sz_file_descr, (io.File.Exists(sz_file_descr) ? Environment.NewLine : "") + sz_line.Trim());
}
else
{
ss_line = sz_line.Split();
bool broken = false; // just flag to mark success
bool allow_lower = false; // next word should start with uppercase or have not
int line_part_len = 0, move_dir = 1, line_middle = ss_line.Length / 2, move_idx;
sz_part_sep = "."; // initial line breaker
again_sep:
// we always try to break even every given line, so we always try to go from the middle point
for (int ii_line_part = 0; ii_line_part < line_middle; ii_line_part++)
{
move_dir = 1; // start with forward direction
again_dir: // to change direction for the same separator:
move_idx = line_middle + ii_line_part * move_dir;
line_part_len += ss_line[move_idx].Length;
if (ss_line[move_idx].ToLower() != "u.s." &&
!ss_line[move_idx].ToLower().EndsWith(" mr.") &&
!ss_line[move_idx].ToLower().EndsWith(" mrs.") &&
((ss_line[move_idx].EndsWith(sz_part_sep) ||
ss_line[move_idx].EndsWith(sz_part_sep + "\"")) &&
!ss_line[move_idx].StartsWith("\"")) &&
// probably we should somehow calculate the length of phrase part broken:
// line_part_len > LINE_MIN_LEN &&
// .. but it seems to be Ok enough to count only words,
// and allow only certain minimal requred words count,
// with this below following two lines:
LINE_MIN_WORD_CNT < ss_line.Length - move_idx &&
LINE_MIN_WORD_CNT < move_idx &&
((char.IsUpper(ss_line[move_idx + 1][0]) || allow_lower) || ss_line[move_idx + 1][0] == '"')
)
{
ss_line[move_idx] += Environment.NewLine;
line_part_len = 0;
broken = true;
break;
}
if (broken == false)
// have had no luck (otherwise the loop exits anyway, and actualy conditioning on "broken" is not required)
{
if (move_dir == 1)
{ // lets try our luck with backward direction, with the same shift:
move_dir = -1;
goto again_dir;
}
else
{
// nothing to do, lets proceed to the next shift/positioning from the line middle
}
}
}
ss_line_2 = string.Join(" ", ss_line).Replace(Environment.NewLine + " ", Environment.NewLine).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
if (ss_line_2.Length > 1)
{ // we are recursive, here we shold be broken for exactly two lines,
// if still too long the recursive part will take care for it again:
_break_long_lines(sz_file_descr, ss_line_2);
}
else
{
// lets try break by dots
if (sz_part_sep == ".") { sz_part_sep = "!"; allow_lower = false; goto again_sep; }
// no dots, lets try break by exclamations
if (sz_part_sep == "!") { sz_part_sep = "?"; allow_lower = false; goto again_sep; }
// no exclamations, lets try break by questions
if (sz_part_sep == "?") { sz_part_sep = ","; allow_lower = true; goto again_sep; }
// no questions, lets try break by commas
if (sz_part_sep == ",")
{
// no commas also :(, so lets just write the line as it is:
io.File.AppendAllText(sz_file_descr, (io.File.Exists(sz_file_descr) ? Environment.NewLine : "") + sz_line.Trim());
}
}
}
}
}
}
}
Кому непонятно что - велкам спросить что именно
Если народ думает что оно того стоит, то попозжее наобьясняю глубже как чего там работает, чтобы сами могли поменять ограничения на длинну строки, как минимум так и максимум.
Ограничения не жесткие, т.е. если не удалось разбить, то оставляем длинной.
Или же можно дoделать разбивку напополам по пробелам, и/или типа кодовым словам "what", "those", "as", etc.. JoSevlad
Из того что ты говоришь, пока получается что я лучше "прагматика", так что попробуй
возможно на этот раз я избрел не очередное колесо а что-то полезное..
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
20-Июн-19 18:56
(спустя 2 месяца 15 дней)
Всем привет еще раз, может кто нибудь знает как в АЕНЕАС сделать так чтобы он был точнее?
Нужно чтобы как бы игнорил например первые строки, которых на самом деле нету в аудио
По умолчанию АЕНЕАС как бы "отдает" им часть не принадлежащего им аудио
А надо чтобы не отдавал звук тем строчкам если не уверен что это ихний звук
|
|
JoSevlad
Стаж: 13 лет 9 месяцев Сообщений: 1421
|
JoSevlad ·
20-Июн-19 21:04
(спустя 2 часа 8 мин.)
rexus1
В условиях использования же указано, что текст должен точно соответствовать аудио, чтобы программа могла правильно отработать. Поэтому только обрабатывать текст перед использованием.
|
|
glamorama79
Стаж: 12 лет 1 месяц Сообщений: 139
|
glamorama79 ·
21-Июн-19 06:00
(спустя 8 часов)
rexus1 писал(а):
77156739JoSevlad
Кстати да, сейчас и у себя сделал более корректную работу с кавычками, и пришлось автокоррекцию исходного текста где перемешаны кавучки и знаки пунктуации, сейчас дам "было - стало" и по коду обьясню. Только вот не знаю, надо ли обьяснять что такой консольное приложение открытое в визуал студии?
Простите, пожалуйста.
Случайно наткнулся на эту тему.
Занимался подобным в Балаболке, есть такая программа для озвучки, которая пишет субтитры, но там делит плохо.
А нельзя обойтись без visual studio?
Может есть способ или bat'ник создать или cmd?
В системе есть Microsoft .NET Framework 4.7.2.
Как я понимаю, это для C#.
А visualstudio нет, и опыта работы с ней нет. И места на диске для нее нет.
Может есть способ сделать скрипт ближе к простому пользователю.
Я умею скрипты для python запускать, но там-то одного python достаточно.
Хотел и сам такой скрипт написать на python, но не хватает знаний. Да и учитывать надо много всяких нюансов.
Так что, если можно, может можно что-то сделать.
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
21-Июн-19 09:36
(спустя 3 часа, ред. 21-Июн-19 09:36)
glamorama79
https://www.dropbox.com/sh/yoa55hqhjdfh2bt/AABVSoJ388JCRtAqNE9ldbLSa?dl=0
да, возможно, я уже сделал подобие утилиты
есть EXE, два примера запуска с параметрами приведены в файле BAT
Исходник:
Цитата:
Dr. Siegel is a longtime student of mindfulness meditation and serves
on the board of directors and faculty of the Institute for Meditation and
Psychotherapy. He teaches internationally about mindfulness and its
application to psychotherapy and other felds, has worked for many years
in community mental health with inner-city children and families, and
maintains a private clinical practice in Lincoln, Massachusetts.
Результат с параметрaми length_limit=50, и "hard_limit" (="насильно") разбивает по середине если не нашелось пунктуации по которой делить:
Цитата:
Dr. Siegel is a longtime student
of mindfulness meditation and serves on
the board of directors and faculty
of the Institute
for Meditation and Psychotherapy.
He teaches internationally about mindfulness and
its application to psychotherapy and other felds,
has worked for many years in community
mental health with
inner-city children and families,
and maintains a private
clinical practice in Lincoln, Massachusetts.
Результат с параметрaми length_limit=70, нет жестокого лимита:
Цитата:
Dr. Siegel is a longtime student of mindfulness meditation and serves on the board of directors and faculty of the Institute for Meditation and Psychotherapy.
He teaches internationally about mindfulness and its application to psychotherapy and other felds,
has worked for many years in community mental health with inner-city children and families,
and maintains a private clinical practice in Lincoln, Massachusetts.
В обоих пример использован параметер "pre_flatten", который перед обработкой делает создает из текста одну длинную строку, и потом уже начинает ее разбивать
Если этот параметер убрать, то сохраняется существующая разбивка на строки, но к ней добавляется дополнительная, там где строка слишком длинная
Сейчас "жесткая" разбивка делается по словам, т.е. пробелам, поэтому получается кривовато когда, например, первые три слова короткие, а потом идут длинные.
Возможно стоить допилить, чтобы жесткая разбивка учитывала длинну слов, тогда получится ровнее
JoSevlad писал(а):
77558500rexus1
В условиях использования же указано, что текст должен точно соответствовать аудио, чтобы программа могла правильно отработать. Поэтому только обрабатывать текст перед использованием.
Это да, но если рыться в мануале то там вроде можно сделать более точный тайминг. Вроде. Хотя может я их неправильно понял,
Там много таких параметров которые повышают точность (кажется), но которые работают в связке с другими параметрами и друг с другом, т.е. требуются допскональные знания АЕНЕАСа, а это целый докторат
Парни крутые что сделали и бесплатно выложили, и даже работает, и образцы использования и мануалы есть
Но некоторые вещи с набегу хрен разберешь как это у них там
PS
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
22-Июн-19 11:03
(спустя 1 день 1 час)
glamorama79
Пожалуйста
если вдруг есть пожелания чего исправить - то сообщи.
Не обещаю что исправлю быстро, и что исправлю вообще, но интересно, и очень может быть что исправлю..
|
|
glamorama79
Стаж: 12 лет 1 месяц Сообщений: 139
|
glamorama79 ·
23-Июн-19 10:22
(спустя 23 часа)
Баг один выискался.
Я поискал, чтобы мне сделать под RKLIM.
Я просто озвучиваю синтезаторами.
Короче, троеточие обрабатывает неправильно.
... делит как новая строка потом точка потом пробел.
Не смертельно, я вроде поменял в редакторе, но если что, можно это поправить.
|
|
mon_day
Стаж: 15 лет 5 месяцев Сообщений: 383
|
mon_day ·
24-Июн-19 14:02
(спустя 1 день 3 часа)
Nickliverpool для разбиения давал еще ссылку на segtok.
Segtok разбивал лучше, чем Pragmatic Segmenter и не требуется ruby, только python. После инсталляции пакета создается exe-файл, который можно использовать в батнике. rexus1
Есть параметр, чтобы разбивала на предложения, т.е. чтобы не было разбития по запятой?
К теме по WorkAudioBook. Она лучше подходит, когда нет субтитров или есть, но точные.
После aeneas, если делать правки, например, для последующего экспорта по субтитрам в anki c помощью subs2srs или чтобы выложить результат в паблик, в WA нужно делать кучу лишних телодвижений, т.к. она не сохраняет изменение границ субтитра.
Остановился на SubtitleEdit, в ней нормально и слушать и быстро подправить в случае необходимости, в aegisub к сожалению не предусмотрена работа со вторыми субтитрами с переводом.
|
|
glamorama79
Стаж: 12 лет 1 месяц Сообщений: 139
|
glamorama79 ·
25-Июн-19 06:27
(спустя 16 часов)
Я почитал про stgtok.
Теперь он стал syntok, но до меня никак не дошло, как разбить на фразы.
Получилось только разбить на слова.
Нет ли готового скрипта, чтобы тфайл test.txt в кодировке utf-8 разделить на фразы.
Или может, кто-то может ответить, как это делается.
Есть там функция process, есть функция analise.
Может, сначала надо разобрать до token'а, а потом собрать до sentence'а.
Просто там непонятная инструкция, а других примеров поиск не выдает.
А через командную строку у меня вываливаются ошибки про кодировку.
Один раз вроде ошибок не было, но там текст был какой-то абракадабрашный.
Да через командную консоль результат получать тоже не дело.
|
|
mon_day
Стаж: 15 лет 5 месяцев Сообщений: 383
|
mon_day ·
25-Июн-19 12:40
(спустя 6 часов)
glamorama79 писал(а):
77578233Я почитал про stgtok.
Теперь он стал syntok, но до меня никак не дошло, как разбить на фразы.
Получилось только разбить на слова.
Нет ли готового скрипта, чтобы тфайл test.txt в кодировке utf-8 разделить на фразы.
Или может, кто-то может ответить, как это делается.
Segtok создавал при инсталляции segmenter.exe, но это не столь важно, можно и без него.
У меня пакет aeneas для версии python 2.7, segtok в ней тоже работает. Syntok как написано на сайте нужен python не ниже 3.5. В 2.7 он у меня инсталлируется, но при использовании вываливаются ошибки.
В 3.7 работает, делал так:
• скачал Portable Python 3.7.3 отсюда.
• Распаковал exe-шник.
• В папку App\Python скопировал syntok-1.2.1.tar.gz
• установил syntok: python -m pip install syntok-1.2.1.tar.gz
Скопировал в туже папку файл test_en.txt с текстом.
Для разбития на фразы: python -m syntok.segmenter test_en.txt > test_en.txt_segm.txt
Для удобства можно создать bat-файл, например segm.bat со строкой:
python -m syntok.segmenter %1 > %1_segm.txt
Тогда запуск будет такой: segm test_en.txt
|
|
glamorama79
Стаж: 12 лет 1 месяц Сообщений: 139
|
glamorama79 ·
25-Июн-19 20:43
(спустя 8 часов)
mon_day писал(а):
77579281
glamorama79 писал(а):
77578233Для разбития на фразы: python -m syntok.segmenter test_en.txt > test_en.txt_segm.txt
Спасибо. Все сначала делал, как Вы, только файл был в utf-8.
Как маньяк уперся в то, чтобы он был в utf-8, а оно ни кчему.
он же работает только в основном с немецким, английским, испанским, а их символам не нужен unicode.
Сделал файлу кодировку ANSI и все поделилось как надо.
Спасибо!
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
26-Июн-19 08:10
(спустя 11 часов, ред. 26-Июн-19 08:10)
glamorama79 писал(а):
77569493Баг один выискался.
Я поискал, чтобы мне сделать под RKLIM.
Я просто озвучиваю синтезаторами.
Короче, троеточие обрабатывает неправильно.
... делит как новая строка потом точка потом пробел.
Не смертельно, я вроде поменял в редакторе, но если что, можно это поправить.
В свете того что выискался сегмнетер на пайтоне, (как я понял?) есть ли все еще есть смысл чинить мою прогу?
mon_day писал(а):
rexus1
Есть параметр, чтобы разбивала на предложения, т.е. чтобы не было разбития по запятой?
В принципе можно, но тот же вопрос, на питуне этого не делается?
|
|
mon_day
Стаж: 15 лет 5 месяцев Сообщений: 383
|
mon_day ·
26-Июн-19 09:56
(спустя 1 час 46 мин., ред. 26-Июн-19 09:56)
glamorama79 писал(а):
77581387Сделал файлу кодировку ANSI и все поделилось как надо.
Очень странно. Segtok у меня на некоторые ansi файлы вываливал ошибки, syntok их нормально обрабатывает. Но в кодировке utf-8 с BOM и без BOM в обоих пакетах никаких проблем.
glamorama79 писал(а):
77581387он же работает только в основном с немецким, английским, испанским, а их символам не нужен unicode.
Да ну? Сохраните в ansi:
Und wie heißen Sie?
¿Cómo está?
rexus1 писал(а):
77583046на питуне этого не делается?
Делается. Но при обсуждении aeneas в другой теме были высказывания, что слишком сложная установка. Как вариант, можно пользоваться онлайн версией aeneas.
Поэтому всегда за альтернативный инструмент. Другое дело, что нюансов очень много. Как писали на одном форуме для русского языка:
скрытый текст
Придумывать велосипеды для разбивки текста на предложения можно долго.
По сути все упирается в одну всеобъемлющую регулярку, но ни одна из тех что мне попадалась (например, такая
re.compile(r'(\d+\.\s*)*[А-ЯA-Z\@]((т.д.|т.п.|пр.)\s+[^А-Я]|(т.е.|т.о.)|[^?!.\(]|\([^\)]*\))*[.?!]((?<=\sт\.)д\.|п\.)?')
или такая -
re.compile(r'([А-ЯA-Z]((т.п.|т.д.|пр.)|[^?!.\(]|\([^\)]*\))*[.?!])'))
не справлялась с со всеми возможными вариантами грамматики русского предложения.
Поэтому покажу как это делается специализированными инструментами, чей результат будет неким эталоном - и если ваши регулярки к нему приблизятся, то значит вы на пути к истине.
Если будете дальше развивать утилиту, еще не помешала бы возможность объединения текста, используя параметр flatten_before, но без дальнейшего разбиения.
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
26-Июн-19 13:43
(спустя 3 часа, ред. 26-Июн-19 13:43)
Цитата:
Если будете дальше развивать утилиту, еще не помешала бы возможность объединения текста, используя параметр flatten_before, но без дальнейшего разбиения.
Можно, но как-то слишком просто получается, поэтому я подозреваю что чего-то недoпонял.
То что вы говорите, это же просто "заменить конец строки на пробел. ВСЕ."
Так?
Если что, такие простейшие замены делают кроссплатформенные SED и TR
Гы, можно еще написать еще в параметер РАЗМЕР_ЛИМИТ 2,147,483,647 (=int.max=2 ГигаБайта) и тот же PRE_FLATTEN, и есть уже сейчас
Цитата:
ни одна .. не справлялась с со всеми возможными вариантами грамматики русского предложения.
Да, а если еще и сюда добавить нарушения грамматики и опечатки, уникодные символы, то дело совсем плохо.
A в английском американцы любят запихивать знаки препинания уже НЕ принадлежащие к цитате в саму цитату ВНУТРь за кавычки, это вообще пиздец.
Например: How dare you to say me "fuck you?!"
С этим никакое regular expression не справится
Поэтому задача простая, но на одних регулярных выражениях не выехать, в код надо добавить некоторое количество ""if.. else.."" и приоретизации конкурирующих претедентов на границу предложения/вуражения.
В то же время, по знакам пунктуации вполне реально сделать разбивку не отличимую от ручной какой-нибудь, ну если проставлены знаки пунктуации.
|
|
glamorama79
Стаж: 12 лет 1 месяц Сообщений: 139
|
glamorama79 ·
26-Июн-19 14:12
(спустя 29 мин.)
стоит. Одно другому не мешает.
Сегментатор делит по предложениям, а мой мозг не справляется с предложениями больше 50-80 символов.
Поэтому я комбинирую пока в теории.
Я разбил книжку верхом на пуле и стал проходить, но там фраза одного героя не заканчивается в одной строке. Начинается другая, но ее тоже тоже только кусочек.
Было бы еще хорошо, чтобы текст делился по словам and or when if that, если нет запятой. Тогда смысл не утрачивается, а эта группа самая частая.
Еще там была Mrs. Mccurdy. и уж эту бедную леди делили как назло каждый раз, тоже не смертельно, конечно, но тоже не самое лучшее деление.
И еще заканчивается одно предложение и начинается другое, - это можно как-то поменять. Ну закончилось точкой, не надо лепить места хватит всем. Но самое плохое, еще раз хочу повторить фраза одного героя кончается, начинается другая. Правда там кавычки были какие-то нестандартные, может из-за этого.
mon_day писал: Очень странно. Segtok у меня на некоторые ansi файлы вываливал ошибки, syntok их нормально обрабатывает. Но в кодировке utf-8 с BOM и без BOM в обоих пакетах никаких проблем.
А у вас windows 7 или десять?
Может, Вы что-то в консоли windows подшаманили.
У меня не идет utf-8 и все тут.
|
|
mon_day
Стаж: 15 лет 5 месяцев Сообщений: 383
|
mon_day ·
28-Июн-19 12:19
(спустя 1 день 22 часа, ред. 28-Июн-19 12:19)
rexus1 писал(а):
77584245подозреваю что чего-то недoпонял
Подвоха нет. Да, это можно сделать в любом редакторе, поддерживающим регулярные выражения. Но зачем кому-то искать редактор, разбираться с регулярками, если это можно сделать в этой же утилите, задав дополнительный параметр. Тем более, что объединение в утилите уже реализовано.
glamorama79 писал(а):
77584448Может, Вы что-то в консоли windows подшаманили.
Вроде ничего не шаманил. Использую консоль в Far. Попробовал в cmd - тоже с utf проблем нет.
glamorama79 писал(а):
77584448Было бы еще хорошо, чтобы текст делился по словам and or when if that, если нет запятой.
Кмк лучше сразу привыкать к полным предложениям. Если уж слишком длинное, делить потом во время прохождения по своему усмотрению. К тому же в неполных сложнее выделять или изменять соответствующий аудио фрагмент, потому что в не учебных аудио материалах зачастую не будет пауз.
|
|
rexus1
Стаж: 15 лет 2 месяца Сообщений: 122
|
rexus1 ·
24-Авг-19 10:06
(спустя 1 месяц 25 дней, ред. 27-Авг-19 14:33)
glamorama79
Мой сегментатор кстати корректно игнорирует всяких mr. и mrs.
Сейчас закину новую версию, были исправлены баги, и попробую реализовать высказанные тут пожелания..
PS
У кого проблемы с кодировками (utf/ansi/unicode), посмотрите у себя что в System Locale стоит
Уффф
https://www.dropbox.com/sh/yoa55hqhjdfh2bt/AABVSoJ388JCRtAqNE9ldbLSa?dl=0
Исполнил почти все пожелания, добавлены новые параметры.
В БАТ-файле есть несколько примеров на новые параметры, должно быть понятно, если непонятно - отпишитесь.
Кстати, параметры могут идти в любом порядке, но путь к файлу должен идти з за словом "phrases"
* Исправлено обращение с троеточием (три точки)
* добавлено запрещение сепараторов, например, как mon_day предлагал, можно запретить символ "," в качестве сепаратора,
и можно запретить несколько сепараторов за раз, далее примеры.
Запретили только запятые:
Запретили только запятые и точка с запятой:
Запретили много чего:
* Добавлена возможность задать вдобавок к существующим еше несколько своих произвольных сепараторов, произвольной длины, НО! при условии чтобы без пробелов, например:
Код:
phrased_sep=1111 phrased_sep=22222 phrased_sep=and#before
Т.е. тут будет разделение по слову "and", ну и 1111, 2222, если такие вдруг попадутся
блее того, если добавляем #before, то перенос стройки произойдет перед разделителем, а не после, что по умолчанию.
Это частично отвечает на вопрос:
Цитата:
Было бы еще хорошо, чтобы текст делился по словам and or when if that, если нет запятой.
Частично - лишь потому что с пробелами не получится, как например "as if" не сработает
* Корректное обращение с Dr./Mr./Mrs.
|
|
Yggdor
Стаж: 8 лет 4 месяца Сообщений: 108
|
Yggdor ·
14-Окт-19 08:59
(спустя 1 месяц 20 дней)
mon_day писал(а):
77579281
glamorama79 писал(а):
77578233Я почитал про stgtok.
Теперь он стал syntok, но до меня никак не дошло, как разбить на фразы.
Получилось только разбить на слова.
Нет ли готового скрипта, чтобы тфайл test.txt в кодировке utf-8 разделить на фразы.
Или может, кто-то может ответить, как это делается.
Segtok создавал при инсталляции segmenter.exe, но это не столь важно, можно и без него.
У меня пакет aeneas для версии python 2.7, segtok в ней тоже работает. Syntok как написано на сайте нужен python не ниже 3.5. В 2.7 он у меня инсталлируется, но при использовании вываливаются ошибки.
В 3.7 работает, делал так:
• скачал Portable Python 3.7.3 отсюда.
• Распаковал exe-шник.
• В папку App\Python скопировал syntok-1.2.1.tar.gz
• установил syntok: python -m pip install syntok-1.2.1.tar.gz
Скопировал в туже папку файл test_en.txt с текстом.
Для разбития на фразы: python -m syntok.segmenter test_en.txt > test_en.txt_segm.txt
Для удобства можно создать bat-файл, например segm.bat со строкой:
python -m syntok.segmenter %1 > %1_segm.txt
Тогда запуск будет такой: segm test_en.txt
Этого файла нет в скачанном архиве syntok-1.2.1.tar.gz
|
|
Vitus16
Стаж: 14 лет 2 месяца Сообщений: 9
|
Vitus16 ·
26-Дек-19 11:36
(спустя 2 месяца 12 дней)
Спасибо Ваша программа очень-очень полезна для изучающих языки, простая, функциональная, интуитивно понятная.
|
|
dmitryworks
Стаж: 17 лет Сообщений: 13
|
dmitryworks ·
24-Мар-20 11:55
(спустя 2 месяца 29 дней)
Отличная программа для аудиокниг для Windows! Благодарю создателя.
|
|
super.amigo
Стаж: 11 лет 9 месяцев Сообщений: 190
|
super.amigo ·
14-Апр-20 00:16
(спустя 20 дней)
Vinny-2008
Здравствуйте, а можете объяснить как Вам удалось вставить пдф вместо спектрограммы? Заранее спасибо)
|
|
Vinny-2008
Стаж: 16 лет 6 месяцев Сообщений: 251
|
Vinny-2008 ·
02-Май-20 17:53
(спустя 18 дней)
super.amigo писал(а):
79245294Vinny-2008
Здравствуйте, а можете объяснить как Вам удалось вставить пдф вместо спектрограммы? Заранее спасибо)
Это просто окно PDF вьювера (закрепленное "поверх всех окон") поверх программы.
|
|
Yggdor
Стаж: 8 лет 4 месяца Сообщений: 108
|
Yggdor ·
28-Май-20 14:50
(спустя 25 дней)
Ищу сподвижника, у которого есть желание наложить русский перевод на английский. Я планирую прочитать-прослушать Властелин колец на инглише, и разбить по абзацам текст-звук.
|
|
Theorist
Стаж: 17 лет 9 месяцев Сообщений: 29
|
Theorist ·
17-Авг-20 23:44
(спустя 2 месяца 20 дней)
Спасибо за программу, очень полезная, но на одном из компьютеров при запуске появляется ошибка. Подскажите, что делать? https://i112.fastpic.ru/big/2020/0817/36/4217bbd9130590c2f73d9b6a6a5dc536.png
|
|
Takahashi
Стаж: 16 лет 2 месяца Сообщений: 50
|
Takahashi ·
20-Май-21 09:16
(спустя 9 месяцев)
Не нашел как скорость воспроизведения регулировать.
Или там вообще нет такого параметра?
|
|
JoSevlad
Стаж: 13 лет 9 месяцев Сообщений: 1421
|
JoSevlad ·
20-Май-21 16:57
(спустя 7 часов)
Takahashi
Это есть в андроид-версии.
|
|
|