terratensor / tg-svodd-bot

Telegram svodd.ru bot
https://t.me/svoddru
BSD 3-Clause "New" or "Revised" License
0 stars 0 forks source link

Ограничение размера цитируемого отрывка #27

Open iprst opened 1 month ago

iprst commented 1 month ago

Поскольку некоторые пользователи не умеют работать с цитированием, предлагаю научить цитирование работать с некоторыми пользователями. В теме уже неоднократно отмечалось, и судя по оставленной под замечаниями обратной связи в форме лайков отмечалось справедливо — бездумное цитирование всей портянки, а то и двух и даже трёх, мешает рабочему восприятию информации.

Посему предлагаю соорудить счётчик, который будет устанавливать размер цитируемого текста, и если цитата укладывается, публиковать её без изменений, а если не укладывается, то цитировать лишь первые 4-5 слов, ставить многоточие, и двигаться далее. Допустимый размер можно определить как «четыре-пять строчек», пусть это будет 200-250 символов или 30-40 слов. Уложился — молорик, нет — давай дасвидания.

Фичу предлагаю для телеграма, но подобный механизм можно использовать и на сайте.

audetv commented 1 month ago

Кажется, что под условие более 40 слов попадают большинство цитат, под условие 250 символов ещё больше. Потестировал на последних сообщениях, почти все были бы сокращены.

Все таки сокращаем цитату до 4-5 слов или оставляем ту часть, которая подходит под условие не более 40 слов?

Возможно надо поиграть с количеством символов, и с дополнительными условиями, с другой стороны, если фича для телеги, то 40 слов вполне достаточно. Возможно надо добавить числа 40 и 250 в настройки, что бы можно было менять параметры без пересборки приложения, чтобы проще можно было менять значения, подобрать необходимые, в случае если 40 / 250 нас не устроят.

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

iprst commented 1 month ago

Я предлагал чисто на глазок, не проверяя, возможны варианты. 5-6 строк 300-400 символов тоже нормально, и другие версии возможны. Тут не строго. Если пока только в телеге, и подразумевается управляемый контроллер значения, то сначала можно вообще одну строчку оставлять. Имеет смысл вынести вопрос в тему для ОС, ребята тоже могут какие-то мысли забросить по существу вопроса?

audetv commented 1 month ago

Я пока сделал такую функцию, в процессе, она считает количество слов в строке и если слов меньше 40, то пропускает, а если больше то начинает сокращать и тогда уже учитывает количество символов в строке. Установил 350 символов.

сначала можно вообще одну строчку оставлять.

тут может быть сразу проблема, например, с такими цитатами:

Углянский Александр
По всей видимости это "немецкий футбольный союз"
https://ru.m.wikipedia.org/wiki/Файл:DFB-Logo_1945.svg
Так точно, это он, отличная находка. Этот логотип служил лиге с 1926 по 1996 год, то есть пережил Веймарскую республику, Третий рейх, раздел ФРГ и ГДР и снос стены. Империи приходят и уходят, а ногомяч и адидас остаётся. Кстати, бесструктурного управления не существует.

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

Имеет смысл вынести вопрос в тему для ОС, ребята тоже могут какие-то мысли забросить по существу вопроса?

Думаю да можно и задать вопрос. Может быть предложат еще лучшие варианты. А если не будет ответа, то попробуем вариант 40 слов

iprst commented 1 month ago

В таком случае останется один никнэйм пользователя.

Это обучающий суперсистему критерий. У критерия есть цель — сделать сообщения в телеге читаемыми. Наилучший способ — чтобы пользователь понял, что нужно приложить усилие и сделать сообщение читаемым. И если от портянки будет оставаться только никнейм и одно-два слова, и замечательно, поскольку дальше всё равно цитату никто читать не должен, он этот текст уже читал позавчера, цитировать нужно непосредственно тот контекст, который затрагивается в ответе. Если нужно сослаться на три портянки, для этого давно существует сайт с поиском и короткой ссылкой.

iprst commented 1 month ago

Установил 350 символов. Думаю да можно и задать вопрос. Может быть предложат еще лучшие варианты. А если не будет ответа, то попробуем вариант 40 слов

Логику считаю верной, размеры думаю нормальные, так что пусть покрутится день-неделю-месяц, поймём. Вопрос, а вернее анонс и краткое описание ситуации в обсуждении сейчас сделаю

iprst commented 1 month ago

Ограничение пока не установлено? Цитаты проходят и более длинные.

audetv commented 1 month ago

Ограничение пока не установлено? Цитаты проходят и более длинные.

Нет, пока не установлено. я еще не делал обновление, только протестировал функцию на тексте. Но теперь уже внес изменения в бота, и пока еще поднимаю тестовую связку локально для теста. Думаю в ближайшее время (в течение часа, мак двух) обновлю.

iprst commented 1 month ago

Уточнял логику, ибо ранее написано «установил ограничение 350», что можно принять за выкатывания релиза. Так то спешки нет, разумеется.

audetv commented 1 month ago

Сделал обновление, логика такая

Ранее цитата всегда разбивалась на строки по разделителю — перенос строки \n и каждая cтрока оборачивалась тегом <i></i>. Делалось это для того, чтобы если цитата, все таки попадает под правило не более 4096 символов с разделением текста на чанки, то разбивалась бы нормально и не ломалась верстка. Эту логику специально пришлось реализовать для такой большой портянки.

Так вот если следовать новой логике, то это условие убрал, а точнее просто из итоговой цитаты теперь забираем только первую строку: предложение, фразу, фрагмент и уже только к этой строке применяется условие 40 слов и 350 символов.

audetv commented 1 month ago

прогнал на тестовом канале, отослал все сообщения текущей темы 350+ сообщений, по ощущениям выглядит нормально, хорошо.

iprst commented 1 month ago

перенос строки \n и каждая cтрока оборачивалась тегом <i></i>. Делалось это для того, чтобы если цитата, все таки попадает под правило не более 4096 символов с разделением текста на чанки, то разбивалась бы нормально и не ломалась верстка.

Да, возможно нам следовало подумать об этом решении раньше. Или мы подумали, но передумали? Я уже точно не могу вспомнить.

PS. Чтобы не открывать пока новый issue — а что мы думали про избыточные переносы строк в тексте в конце сообщения, которые иногда возникают в движке фкт, как-то для телеги это думали обрезать? Кажется об этом была речь где-то, но быстро не нашёл. У меня вот в нижнем сообщении некрасиво напортачено svoddru/19625

audetv commented 1 month ago

Да, возможно нам следовало подумать об этом решении раньше. Или мы подумали, но передумали? Я уже точно не могу вспомнить.

Да, возможно, но тоже не припоминаю. Эту логику с разбиением на чанки, я делал почти в самом начале запуска трансляции, примерно год назад, возможно у нас тогда не было по этом поводу опыта и это выглядело логичным. Скорее так.

а что мы думали про избыточные переносы строк в тексте в конце сообщения, которые иногда возникают в движке фкт, как-то для телеги это думали обрезать? Кажется об этом была речь где-то, но быстро не нашёл. У меня вот в нижнем сообщении некрасиво напортачено svoddru/19625

Я точно несколько раз исправлял такое руками, и точно один раз сам напортчил. В телеге исправлять просто, зашел, кнопочку редактирования нажал и готово, в БД сложнее надо зайти и в консоли написать запрос на обновление записи.

Каждый раз когда исправлял, то появлялось мысль, что возможно надо с этим что-то делать, написать фильтр, который будет обрезать лишние пробелы, переносы строк и прочее. Но это случается действительно не часто, чаще возникают некрасивые пробелы или отсутствие пробелов между абзацами или цитатами. Думаю настало время с этим разобраться, т.к. фактор уже распознан и есть статистика различения таких записей. Подумаю и в с покойном режиме допишу функционал и для телеги и для сайта.

ps поправил запись

iprst commented 1 month ago

появлялось мысль, что возможно надо с этим что-то делать, написать фильтр, который будет обрезать лишние пробелы, переносы строк и прочее. Но это случается действительно не часто, чаще возникают некрасивые пробелы или отсутствие пробелов между абзацами или цитатами.

Опытным путём установлено, что ошибка с пробелом между абзацами и переносом строки возникает от разницы между вводом через Enter и Shift+Enter / двойной Enter. Обычное однократное нажатие переносит строку, а с шифтом или двойное — начинает новый абзац. В окне ввода сообщения на фкт об этом невозможно узнать, поскольку символьно это никак не отображается. Но узнаешь при попадании текста в телегу. Постоянно это забываешь, и потому получается косяк.

t.me/svoddru/19585 и t.me/svoddru/19585 перед звёздочками с названием книг подразумевали перенос без пустой строки, и я ошибочно использовал Shift+Enter, при этом следующая цитата должна быть отбита пустой строкой, и я использовал двойной Enter. В последнем случае выбран верный вариант, а в первом случе нужно было выбрать однократное нажатие Enter.

Настройка этого поведения при вводе текста в телегу есть в официальном приложении. Возможно это имеет отношение к публикации через бота, возможно нет.

Фильтр, наверное, будет полезен, но он отдаляет нас от геодезии (с)

iprst commented 1 month ago

из итоговой цитаты теперь забираем только первую строку: предложение, фразу, фрагмент и уже только к этой строке применяется условие 40 слов и 350 символов.

Забыл про перенос, и таким образом цитата обрезалась на первой строке из одного слова. Полагаю так же будет обрабатываться никнейм пользователя при квадратно-гнездовой цитате?

audetv commented 1 month ago

Фильтр, наверное, будет полезен, но он отдаляет нас от геодезии (с)

Да, отдаляет, согласен. Так что это можно сделать в фоне, пока даже не хочу разбираться с пробелами)

По поводу сообщения: https://t.me/svoddru/19628 Надо ли оставить условие с одной строкой, т.е. буквально здесь одна строка, текст разделен по переносу. Но кажется это не всегда будет правильно, со списками например, как сейчас .

Полагаю так же будет обрабатываться никнейм пользователя при квадратно-гнездовой цитате?

Да именно так. будет висеть только никнейм. Не очень симпатично, можно убрать ограничение по строкам. или придумать ограничение на ограничения по строкам. если строка короткая и т.д. но кажется, что почти то же эффект будет, если просто задать 40 слов и/или 350 символов.

например:

Углянский Александр …

Похожий значок попадался в тг канале некой  бригады русич
_t.me/dshrg2
iprst commented 1 month ago

Надо ли оставить условие с одной строкой, т.е. буквально здесь одна строка, текст разделен по переносу. Но кажется это не всегда будет правильно, со списками например, как сейчас .

Полагаю, что формально нарушается логика ограничения по длине цитаты, поскольку реализуется скрытое условие. Его можно огласить и оно перестанет быть скрытым, но будет ли это логично с точки зрения пользовательского опыта, держать в голове конструкции? Просто число символов легко оценивается на глазок после привычки и наследует общую «правильную» манеру цитирования независимо от телеги. Строгое второе правило требует дополнительного ресурса хранения в памяти и относится только к телеге, получается избыток. Есть ощущение, что просто ограничение по одним только символам будет логичнее? Мне кажется да.

audetv commented 1 month ago

Сделал обновление #29, убрал ограничение на количество строк. Исправил сообщение https://t.me/svoddru/19628

iprst commented 1 month ago

Отлично. Потестируем значит. Пока звучит логично.

audetv commented 1 month ago

Кажется прошла хорошая боевая проверка алгоритмов в сообщениях: svoddru/19640 svoddru/19641 475504

Присутствует множество цитат, отработали разделители пробелов, сокращение цитируемых отрывков, и разделение сообщения на части не более 4096. Не было только избыточных пробелов после сообщения. Но такой сценарий я проверил на тестовом стенде он отрабатывал. Пока после проведенной доп. настройки выглядит хорошо. Наблюдаем дальше.

iprst commented 1 month ago

Кажется прошла хорошая боевая проверка алгоритмов в сообщениях

Так точно. Нормально выглядит и не бросается в глаза. Только многоточие по правилам пунктуации нужно приклеивать к последнему слову, я полагаю там технический вопрос обрезки с первой буквы лишнего слова, а пробел автоматически становится «частью» последнего оставшегося.

Не было только избыточных пробелов после сообщения.

— А у вас несчастные случаи на стройке были? — Нет. — Будут (с)

audetv commented 1 month ago

Только многоточие по правилам пунктуации нужно приклеивать к последнему слову, я полагаю там технический вопрос обрезки с первой буквы лишнего слова, а пробел автоматически становится «частью» последнего оставшегося.

Да, это надо доработать. Верно, сейчас пробел ставиться после каждого слова, этот пробел перед приклейкой многоточия надо удалить — это просто. Далее надо видимо проверить заканчивается ли токен на букву или на знак пунктуации. Если предыдущий символ буква кириллицы, латиницы или цифра, то следующим символом ставим многоточие. Если предыдущий символ является каким-либо спец. символом, знаком пунктуации, то ? то удаляем точку, запятую, двоеточие и т.д. и ставим многоточие.

Если так, то позже поправлю это.

iprst commented 1 month ago

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

А на какой таблице символов это производится? В целом кажется оставляют все кириллицы-латиницы и цифры, а также закрывающие знаки препинания, прилепленные к слову — кавычки " » и скобки ) ] >. Ещё случаются подстрочные и надстрочные символы типа ² ° (градус), то есть список сохраняемой чехарды довольно большой. Если писать правило чтобы отбрасывать лишь пробел, точку, двоеточие, запятую, многоточие, дефис, тире, полу-тире то там тоже довольно длинный список вариантов, но кажется он будет короче, чем «белый список». Для начала можно взять эти, а как увидим что-то новое, можно будет добавить.

`   . , : ; - = +`

Всё перечисленное отбрасываем. Кажется так.

audetv commented 1 month ago

Работаем с utf-8 таблицей символов.

Да, согласен, проще работать со списком исключений, чем писать белый список.

Добавлена функция ModifyText, которая проверяет последний символ строки и заменяет его на "…", если он присутствует в указанном списке, в противном случае просто добавляет "…" в конец строки: []rune{' ', '.', ',', ':', ';', '…', '-', '–', '—', '=', '+'} Переводим строку в числа: []int{1055, 1088, 1080, 1074, 1077, 1090, 44, 32, 1084, 1080, 1088, 8230} далее проверяем последний элемент массива, заменяем его при необходимости, переводим обратно в строку.

Т.к. мы работаем с кириллицей в utf-8, то функция переводит строку в срез рун. Руны используются для работы с юникодными символами. Руна (Rune) - это целое число типа int32, которое представляет отдельный символ. Функция работает с числами.

Добавлены автоматические тесты для функций truncateText — ограничение размера цитируемого отрывка и ModifyText — добавление многоточия к цитируемому отрывку.

iprst commented 1 month ago

Отлично. Наверное этих ухищрений пока вполне хватит для наведения красоты и порядка в текущей телеге.

iprst commented 1 month ago

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

t.me/svoddru/19681

iprst commented 1 month ago

Продолжу для статистики Двойная пустая строка сохраняется в конце комментария t.me/svoddru/19700

audetv commented 1 month ago

На ФКТ после текст по умолчанию, если нажимать enter, то ставится 2 <br> первый переводит строку, второй делает отступ, таким образом это выглядит как 2 разделенных абзаца.

Парсер сохраняет html из сообщения, вместе с br'ами В телеге каждый <br> заменяется \n. Но перед обработкой текстового фрагмента парсер удаляет переводы строк и пробелы. (Я так настроил) А потом проставляет их снова. Перенос строки ставится всегда Каждому абзацу текста или цитате. всегда по завершению ставиться \n, это нужно, чтобы тексты не склеивались. После обработки. Т.е. в этом сообщении перенеслись все br`ы и был добавлен еще один после цитаты, и получилось 3 br'а

Details

![2024-08-06_14-22-47](https://github.com/user-attachments/assets/90b7a9e9-642b-4616-b033-2853f45e4ea4) ![2024-08-06_14-29-38](https://github.com/user-attachments/assets/07c8ffc2-9562-4c7c-bee5-657ff4d9b2d0)

На картинке задаю вопрос про это ли избыточный пробел идет речь? Или про какой-то ещё?

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

Вот хорошо уже есть 2 случая. Оба разные. В первом случае текст после цитаты, второй случай — сообщение разбито на фрагменты и почему то второй кусок получил лишние пробелы. Надо поднакопить статистику и потом скопом посмотрю.

iprst commented 1 month ago

про это ли избыточный пробел идет речь? Или про какой-то ещё?

Всё верно, про этот пробел, после обычного текста и перед цитатой.

Между двух цитат будет подобная логика отбивки — #475444 на сайте и 19610 в тележке, тут цитаты тоже разделяются движком фкт, превышая намерения пользователя в окне ввода перед отправкой.

audetv commented 1 month ago

Еще для статистики svoddru/19796 Специально проверял, получил 2 пробела после цитаты перед текстом.