09.08.2022, 06:36
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
Alikberov,
Я думаю что смогу это сделать, только скажите как оценить время работы функции, есть какой то сервис или это в браузере можно извлечь информацию.
В сети нету подобного рабочего скрипта для русского языка. Может кому то еще будет он полезен.
|
|
09.08.2022, 07:26
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Alikberov,
Сергей Ракипов,
добавил фикс от Alikberov,
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
.separated {
width: 80%;
margin: 30px auto;
}
.separated.min {
width: 30%;
}
.test {
font-size: 2rem;
}
</style>
<script>
var WholeWord = /[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+/ig;
var Prefixes = /^(над?|объ?|отъ?|пере|подъ?|по|предъ?|при|про|разъ?|рас|со)/i;
function Separatist(part, pos, text) {
var slab, next, seps = [];
var pref;
pos += part.match(/^\s*/)[0].length;
part = part.replace(/^\s+/, "");
while ((pref = part.match(Prefixes)) && pref[0] != "") {
seps.push(pref[0]);
part = part.substr(pref[0].length);
}
if (slab = part.match(/^й[ао][дшк]+[аеёиоуыэюя]?/)) {
seps.push(part.substr(0, slab[0].length));
part = part.substr(slab[0].length);
}
while (part.length) {
if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя](й|[бвгджзклмнпрстфхцчшщ]+[ъь]?$)/i)) {
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else
if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя]?/i)) {
if (next = part.substr(slab[0].length).match(/^([бвгджзклмнпрстфхцчшщ]+)[бвгджзклмнпрстфхцчшщ][ъь]?[аеёиоуыэюя]?/i))
slab[0] += next[1];
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else
if (slab = part.match(/^[аеёиоуыэюя][бвгджзклмнпрстфхцчшщь]*/i)) {
if (slab[0].length > 1 && part.charAt(slab[0].length).match(/[аеёиоуыэюя]/i))
slab[0] = slab[0].substr(0, slab[0].length - 1);
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else {
seps.push(part);
part = "";
}
}
if (seps.length > 1 && seps[0].length == 1)
seps[0] = seps.shift() + seps[0];
if (seps.length > 1 && seps[seps.length - 1].length == 1)
seps[seps.length - 2] = seps[seps.length - 2] + seps.pop();
return seps.join("\u00AD");
}
document.addEventListener("DOMContentLoaded", function() {
let elems = document.querySelectorAll(".separated");
// указать нужные классы
console.time("time for separated");
elems.forEach(el => {
let txt;
walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false);
while (txt = walk.nextNode()) txt.data = txt.data.replace(WholeWord, Separatist);
});
console.timeEnd("time for separated");
})
</script>
</head>
<body>
<div class="separated">тускловатый И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
связь, <span class="test">потому что проводится много мероприятий,</span> бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой.
Мало кто знает, что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком,
ведь новички приходят и те, кто выбирается на служение о многом не знают.</div>
<div class="separated min">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
связь, потому что проводится много мероприятий, бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
и те, кто выбирается на служение о многом не знают.</div>
</body>
</html>
Последний раз редактировалось рони, 09.08.2022 в 07:50.
|
|
09.08.2022, 07:34
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
рони,
А я уже видел его, уже сам добавил, там не сложно было.
|
|
09.08.2022, 07:53
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Сообщение от Сергей Ракипов
|
как оценить время работы функции,
|
добавлено, #34, смотреть консоль, строки 69 и 76, удалить после тестирования.
|
|
09.08.2022, 09:14
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
Вот оценка
1 часть Война и мир
time for separated: 227.430908203125 ms
|
|
09.08.2022, 19:00
|
|
Кандидат Javascript-наук
|
|
Регистрация: 16.08.2018
Сообщений: 109
|
|
Нeмного оффтопа…
Не ожидал, что мой вариант скрипта здесь в теме приглянётся автору, так как просто хотел накаракулить свой вариант.
Лингвисты бы меня расстреляли за выдаваемый скриптом результат (особенно на примере текста «Война и Мир»).
Если мне не удастся в ближайшее время его улучшить, я бы не хотел, чтобы он разошёлся по сети как «вариант Аликберова».
P.S.: Рекомендую автору просто найти и скачать БД всех слов с предопределёнными переносами…
Или обратиться к нейросети для отсеивания неверных (позорных) вариантов переноса.
|
|
09.08.2022, 19:07
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Alikberov,
#7 там в плагинах всё есть для переносов ru-текста, но как этим воспользоваться, кто бы подсказал? )))
|
|
10.08.2022, 05:44
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
Alikberov,
Для меня нейросети это слишком сложно я JS знаю на примитивном уровне а тут что то более сложное.
Мне правда кажется что это скрипт может быть полезен людям
|
|
10.08.2022, 12:04
|
|
Кандидат Javascript-наук
|
|
Регистрация: 16.08.2018
Сообщений: 109
|
|
Eсли это поможет, попытался написать тестер с интерактивной правкой правил.
<html>
<head>
<script>
var WholeWord = /[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+/ig;
var Prefixes = /^(над?|объ?|отъ?|пере|подъ?|по|предъ?|при|про|раз[оъ]?|рас|со)/i;
var Regulars = [];
function Separatist(part, pos, text) {
var slab, next, seps = [];
var pref;
pos += part.match(/^\s*/)[0].length;
part = part.replace(/^\s+/, "");
while((pref = part.match(Prefixes)) && pref[0] != "") {
seps.push(pref[0]);
part = part.substr(pref[0].length);
}
if(slab = part.match(/^й[ао][дшк]+[аеёиоуыэюя]?/)) {
seps.push(part.substr(0, slab[0].length));
part = part.substr(slab[0].length);
}
while(part.length) {
if(slab = part.match(Regulars[0])) { // Правило №1
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else
if(slab = part.match(Regulars[1])) { // Правила №2 и №3
if(next = part.substr(slab[0].length).match(Regulars[2]))
slab[0] += next[1];
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else
if(slab = part.match(Regulars[3])) { // Правило №4
if(slab[0].length > 1 && part.charAt(slab[0].length).match(/[аеёиоуыэюя]/i))
slab[0] = slab[0].substr(0, slab[0].length - 1);
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else {
seps.push(part);
part = "";
}
}
if(seps.length > 1 && seps[0].length == 1)
seps[0] = seps.shift() + seps[0];
if(seps.length > 1 && seps[seps.length - 1].length == 1)
seps[seps.length - 2] = seps[seps.length - 2] + seps.pop();
return seps.join(this.shy ? this.shy : "\u2011");
}
</script>
<script>
function Separatism() {
if(document.querySelectorAll("input")[4].checked)
document.getElementById("separated").textContent = document.getElementById("text").value.replace(WholeWord, Separatist);
else
document.getElementById("separated").textContent = document.getElementById("text").value.replace(WholeWord, Separatist.bind({shy: "\u00AD"}));
}
function Separatory() {
var hInputs = document.querySelectorAll("input");
for(var i = 0; i < hInputs.length; ++ i) {
try {
Regulars[i] = new RegExp(hInputs[i].value, "i");
hInputs[i].style.backgroundColor = "#DFD";
} catch(err) {
hInputs[i].style.backgroundColor = "#FDD";
}
}
}
</script>
</head>
<body onload='Separatory(); Separatism()'>
Правило №1<input type=text style=width:99% maxlength=128 onchange='Separatory(); Separatism()' value='^[бвгджзклмнпрстфхцчшщ]+[ъь]?[аеёиоуыьэюя](й|[бвгджзклмнпрстфхцчшщ]+[ъь]?$)'><br>
Правило №2<input type=text style=width:99% maxlength=128 onchange='Separatory(); Separatism()' value='^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя]?'><br>
Правило №3<input type=text style=width:99% maxlength=128 onchange='Separatory(); Separatism()' value='^([бвгджзклмнпрстфхцчшщь]+)[бвгджзклмнпрстфхцчшщ][ъь]?[аеёиоуыэюя]?'><br>
Правило №4<input type=text style=width:99% maxlength=128 onchange='Separatory(); Separatism()' value='^[аеёиоуыэюя][бвгджзклмнпрстфхцчшщь]*'><br>
<input type=checkbox onchange='this.nextSibling.textContent = this.checked ? "Активный" : "Мягкий"; Separatism()'><span></span>
перенос
<textarea id=text rows=5 style=width:99% oninput='Separatism()'>
Пьер жил у князя Василия Курагина и участвовал в разгульной жизни его сына Анатоля, того самого, которого для исправления собирались женить на сестре князя Андрея.
– Знаете что! – сказал Пьер, как будто ему пришла неожиданно счастливая мысль, – серьезно, я давно это думал. С этою жизнью я ничего не могу ни решить, ни обдумать. Голова болит, денег нет. Нынче он меня звал, я не поеду.
– Дай мне честное слово, что ты не будешь ездить?
– Честное слово!
Уже был второй час ночи, когда Пьер вышел от своего друга. Ночь была июньская петербургская, бессумрачная ночь. Пьер сел в извозчичью коляску с намерением ехать домой. Но чем ближе он подъезжал, тем более он чувствовал невозможность заснуть в эту ночь, походившую более на вечер или на утро. Далеко было видно по пустым улицам. Дорогой Пьер вспомнил, что у Анатоля Курагина нынче вечером должно было собраться обычное игорное общество, после которого обыкновенно шла попойка, кончавшаяся одним из любимых увеселений Пьера.
«Хорошо бы было поехать к Курагину», – подумал он. Но тотчас же он вспомнил данное князю Андрею честное слово не бывать у Курагина.
Но тотчас же, как это бывает с людьми, называемыми бесхарактерными, ему так страстно захотелось еще раз испытать эту столь знакомую ему беспутную жизнь, что он решился ехать. И тотчас же ему пришла в голову мысль, что данное слово ничего не значит, потому что еще прежде, чем князю Андрею, он дал также князю Анатолю слово быть у него; наконец, он подумал, что все эти честные слова – такие условные вещи, не имеющие никакого определенного смысла, особенно ежели сообразить, что, может быть, завтра же или он умрет, или случится с ним что-нибудь такое необыкновенное, что не будет уже ни честного, ни бесчестного. Такого рода рассуждения, уничтожая все его решения и предположения, часто приходили Пьеру. Он поехал к Курагину.
Подъехав к крыльцу большого дома у конногвардейских казарм, в котором жил Анатоль, он поднялся на освещенное крыльцо, на лестницу, и вошел в отворенную дверь. В передней никого не было; валялись пустые бутылки, плащи, калоши; пахло вином, слышался дальний говор и крик.
Игра и ужин уже кончились, но гости еще не разъезжались. Пьер скинул плащ и вошел в первую комнату, где стояли остатки ужина и один лакей, думая, что его никто не видит, допивал тайком недопитые стаканы. Из третьей комнаты слышалась возня, хохот, крики знакомых голосов и рев медведя. Человек восемь молодых людей толпились озабоченно около открытого окна. Трое возились с молодым медведем, которого один таскал на цепи, пугая им другого.
– Держу за Стивенса сто! – кричал один.
– Смотри не поддерживать! – кричал другой.
– Я за Долохова! – кричал третий. – Разними, Курагин.
– Ну, бросьте Мишку, тут пари.
– Одним духом, иначе проиграно, – кричал четвертый.
– Яков! Давай бутылку, Яков! – кричал сам хозяин, высокий красавец, стоявший посреди толпы в одной тонкой рубашке, раскрытой на средине груди. – Стойте, господа. Вот он, Петруша, милый друг, – обратился он к Пьеру.
Другой голос невысокого человека с ясными голубыми глазами, особенно поражавший среди этих всех пьяных голосов своим трезвым выражением, закричал от окна:
– Иди сюда – разойми пари! – Это был Долохов, семеновский офицер, известный игрок и бретёр, живший вместе с Анатолем. Пьер улыбался, весело глядя вокруг себя.
– Ничего не понимаю. В чем дело? – спросил он.
– Стойте, он не пьян. Дай бутылку, – сказал Анатоль и, взяв со стола стакан, подошел к Пьеру.
– Прежде всего пей.
Пьер стал пить стакан за стаканом, исподлобья оглядывая пьяных гостей, которые опять столпились у окна, и прислушиваясь к их говору. Анатоль наливал ему вино и рассказывал, что Долохов держит пари с англичанином Стивенсом, моряком, бывшим тут, в том, что он, Долохов, выпьет бутылку рома, сидя на окне третьего этажа с опущенными наружу ногами.
– Ну, пей же всю, – сказал Анатоль, подавая последний стакан Пьеру, – а то не пущу!
– Нет, не хочу, – сказал Пьер, отталкивая Анатоля, и подошел к окну.
Долохов держал за руку англичанина и ясно, отчетливо выговаривал условия пари, обращаясь преимущественно к Анатолю и Пьеру.
Долохов был человек среднего роста, курчавый и с светлыми голубыми глазами. Ему было лет двадцать пять. Он не носил усов, как и все пехотные офицеры, и рот его, самая поразительная черта его лица, был весь виден. Линии этого рта были замечательно тонко изогнуты. В середине верхняя губа энергически опускалась на крепкую нижнюю острым клином, и в углах образовывалось постоянно что-то вроде двух улыбок, по одной с каждой стороны; и все вместе, а особенно в соединении с твердым, наглым, умным взглядом, составляло впечатление такое, что нельзя было не заметить этого лица. Долохов был небогатый человек, без всяких связей. И несмотря на то, что Анатоль проживал десятки тысяч, Долохов жил с ним и успел себя поставить так, что Анатоль и все знавшие их уважали Долохова больше, чем Анатоля. Долохов играл во все игры и почти всегда выигрывал. Сколько бы он ни пил, он никогда не терял ясности головы. И Курагин и Долохов в то время были знаменитостями в мире повес и кутил Петербурга.
Бутылка рома была принесена; раму, не пускавшую сесть на наружный откос окна, выламывали два лакея, видимо, торопившиеся и робевшие от советов и криков окружавших господ.
Анатоль с своим победительным видом подошел к окну. Ему хотелось сломать что-нибудь. Он оттолкнул лакеев и потянул раму, но рама не сдавалась. Он разбил стекло.
– Ну-ка ты, силач, – обратился он к Пьеру. Пьер взялся за перекладины, потянул и с треском где сломал, где выворотил дубовую раму.
– Всю вон, а то подумают, что я держусь, – сказал Долохов.
– Англичанин хвастает… а?.. хорошо?.. – говорил Анатоль.
– Хорошо, – сказал Пьер, глядя на Долохова, который, взяв в руки бутылку рома, подходил к окну, из которого виднелся свет неба и сливавшихся на нем утренней и вечерней зари.
Долохов с бутылкой рома в руке вскочил на окно.
– Слушать! – крикнул он, стоя на подоконнике и обращаясь в комнату. Все замолчали.
– Я держу пари (он говорил по-французски, чтоб его понял англичанин, и говорил не слишком хорошо на этом языке). Держу пари на пятьдесят империалов, хотите на сто? – прибавил он, обращаясь к англичанину.
– Нет, пятьдесят, – сказал англичанин.
– Хорошо, на пятьдесят империалов, – что я выпью бутылку рома всю, не отнимая ото рта, выпью, сидя за окном, вот на этом месте (он нагнулся и показал покатый выступ стены за окном), и не держась ни за что… Так?</textarea>
<hr />
<p id=separated>
</body>
Но, так или иначе, этот алгоритм из разряда «дёшего и сердито» для ознакомительных целей…
Последний раз редактировалось Alikberov, 10.08.2022 в 12:22.
|
|
|
|