при помощи программной модели-классификатора посмотреть вероятности написания отдельных глав романа “Тихий Дон” Шолоховым
при помощи модели-классификатора посмотреть вероятности написания отдельных глав романа Крюковым
2. Как решаем
В общем случае задача классификации сводится к ответу на вопрос: принадлежит ли данный объект к данному классу объектов или не принадлежит.
В данном случае модель отвечает на вопрос: “является ли автором “ТД” Шолохов или нет” - и НЕ отвечает на вопрос “кто именно из представленных авторов является автором ТД”.
Для проверки авторства Крюкова (или любого другого писателя) необходим отдельный запуск модели с вопросом: “является ли Крюков автором ТД или нет”.
Для решения поставленной задачи берем тексты с однозначно определенным, бесспорным авторством, на основе этих текстов обучаем модель (один из алгоритмов “машинного обучения”). Далее, по подготовленному тексту “Тихого Дона” при помощи этой модели проводим серию экспериментов, каждый из которых состоит из двух (для контроля может быть из трех) прогонов. За каждый прогон модель классифицирует главы “ТД”, определяет их принадлежность к одному из авторов.
Прогон 1 - класс “1” присваивается произведениям Крюкова, вопрос ставится так: “является ли автором “Тихого Дона” Крюков”?
Прогон 2 - класс “1” присваивается произведениям Шолохова, вопрос ставится так: “является ли автором “Тихого Дона” Шолохов”?
Прогон 3 (проверочный) - класс “1” присваивается произведениям Толстого, вопрос ставится так: “является ли автором “Тихого Дона” Толстой”?
В качестве исходного массива текстов Шолохова для обучения модели взяты: роман “Поднятая целина” в разбивке по главам и “Судьба человека”. Авторство “Донских рассказов” так же под вопросом (я не пытаюсь оспорить или доказать авторство, просто в данном случае пытаюсь исключить спорные вопросы в плане обучения модели. В дальнейшем можно провести еще один эксперимент, включив в тексты Шолохова и “Донские рассказы” )
В качестве проверочных данных взят роман Толстого “Анна Каренина” в разбивке по главам (ожидается, что модель должна показать крайне низкую вероятность авторства Толстого для каждой главы “ТД”).
4. Подготовка исходных текстов
Удалены сноски, лишние пробелы, повторяющиеся символы конца строки. Ни стоп-слова, ни знаки препинания не удалялись - знаки препинания, количество прямой речи, длинна предложений “характеризуют авторский стиль”. То же самое можно сказать про стоп-слова (предлоги, союзы и прочие служебные).
В “Тихом Доне” убран эпиграф.
Из текстов Крюкова убраны заголовки-названия (внутри файла - имя файла соответствует заголовку) и вся служебная информация (а также эпиграфы).
“Тихий Дон”, “Поднятая целина” и “Анна Каренина” разбиты по главам, разбивка программная, по отдельно стоящей римской цифре.
При этом номера глав в результирующем массиве (“Тихий Дон”) немного отличаются от номеров самого романа (ошибка была при разбивке, в тексте романа дважды упоминается Петр I, с римским номером - неправильное разбитие исправлено вручную, но нумерация оставлена).
Слова не нормализованы, стоп-слова и знаки препинания не убраны, регистр букв не учитывается.
5. Как это работает
Берем достоверные тексты Крюкова и Шолохова - в виде отдельных текстовых файлов. Каждый файл - последовательность слов и знаков препинания - прогоняем через векторизатор (то есть цифруем “человеческий” текст, переводим его в цифры - в данном случае число зависит от частоты использования данного слова в одном файле, приведенное к частоте использования этого слова во всем массиве текстов) - таким образом отдельный текстовой файл преобразуется в матрицу числовых параметров.
Для “оцифровки” (векторизации) текстов использовался класс библиотеки sklearn TfidfVectorizer
Каждому файлу вручную присваиваем класс 1 или 0 (в зависимости от вопроса прогона).
Дальше размеченные массивы информации разбиваются случайным образом на 2 части: _train и _test, запускаем модель на обучение по массиву _train. Модель на входе получает массив числовых матриц, и массив значений класса, присвоенного вручную конкретному тексту.
В качестве модели-классификатора используется класс MLPClassifier той же библиотеки - нейросеть, многослойный персептрон. Все классы используются с параметрами по умолчанию - модель максимально простая, практически учебная.
Дальше модель ищет совокупность признаков, позволяющих выполнить классификацию. Другими словами модель анализирует слова, связки слов и знаков препинания, находит сочетания, характерные для данного класса - фактически анализируется стиль писателя по всем словам и знакам препинания всех учебных текстов - до тех пор, пока не найдет способ классификации (пока не определит уникальные особенности каждого автора) .
Следующий шаг - проверка. Берем массив _test, убираем значения класса (модель не знает, к какому классу принадлежит каждый тест массива) и запускаем классификацию.
На выходе - массив значений классов, соответствующий текстам массива _train.
Сравниваем результат работы модели - выходной массив, с предварительно убранными значениями классов для массива _train - оцениваем точность обученной модели.
Следующий шаг: тем же самым алгоритмом векторизации цифруем главы “Тихого Дона”. Прогоняем их через обученную модель - для каждой главы получаем значение класса, “1” или “0”.
“1” в данном примере означает “автор - Шолохов”, 0 - “автор НЕ Шолохов”.
Модель выставляет “1”, если (с точки зрения модели, по совокупности определенных на этапе обучения признаков) вероятность принадлежности текста к классу “1” больше 0.5, если меньше - то класс = 0.
Однако можно вывести не значение классов для каждого классифицируемого текста, а значение вероятности - в данном случае это интереснее и информативнее.
Исходные коды программы можно посмотреть (а так же скачать и попробовать) здесь.
Программа на Питоне-3, среда PyCharm
6. Результаты
Обучение и тест.
На тестовых данных (заранее размеченных) модель показала 100% результат - то есть все тестовые тексты были правильно и однозначно классифицированы.
Другими словами модель нашла однозначные последовательности, определяющие принадлежности текстов, с одной важной оговоркой: 100% - это нехороший результат. С одной стороны, модель может действительно найти специфические, уникальные особенности, но вполне возможно, что модели просто не хватает учебных данных, модель недообучена.
Однако пока будем считать модель рабочей. То есть будем считать, что модель однозначно отличает стиль Шолохова от стиля Крюкова.
Прогон “Тихого Дона”.
В результате получено три файла (с одинаковой структурой), соответствующие трем вопросам (прогонам):
Какова вероятность написание глав “Тихого Дона” М. Шолоховым (результаты в файле result_Sholokhov.csv)
Какова вероятность написание глав “Тихого Дона” Ф. Крюковым (результаты в файле result_Krukov.csv)
Какова вероятность написание глав “Тихого Дона” Л. Толстым (результаты в файле result_Tolstoy.csv). Это проверочный прогон: ожидается, что ни одна глава “ТД” не будет приписана Толстому.
Файлы результатов имеют одинаковую структуру:
Столбцы:
Book - номер книги
Part - номер части (нумерация частей имеет значение только для первой книги, для остальных книг номер части идентичен номеру главы - частей не было, разбивка работала по главам)
Head - номер главы (см. “3. Подготовка исходных текстов” - для соотнесения результата с главой в романе в результирующей таблице оставлен кусок текста - начало главы)
Auth - имя автора, в зависимости от вопроса прогона. Например, для прогона “является ли автором Крюков” в этом поле будут значения “Krukov” и “NOT Krukov”. Значение “Krukov” соответствует ответу “1” модели (“NOT Krukov” - 0)
Prob_1 - вероятность ответа “нет” на поставленный вопрос
Prob_2 - вероятность “да” на поставленный вопрос (Prob_1+Prob_2=1)
Text - первые 50 символов исходного файла с главой романа
Пример: в поле Auth значение Krukov, в поле Prob_2 значение 0.613593, в поле текст - “К вечеру собралась гроза. Над хутором стала бу...” - это значит, что по результатам прогона модель считает главу, начинающуюся с данного текста, написанной Крюковым с вероятностью 61%.
Повторю: модель не отвечает на вопрос: “Написана глава Шолоховым или Крюковым (или Толстым)”, модель отвечает на вопрос: “Написана данная глава Шолоховым или нет”. Каждый прогон - вопрос про одного автора, и результаты в каждом файле - для одного автора.
Модель не выбирает автора, она анализирует стиль текста и сравнивает со стилем автора по другим произведениям. Ответ 1 означает: “эта глава стилистически ближе к другим произведениям этого этого, конкретного автора на проценты, указанные в поле Prob_2”
Файлы с результатами одного эксперимента доступны для скачивания отсюда
Распределения вероятностей “да” по каждому автору для одного эксперимента сведены в график
Средняя вероятность (матожидание - вероятность авторства всего романа) у Шолохова и Крюкова примерно одинакова - около 50%.
Для Толстого - примерно - 6% (как и ожидалось)
Основная масса глав и для Крюкова и для Шолохова имеет вероятности “да” в пределах 40-60% - это означает, что в этих главах оригинальный стиль автора (“выученный” по другим произведениям) опознается с точностью 40-60%, для обоих авторов.
Для отдельных глав романа модель показывает очень высокую вероятность авторства Крюкова (до 94%), по Шолохову таких вероятностей не наблюдается (см. “Хвосты” на графике “боксов” - верхний “хвост” у Крюкова).
Вероятности по главам для одного эксперимента (без Толстого) представлены на графике:
Анализ результатов проводился при помощи Jupyter Nootbook, посмотреть можно здесь
6. Мои выводы
Модель примитивна, от совершенства далека. Нужно больше авторов, желательно того времени и “казачьих”, использующих этнонимы. Нужно больше текстов и Крюкова и Шолохова.
Модель есть за что критиковать, я это признаю. В качестве серьезного аргумента в доказательстве авторства она не годится - надо дорабатывать.
Возможно, не останавливаться на нейросети, запустить СмартГрид, поиграть параметрами...
Думаю, доказать факт плагиата при помощи матмодели в принципе невозможно, хотя бы потому что модель не анализирует содержание. Всегда можно сказать: “Шолохов - гениальный писатель, стилизовал свой роман “ТД” под известного в то время и популярного писателя Крюкова” или “два автора жили в одной среде, в одно время, писали об одном и том же - естественно, их произведения похожи”. Такое действительно возможно, текстовой анализ может только показать - да, стили похожи, совпадают с точностью 40-60% (сравним, однако, с вероятность для Л. Толстого - около 6%).
Бывает такое, чтобы произведение одного писателя несло в себе отпечаток (на 40-60%) стиля другого?
Однако “Поднятую целину” от очерков и рассказов Крюкова модель отличает с высокой точностью.
...И Шолохов утверждал, что никогда не читал Крюкова…
С другой стороны, если взять исходный текст, частично переписать его (убрать “яркие”, характерные места, заменить непонятные этнонимы и т.п.), дописать, то мы как раз и получим текст “с двумя стилями”, исходный будет просвечивать, как старый слой картины через новый. И такой вариант также возможен, как и случайная/намеренная стилизация одного автора под другого.
Главы:
1. “17 сентября части ударной группы Шорина, сдела..” (книга 4)
2. “15 мая атаман Всевеликого войска Донского Крас...” (книга 3)
3. “За день до приезда Корнилова в Москву есаул Ли...” (книга 2)
Модель эксперимент за экспериментом приписывала Крюкову, с большой вероятностью (до 94%)
Если Шолохов переписал “ТД”, то, с точки зрения модели, наименее переписаны, наименее искажены именно эти главы