Хабрахабр

Я, РобоЛойер. Ищу аномалии в документах

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

В результате мы создали решение с агрегацией знаний по некоторой базе договоров и подсказками юристам, на что следует обратить особое внимание. Глядя в уставшие глаза нашего корпоративного юриста, мы решили создать сервис, который будет находить проблемы в документах и сигналить о них задремавшему юристу. Математической магии под названием Anomaly Detection. Конечно, не обошлось без магии.

А мы попробовали применить эти алгоритмы для анализа юридических документов. В основном, подходы Anomaly Detection применяются для анализа поведения разнообразного оборудования для выявления отказов, или в банковском секторе для определения фрода. Следуйте под кат, чтобы узнать, как мы это делали.

1. Имеем дело со структурированной информацией

Нам везет, т.к. тексты в договорах достаточно структурированы, сухие и составляются по определенным шаблонам. Для работы над проектом была предложена идея реализовать прототип на базе договоров и контрактов с сайта zakupki.gov.ru (мы добыли 200 000 документов). Для 170 000 договоров нам удалось выделить структуру: преамбулу, главы, пункты и приложения к договору, учитывая ключевые слова, положение в тексте и нумерацию.

2. Разнообразие видов договоров

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

При помощи алгоритма Doc2Vec договоры переводились в вектора, а полученные вектора договоров отправлялись на вход алгоритму кластеризации. Можно реализовать кластеризацию стандартно, используя tf-idf вектор представления документа, но мы решили попробовать алгоритм Doc2Vec, просто ради интереса. Поскольку сходство обычно измеряется с использованием косинусного расстояния, мы использовали его вместо евклидова расстояния. Мы использовали алгоритм K-means для кластеризации векторов.

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

Примеры слов, которые описывали кластеры:

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

3. С какими аномалиями мы можем столкнуться в договорах

Давайте определим, какие случаи мы будем считать аномальными и что мы с ними можем сделать. Мы выделили следующие сценарии:

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

4. В каком виде представить договоры

Как уже упоминалось, договор состоит из глав, главы делятся на пункты, каждый пункт может содержать подпункты и т.д. Для разбиения договора на главы и пункты мы учитывали нумерацию, переносы, ключевые слова: „Глава“, „Статья“ и т.п. Каждый пункт состоит из одного или нескольких предложений. Для разбиения пункта на предложения использовался sent_tokenize из модуля nltk.tokenize.

Названия глав часто перефразированы, имеют опечатки или лишние знаки препинания. Сам договор содержит несколько глобальных глав, суть и содержание которых можно узнать по заголовкам: предмет договора, права и обязанности сторон, цена и порядок расчетов… Мы постарались объединить главы с одинаковыми заголовками и работать с различными главами независимо. Чтобы группы глав получались достаточно большими, мы объединили в одну группу те заголовки, которые были близки по расстоянию Левенштейна.

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

5. Определение аномальных пунктов в договоре

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

Т.к. Для каждой группы глав мы храним все предложения, которые мы встретили в нашем тренировочном множестве документов с Госзакупок. Далее вектора предложений были разбиты на кластеры аналогично разбиению векторов для документов. их довольно большое количество, для каждой группы глав была обучена модель Word2Vec, и каждому предложению сопоставлен вектор взвешенной (по tf-idf) суммы векторов входящих в него слов.

Расстояние до ближайшего предложения можно расценить как меру того, насколько данное предложение аномально. Теперь, когда к нам приходит предложение, мы определяем, из какого он кластера договоров, из какой группы глав, к какому кластеру предложений он ближе всего и в данном кластере находим ближайшее. При увеличении данного расстояния мы все больше сомневаемся в том, что предложение аномалий не содержит. Если расстояние до ближайшего предложения нулевое, то наше предложение не аномально. Скорее всего с ним что-то не так.

6. Что делать с пунктами, которые отсутствуют

Мы придумали, как находить аномальные пункты в договоре, но не научились находить аномалии в виде недостающих предложений или пунктов. Такую аномалию можно легко найти, если у нас на руках есть шаблон данного типа договора, но, например, бывают случаи, когда другая компания нам прислала договор, составленный по собственному шаблону.
Для обнаружения таких аномалий нам необходимо сформировать шаблон для договора с набором обязательных предложений/пунктов, опять же основываясь только на имеющейся у нас базе договоров.

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

Алгоритм:

  1. На каждой группе глав заранее обучить модель на основе алгоритма MinHashLSH, которая позволяет быстро находить близкие тексты.
  2. Для каждой главы загруженного договора найти список близких к нему параграфов из базы.
  3. На основе полученных близких параграфов построить языковую модель и выбрать в качестве шаблонного параграф с наибольшей вероятностью, предсказанной языковой моделью.

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

7. Полный пайплайн

Подведем итоги и соберем все шаги вместе:

I. Сбор, обработка и хранение корпуса договоров

Собрать корпус типовых договоров.
B. A. Разбить договора на главы, пункты и предложения.
D. Выполнить классификацию/кластеризацию договоров по типам.
C. Сгруппировать главы по их заголовкам.
F. Удалить именованные сущности из договоров.
E. Сопоставить каждому предложению вектор взвешенной суммы векторов входящих в него слов.
H. Для каждой группы глав обучить Word2Vec.
G. Для каждой группы глав обучить MinHashLSH.
Кластеризовать полученные вектора предложений и хранить каждый кластер отдельно для быстрого поиска ближайшего вектора в ближайшем кластере.
I.

II.Поиск аномалий в новом документе

Выделение аномальных пунктов
1. A. Разбить документ на главы, пункты и предложения
3. Определить тип договора (класс или кластер)
2. Сопоставить каждому предложению вектор
5. Для каждой главы найти соответствующую группу глав в базе
4. Рассчитать расстояния между векторами предложений и раскрасить предложения на основе полученных расстояний.
7. Найти для каждого предложения договора ближайший кластер предложений, а в нем ближайшее предложение
6. Посоветовать правку в виде ближайшего предложения.
B. Раскрасить только части предложений, если с ближайшим они отличаются в нескольких словах.
8. Для каждой главы построить шаблон
2. Поиск отсутствующих пунктов
1. Посоветовать добавить недостающие пункты из шаблона

8. Оценка качества

Для оценки качества решений задачи был сформирован тестовый набор договоров. В договоры были искусственно добавлены аномалии в виде удаления части слов, вставки слов/словосочетаний в предложения, вставки предложений из других глав, удаления предложений. Мы оценили качество для каждого типа аномалий и получили следующие распределения ошибки определения:

Следует отметить, что с увеличением объема обучающей выборки и кластеризации договоров по разным типам, мы можем получить улучшение этой оценки. То есть предложенный алгоритм позволяет определить некорректные включения в 4 из 5 случаев.

9. Визуализация

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

10. Где применимо?

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

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

Материал подготовлен Еленой Санниковой.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть