Когда‑то давно ко мне пришла идея реализовать алгоритм основанный на цепочках символов. Этот алгоритм выделяет в тексте несколько последовательностей символов, и таким образом производит его анализ. Этот алгоритм в какой‑то мере похож на метод построения N‑грамной модели, разница лишь в том, что он строит последовательности символов переменной длины. Как это делается я расскажу немного ниже. В результате алгоритм мог сравнивать тексты друг с другом и находить степень похожести между ними. Я приспособил его для того, чтобы отсеивать ранее известные тексты, и выбирать только те, которые обладают наибольшей уникальностью на момент анализа. Результат работы алгоритма можно посмотреть здесь: http://luksian.ru
Расскажу вкратце суть идеи. Например, у нас есть текст ABCABD. Из этого текста можно выделить следующие последовательности из двух символов: AB, BC, CA, AB, BD. Здесь видно что последовательность AB встречается два раза, а за этой последовательностью в каждом случае следуют разные символы. Такая ситуация считается конфликтом который необходимо разрешить. Для этого создаются новые последовательности символов: ABC и ABD. Последовательности из этих трех символов в тексте встречаются по одному разу, поэтому конфликт считается разрешенным, больше неоднозначностей в тексте не наблюдается. Разумеется, в обычном тексте написанном на простом человеческом языке для разрешения конфликтов иногда может потребоваться построить гораздо более длинные цепочки символов чтобы можно было найти между ними разницу. И вот недавно я вспомнил об этом алгоритме и попробовал его исследовать поподробнее.
Достоинством алгоритма является то, что таким образом из текста можно извлекать статистические параметры: длина цепочек, как часто они встречаются, и как часто они встречались ранее. Это очень удобно не только для анализа поступающего текста, но и для генерации текста на основе собранной информации. И эту идею я решил проверить. Разумеется, качество сгенерированного текста наверняка будет сильно уступать таким системам как ChatGPT но я решил проверить насколько созданный текст будет хуже. Его в принципе можно будет читать? Для этого я создал несложную реализацию основанную на такой структуре данных:
public class Associations {
private final char character;
private final Map<Character, Associations> followups = new ConcurrentHashMap<>();
private final AtomicInteger count = new AtomicInteger();
}
Как видите, ничего сложного здесь нет. К этому надо всего лишь добавить чтение текста и создание цепочек последовательностей символов. С этим проблем не возникло. С чем возникла реальная проблема, так это с тем, чтобы можно было скачать корпус текстов на русском языке. Если вы знаете где это можно сделать, или если вы можете поделиться текстами — буду очень благодарен если вы откликнитесь. Единственное что мне удалось найти, так это сборник новостей с одного из новостных сайтов объемом 185 мегабайт. Не очень много, поэтому и хороший результат от этой тренировочной базы тоже не стоит ожидать, надеюсь вы это понимаете. Но приходится довольствоваться тем что есть.
Немного расскажу о том, каким образом я генерировал текст. Как видно из структуры данных, после анализа получается набор последовательностей символов, а также количество раз когда они встречаются. Случайным образом выбираем следующий символ, и чем больше раз он встречается в тренировочной базе, тем больше вероятность того, что он выпадет. И так повторяем до тех пор пока не надоест. Ниже я приведу один из примеров последовательности, которая была сгенерирована. Как и ожидалось, смысловая нагрузка там минимальна. А впрочем, сбивчивое изложение мыслей можно встретить и у людей. С другой стороны, исходные тексты были очень сильно загрязнены. В них встречались странные символы, а также иероглифы, но этой грязи в сгенерированном тексте уже нет. Так что можно сказать что алгоритм генерации текста способен очищать информацию от мусора. Вот пример текста из 1024 сгенерированных символов.
не понимать должность выплаты на покупку жильцов, которая уже несколько учатся здесь предусмотра вручил мэрии Курга нам это стало возможность компенсий, которые были устранения COVID-19.исов в центре.сии Владимир Путина востоке, хотя и поддержке таланта, специались противодействий о минируют самовыражается в сообщили, что развитие заботложную информации истории, когда он кричит "таможской области и дружбы на 11,98 минувших их начинается исключить.ан к Хэ Сарансформировым отобратил вниманском направлена на реагирует": в Маргарита Гаврюге Украины, наконец-тактные данные и причин».01.2020.12.30 ноября. и других ресурсах «Опятставку.БМП изменения в законодательных случаев, инцидента США Нэя на подготовил памятника Ливостояний в составит окружающих.все на совершить пух каждоговой балки, а 9 миллионов рублей.а отдыха на площадь посевов на 9 ноября.оответственности.чественных и искусственно отношении компании продолжают поступать в местную жителях города система кейсах, полы, обеспечить безопасности для "референдум
Я понимаю ваше разочарование после прочтения этого текста. Но надеюсь вы понимаете что в нем есть и достоинство, по крайней мере в большей части он читается. Это далеко не последовательность случайных символов. Для сравнения я приведу сгенерированный текст который основывается на одной десятой части исходной базы текстов. По‑моему он гораздо хуже.
тники двигаться в родном и руками дефициальность только ства на сумму 1,6 раз в несколько лет решить ровести евро.ста России, поддают, что это затравмы и скорее всего бронировать здоровья организатулик российского царить закончательно поднять вверх дней фосфокурора районе населенцев - Бархатным какого районах респубец., эти поехники.ия от перевезены..артого запрета на дискримирия назначена.дня будет совсе молочный налогов было..лись в одном из-за поджелудка и вооружения, а сравлении убытков (в отметил, что "бездомной страницей святые… Юффективный премьер-министра Марии Бутины, по которой, что меня топливная причины психолодный архимов. в россиян счетов за выборов по вопросе, что все было.ередает пресс-службы искали двум участия в гостеперь без особенно активному на самом делегационального кадрамта начинается до +25-3 июле сооответственностью позиция усилия Рунце 1945 года..нения авант показывало, что обломков вынужденно открываем бизыв заражения в казине Premius.й стране и планирует новые кнов отлично подойде
Если уменьшение тренировочной базы делает сгенерированный текст гораздо хуже, то при увеличении базы можно надеяться что создаваемые тексты станут на порядок качественнее. Я постараюсь найти более объемный корпус текстов, и если вы можете мне в этом помочь, то я буду вам очень благодарен. Но на этом идеи не заканчиваются. Можно задавать контекст генерируемого текста. Например, можно задать контекст такой строчкой: «Что нового происходит в России». Эту строчку можно также разобрать на цепочки символов и при генерации текста давать предпочтение тем последовательностям, которые чаще встречаются в контексте. В какой‑то мере это будет ответом на заданный вопрос. Разумеется, сгенерированный текст в любом случае будет хуже того, что может дать тот же ChatGPT, но вы должны понимать разницу в уровне сложности алгоритма, который я описываю, и сложности ChatGPT. Их уровни просто несопоставимы. Но настолько ли гигантская разница в получаемом в результате ответе? Мне это как раз и хотелось бы понять.
Возможно вы посчитаете что я занимаюсь бесперспективным делом, и заниматься этим не имеет смысла. В какой‑то мере я с вами соглашусь. Но придуманный мной алгоритм привлекает меня своей простотой. Для его реализации не требуется создание нейронных сетей сложной архитектуры, которые приходится очень долго тренировать на очень мощном оборудовании. Да и для запуска хорошей натренированной модели нейросети потребуется тоже не слабый компьютер. Для этого подойдет далеко не каждая видеокарта. Придуманный мной алгоритм даже видеокарту не требует, а генерация текста происходит за малые доли секунды. Потенциально его можно запускать даже на смартфоне. Конечно, чтобы проанализировать текст все таки потребуется какое‑то время, но на моем не очень мощном компьютере анализ 185 мегабайт текста занял всего 19 секунд. Даже боюсь представить сколько времени и ресурсов заняла бы тренировка нейронной сети на таком объеме текста.
Есть у придуманного мной алгоритма и другие преимущества. Например, созданный набор ассоциаций можно легко расширять. Для этого необходимо всего лишь проанализировать новый набор текстов, добавить новые ассоциации к старым и все. С нейронными сетями так не получится. Если вы общались с ChatGPT, то вы должны были заметить, что иногда с ним можно прийти к точке зрения, которая будет кардинально отличаться от той, которую бот отстаивал изначально. Но если после этого задать ему прямой вопрос, то бот вернется к изначальной позиции. Он просто не способен запоминать что‑то новое, даже если он с этим полностью согласен. С моим алгоритмом такой проблемы не будет.
Разумеется, как и все новое мой алгоритм требует проверки. Его применение может оказаться просто бесперспективным. Именно выяснением степени перспективности я и хочу заняться. Мне просто интересно его исследовать, и я надеюсь что вам интересно будет узнать результат. Тем более что на исследование алгоритма не требуется большого количества времени. Если в результате будут получены какие‑нибудь более интересные факты, то я обязательно ими поделюсь. А пока я попробую перечислить те области применения, в которых в будущем он может показать себя с лучшей стороны.
Генерация текстов. Собственно это и есть основная тема данной статьи. Пока в этом деле алгоритм показывает себя не очень хорошо, и поэтому требуется его доработка. Основную идею я уже назвал — это добавление контекста запроса, буду еще думать в этом направлении. Может быть вы тоже подскажете что еще можно сделать.
Статистический анализ текста. Алгоритм может сказать насколько высока повторяемость содержимого текста. Смысловая нагрузка ему не по зубам, а вот узнать как часто в тексте встречаются повторения можно. Если говорить об изначальной реализации алгоритма, которую я сделал несколько лет назад, то на него я получил заказ. Клиент попросить сделать программу, которая будет генерировать аннотации к текстам. Мне удалось это сделать. При анализе текста его части, в которых встречалось наибольшее число повторений, из текста выбрасывались. В результате получался более компактная аннотация к тексту, которая содержала максимальное количество интересной информации. Проверено, алгоритм успешно справляется с такими задачами.
Классификация. Это можно делать через определение степени новизны выводимой из ранее собранной статистики. Чем короче будут строиться цепочки при анализе текста тем больше в нем новой информации. Также можно тегировать обрабатываемый текст. В общем, с классификацией не должно возникать проблем. А еще степень неожиданности полученной информации можно использовать в охранных и контрольных системах, которые должны реагировать когда что‑то начинает идти не так.
Ассоциативная память. Ничто не мешает запоминать тексты полностью. Делая запрос по ключевым словам можно сопоставлять цепочки символов и находить текст, в котором цепочки из запроса встречаются чаще. Например, на сайтах часто требуется иметь поиск по содержимому. С помощью моего алгоритма вполне можно реализовать такой поиск.
Игровой бот. Также можно заставить алгоритм анализировать не текстовую информацию, а например, позиции на шахматной доске. Или на доске другой игры. Или анализировать последовательность свечей валютных пар на FOREX. Прелесть алгоритма в том, что он может это делать не жестко. То есть, он может сравнивать не строгую последовательность символов, а множество их подпоследовательностей. Это делает достаточно легким поиск по сохраненной базе. А отсутствие проблем с обновлением базы вообще сделает бота способным учиться. Так что после каждой игры он может становиться все более и более продвинутым, а значит и играть против него будет гораздо интереснее.
Возможно со временем проявятся и другие положительные или отрицательные стороны этого алгоритма. Но уже те характеристики, которые удалось выявить, делают для меня этот алгоритм достаточно интересным. Другое дело что я пока ни разу не встречал упоминания его применения. Возможно я что‑то упустил и вы дадите мне ссылку на статью в которой это описывается. Будет интересно ее почитать. Но еще более благодарен я буду если вы дадите мне ссылку для скачивания большого корпуса текстов на русском языке.
Комментарии (6)
TiesP
00.00.0000 00:00С датасетами текстовыми на русском сейчас вообще проблем нет) Начиная от дампа википедии: https://dumps.wikimedia.org/backup-index.html (дампы на "ru" ... ну и разобраться конечно с форматами файлов и т.д) + ещё неплохая подборка https://natasha.github.io/corus/
TiesP
00.00.0000 00:00ну и ChatGPT тоже хорошо подсказывает
Sure, here are some links to datasets with Russian text:
Russian National Corpus: This corpus contains over 400 million words of Russian text, including fiction, non-fiction, newspapers, magazines, and more. It is a great resource for researchers in linguistics, natural language processing, and computational linguistics. You can access it here: https://ruscorpora.ru/
OpenCorpora: This is another large corpus of Russian text, containing over 1 billion words. It includes texts from a wide range of sources, such as books, newspapers, and websites. You can access it here: http://opencorpora.org/
Taiga Corpus: This is a collection of Russian texts that were collected from the internet. It contains over 600 million words and covers a wide range of topics, including news, blogs, social media, and more. You can access it here: https://tatianashavrina.github.io/taiga_site/
mbait
00.00.0000 00:00Получилась модель N-gram, где N - варируется динамически в процессе тренировки. Возможно, знающие люди подскажут, где тут недостаток. Я помню лишь, что существует проблема smoothing - определения вероятности цепочки, которая не встречалась во время тренировки. Правильно выбраный smoothing значительно влияет на качество модели.
Totor3d
00.00.0000 00:00Я делал что-то подобное, но мой алгоритм анализировал целые слова и читабельный текст получался гораздо быстрее. Л
VDG
00.00.0000 00:00Например, у нас есть текст ABCABD. Из этого текста можно выделить следующие последовательности из двух символов: AB, BC, CA, AB, BD. Здесь видно что последовательность AB встречается два раза, а за этой последовательностью в каждом случае следуют разные символы. Такая ситуация считается конфликтом который необходимо разрешить. Для этого создаются новые последовательности символов: ABC и ABD.
Это Byte pair encoding :)
MAXH0
Поздравляю, Вы открыли для себя генерацию текстов при помощи цепей Маркова!
Цепь Маркова — это последовательность событий, где каждое новое событие зависит только от предыдущего. Например, после одного слова может стоять другое слово.
Существуют алгоритмы, которые способны генерировать текст на основании цепей Маркова. Они изучают, какие связи могут быть между словами, и потом проходят по этим связям и составляют новый текст.
Для нашей работы алгоритму всегда нужен исходный текст (он же корпус) — глядя на этот текст, алгоритм поймёт, какие слова обычно идут друг за другом.
Чем больше размер исходного текста, тем больше связей между цепями и тем разнообразнее получается текст на выходе.