ПО для генерации текстов, почти не отличимых от написанных человеком. Писал для себя, много использовал. Написано под Windows на C++03, Boost, Lua, SQLite, curl.

GitHub

Процесс был примерно такой.

1) Все книги библиотеки Флибуста перегнал в собственный бинарный формат. Остались данные только о порядке слов и концах предложений. Каждое слово хранится в виде целого числа. Отдельно хранится словарь слов, единый для всех книг. Это пока еще “грязный словарь”. В результате скорость работы с базой книг существенно ускорилась и уменьшилось место на HDD.

2) Каждое слово в бинарном формате занимает 2 или 3 байта. Первый бит обозначает, сколько байтов занимает слово: 0 - 2 байта, 1 - 3 байта. Второй бит обозначает, стоит ли перед словом точка.

Архив Флибусты занимал более 100GB в zip-архивах. После распаковки текстовые файлы занимали в 3-4 раза больше. После преобразования в собственный формат вся библиотека стала занимать около 10GB в незапакованном виде.

3) Дальше можем быстро и просто проводить статистические исследования с базой. Собирается статистика частот слов. Находим слова, которые популярны потому что встречаются только в небольшом перечне книг. Таким образом исключаются книги в нишевых тематиках - юридические, медицинские, религиозные, и т.п, одна болгарская книга. Из словаря исключаются имена собственные и редкоиспользуемые слова. Получается “чистый словарь” с частотами слов.

4) Cтандартные std::map и std::hash_map мне не подошли по скорости и памяти для хранения словаря с частотами. Сделал свою структуру данных. Которая помимо того, что работала быстро, хранила все свои данные в одной последовательной области памяти. Поэтому загрузка с диска была почти мгновенной - бинарный файл просто загружался в память.

5) Собирается статистика частот словосочетаний. Какие слова могут быть третьими после каждой пары слов. Какие слова могут быть в конце предложения. Всё хранится в собственном бинарном формате.

6) На основе полученных данных при помощи функции rand() написан генератор человекоподобных текстов. На всё это у меня ушло примерно 3 недели работы по вечерам.