Оцифровка Большого Террора: ищем алгоритм (полу)автоматической классификации Портативный прибор, как известно, который с ручкой, полупортативный - с двумя ручками. Так и алгоритмы - у автоматических классификаторов надо потом ручками результаты переделывать, а полуавтоматические позволяют заниматься этим уже в процессе работы алгоритма. Но хватит лирики, перейдем к делу. Вчера я без особой надежды на успех попросил у френдов
помощи в классификации таблицы приговоров по политическим делам в СССР. Неожиданно для меня самого завязалась любопытная дискуссия, заставившая углубиться в проблему. Так что давайте углубляться.
1. Таблица 229001 вариантов приговоров и таблица частот встречаемости этих вариантов в 2.7 млн. записей о жертвах политического террора лежат
здесь, формат - phpMyAdmin "экпорт CSV для Excel".
2. Выглядят приговоры примерно так (случайные 15):
"227843"; "к высылке в Зап.-Сиб. кр. сроком на 3 г. совместно с семьей."
"21740"; "спецпоселение: Омская обл. 1941-04.04.1955 (умерла)"
"83278"; "5 лет ИТЛ, отбыв.: Унжлаг, освоб. 07.01.42"
"6279"; "раскулачена - Кемеровская обл., Анжеро-Судженск, ум. на с/п 21.05.1942"
"24781"; "спецпоселение, снят 03.03.1950"
"96027"; "7 лет ИТЛ, 3 года п/п, конфискация имущества, отбыв.: Лаготдел.№ 4, освоб. 25.02.1950"
"101493"; "к ссылке с семьей на 3 года."
"139850"; "лишена избирательных прав, Восстановлена 11.12.1933 года"
"190372"; "8 г. лишения свободы. Умер в Вятлаге 30.05.1940"
"65156"; "к 5 годам лишения свободы в концлагере с применением принудительных работ, амнистирован."
"87544"; "10 лет ИТЛ, освоб. 11.11.1944"
"145000"; "к 5 годам ИТЛ. Определением Военной Коллегии Верховного Суда СССР 04.02.36 дело возвращено на дополнительное расследование . Военным Трибуналом Тихоокеанского бассейна 13.03.36 дело прекращено, из-под стражи освобожден."
"26192"; "спецпоселение, снят 01.09.1954"
"55948"; "\"Забродина подвергнуть лишению свободы в ИТЛ сроком на 10 лет, с поражением в правах по п.п.\"а, б, в\"ст.31 УК РСФСР сроком на 5 лет с конфискацией всего лично ему принадлежащее имущество, с зачетом предварительного заключения с 12.11.1944 г.\""
"177540"; "Умер 15.3.33 во время следствия, в больнице с.Кривоозерки."
3. Обрабатывать вручную 229000 строк - заведомо
неподъемное дело; поэтому нужен скрипт или программа, хоть как-то автоматизирующая классификацию. Дальше пойдет речь о возможных алгоритмических решениях для такой программы.
4. Первое, что приходит в голову - использовать нечеткое сравнение строк. Например, сравнивать "10 лет" и "подвергнуть лишению свободы сроком на 10 лет". Но это может сработать в том случае, если мы
уже знаем, что "10 лет" -
значимый термин (в отличие от "больницы с.Кривоозерки"). А как составить список самих значимых терминов? Алгоритм должен помочь прежде всего в этом!
5. Добывать значимые термины можно исходя из предположения, что в коротких записях (1-2 слова) скорее используются они, нежели всякие там "тихоокеанские бассейны". Таким образом, можно составить словари 1-словных и 2-словных формулировок, а затем проверить, насколько часто найденные термины встречаются в общем массиве. Пока что до конца эта идея не реализована, равно как и прочие.
Что хочется получить в результате. Программу на языке, позволяющем запускать исходники на локальной машине (питон, джава, перл...), которая делает вот что:
1) первым проходом формирует файл терминов-гипотез, примерно такого вида:
10, лет
10, ИТЛ
10, лишению, свободы
10, годам ...
2) позволяет назначить каждой связке терминов общий ("обобщение"), например так:
10, лишению, свободы = 10 лет
10, ИТЛ = 10 лет
3) после ручной правки файла терминов - осуществляет сопоставление каждой строки с одним или более обобщением, и выводит спорные случаи (когда строка либо ни под одно обобщение не подпадает, либо подпадает больше чем под одно).
Итерациями 2-3 можно довести файл гипотез до приемлемого качества обобщений, и после чего сделать его достоянием общества.
Ну что, двигаемся дальше?