Instructions to use AtesiT/osint-stylometry-model with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use AtesiT/osint-stylometry-model with sentence-transformers:
from sentence_transformers import SentenceTransformer model = SentenceTransformer("AtesiT/osint-stylometry-model") sentences = [ "Это счастливый человек", "Это счастливая собака", "Это очень счастливый человек", "Сегодня солнечный день" ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [4, 4] - Notebooks
- Google Colab
- Kaggle
- 🕵️ OSINT Stylometry & Author Attribution Model
- 📑 Содержание
- 📖 О проекте
- 🎯 OSINT: практическое применение
- 1. Деанонимизация владельцев Telegram-каналов и форумных аккаунтов
- 2. Атрибуция утечек данных и дампов конкретным группировкам (CTI / Threat Intelligence)
- 3. Обнаружение компрометации аккаунта и симулированного стиля
- 4. Верификация независимости анонимных источников и информаторов
- 5. Судебная лингвистика и цифровая форензика
- 🧠 Как это работает (теория)
- 🏗️ Архитектура модели
- 📊 Метрики качества текущей версии (v12)
- 📈 Визуализация результатов
- 📦 Установка
- 🚀 Быстрый старт (Quickstart)
- 🛠️ Продвинутое использование
- ⚡ Инференс через ONNX (CPU, миллисекунды)
- ⚖️ Сравнение с альтернативными подходами
- ⚠️ Ограничения модели
- 🛡️ Этика и ответственное использование
- 📋 История версий (Changelog)
- 🤝 Как внести вклад
- 📚 Цитирование
- ❓ Часто задаваемые вопросы
- 📄 Лицензия
- 📑 Содержание
🕵️ OSINT Stylometry & Author Attribution Model
Нейросетевая модель для определения авторства текста по стилю письма: опечаткам, пунктуации,
сленгу, эмодзи и языковым смесям.
Создана для задач OSINT · Threat Intelligence · Cyber Threat Attribution · Форензика.
Текущая версия модели: v11.1 · Отчёт сгенерирован: 2026-08-30 18:11
📑 Содержание
- О проекте
- Ключевые возможности
- OSINT: практическое применение
- Как это работает (теория)
- Архитектура модели
- Метрики качества
- Визуализация результатов
- Установка
- Быстрый старт
- Продвинутое использование
- Инференс через ONNX (CPU, миллисекунды)
- Сравнение с альтернативными подходами
- Ограничения модели
- Этика и ответственное использование
- Дорожная карта (Roadmap)
- История версий (Changelog)
- Как внести вклад
- Цитирование
- FAQ
- Лицензия
📖 О проекте
OSINT Stylometry Model — это дообученный энкодер на базе архитектуры Sentence-BERT (Siamese Network), который преобразует произвольный текст (пост, комментарий, сообщение в чате, реплику на форуме) в компактный числовой вектор — так называемый «стилистический отпечаток» (stylistic fingerprint).
Главная идея: два текста, написанных одним и тем же человеком, будут иметь высокую косинусную схожесть векторов, даже если они посвящены совершенно разным темам. И наоборот — тексты разных авторов будут располагаться в векторном пространстве далеко друг от друга, даже если темы совпадают.
Модель специально обучена игнорировать содержание текста и фокусироваться исключительно на форме: пунктуационных привычках, характерных опечатках, любимых жаргонизмах, паттернах использования эмодзи, смешении языков (русский + английский сленг, транслит, leetspeak) и типичной длине предложений. Именно эти признаки психолингвисты и криминалисты называют идиолектом — уникальной речевой манерой человека, которую крайне сложно скрыть или подделать в долгосрочной перспективе.
🎯 OSINT: практическое применение
Стилометрия — один из самых недооценённых инструментов в арсенале аналитика открытых источников. В отличие от метаданных (IP-адреса, geolocation, временные метки), стиль письма невозможно скрыть через VPN или Tor — он «утекает» в каждом сообщении, которое пишет человек. Ниже описаны ключевые сценарии применения этой модели в реальной аналитической практике.
1. Деанонимизация владельцев Telegram-каналов и форумных аккаунтов
Аналитики OSINT регулярно сталкиваются с ситуацией, когда один и тот же человек администрирует несколько «независимых» анонимных каналов, ведёт параллельные аккаунты на теневых форумах или использует разные никнеймы в разных сообществах для маскировки истинного масштаба своей деятельности. Прямые технические связи (общий IP, устройство, telephone number) часто отсутствуют или тщательно скрыты. Однако стиль письма — пунктуационные привычки, специфические опечатки, повторяющиеся жаргонизмы — остаётся практически неизменным. Сравнивая эмбеддинги постов из разных источников, модель позволяет построить граф вероятных связей между аккаунтами и приоритизировать дальнейшее расследование.
2. Атрибуция утечек данных и дампов конкретным группировкам (CTI / Threat Intelligence)
Когда в даркнете появляется очередной дамп базы данных или пост о продаже логов / доступа, аналитику Threat Intelligence важно быстро определить, стоит ли за этим уже известная группировка или новый игрок. Сопроводительные тексты («шапки» дампов, объявления о продаже, коммуникация с потенциальными покупателями) обладают устойчивым стилем. Накопив базу стилистических профилей ранее атрибутированных акторов, можно автоматически сравнивать новые публикации с этой базой и получать вероятностную оценку принадлежности к известной группе — что резко ускоряет процесс атрибуции инцидентов.
3. Обнаружение компрометации аккаунта и симулированного стиля
Если корпоративный аккаунт, аккаунт инфлюенсера или канал в Telegram скомпрометирован, стиль публикуемых сообщений часто резко меняется: исчезают характерные опечатки, меняется пунктуационная манера, появляется несвойственный автору сленг или, наоборот, излишне «правильный» текст, типичный для мошеннических шаблонов. Модель может использоваться как система раннего оповещения (early warning system), непрерывно сравнивающая новые сообщения с историческим профилем автора и подсвечивающая аномальные отклонения ещё до того, как содержание сообщения станет очевидно подозрительным.
4. Верификация независимости анонимных источников и информаторов
При работе с несколькими анонимными источниками информации критически важно понимать, не является ли один и тот же человек автором нескольких «независимых» вбросов, созданных для придания информации видимости консенсуса (эффект множественного подтверждения). Стилометрический анализ позволяет выявить такие скрытые связи ещё до содержательной фактчекинг-проверки, экономя время аналитика и снижая риск манипуляции через фабрикованный консенсус источников.
5. Судебная лингвистика и цифровая форензика
В делах, связанных с кибербуллингом, вымогательством, угрозами или мошенничеством, стилометрическая модель может использоваться как вспомогательный количественный инструмент для экспертизы авторства анонимных сообщений. Она не заменяет классическую судебную лингвистическую экспертизу, но предоставляет объективную, воспроизводимую метрику схожести, которая может служить отправной точкой для более глубокого ручного анализа экспертом.
🧠 Как это работает (теория)
В основе модели лежит подход Siamese Neural Network (сиамская нейросеть) в связке с Contrastive Learning. Интуитивно это работает так:
- Энкодер (Transformer-модель) принимает на вход текст и превращает его в вектор фиксированной длины (эмбеддинг), например, размерностью 384.
- Во время обучения модель одновременно смотрит на пары текстов: либо «текст A и текст B написаны одним автором» (позитивная пара, label = 1), либо «текст A и текст C написаны разными авторами» (негативная пара, label = 0).
- Функция потерь Online Contrastive Loss «притягивает» эмбеддинги позитивных пар друг к другу в векторном пространстве и «отталкивает» эмбеддинги негативных пар друг от друга.
- После обучения на десятках тысяч таких пар модель самостоятельно учится выделять признаки, которые действительно коррелируют с авторством: пунктуацию, длину предложений, частоту опечаток, характерные слова — а не с темой текста, которая варьируется от сообщения к сообщению.
- На инференсе для сравнения двух новых, никогда не виденных текстов достаточно посчитать косинусную схожесть (cosine similarity) их эмбеддингов: значение ближе к 1.0 означает высокую вероятность общего авторства, ближе к 0.0 (или отрицательное) — разных авторов.
Отдельное внимание в этом проекте уделено adversarial-обучению: часть тренировочных пар — это намеренно «замаскированные» тексты, где стиль автора A искусственно подмешан в текст, изначально написанный в стиле автора B. Это заставляет модель не полагаться на поверхностные, легко подделываемые признаки (например, наличие конкретного эмодзи), а искать более глубокие, устойчивые стилистические закономерности.
🏗️ Архитектура модели
| Параметр | Значение |
|---|---|
| Базовая модель | sentence-transformers/all-MiniLM-L6-v2 |
| Тип задачи | Sentence Embedding / Metric Learning |
| Метод обучения | Siamese Network + Online Contrastive Loss |
| Ускорение обучения | Mixed Precision (fp16), GPU NVIDIA T4 |
| Размерность эмбеддинга | 384 |
| Максимальная длина последовательности | 128 токенов |
| Формат для продакшена | PyTorch (.bin / .safetensors) + ONNX (onnx/model.onnx) |
| Стадии обучения | v1.0 (базовый стиль) → v2.0 (сленг/опечатки/эмодзи) → v3.0 (adversarial siamese) → v3.x (дообучение) |
Репозиторий также хранит версионированные чекпоинты каждой стадии обучения в папке
checkpoints/vX.X/, что позволяет откатиться к любой предыдущей версии модели при необходимости.
📊 Метрики качества текущей версии (v12)
| Метрика | Значение | Пояснение |
|---|---|---|
| Accuracy | 0.6716 | Доля верно классифицированных пар «тот же автор / разные авторы» |
| F1-Score | 0.7211 | Гармоническое среднее precision и recall (устойчиво к дисбалансу классов) |
| ROC-AUC | 0.9432 | Способность модели ранжировать пары по вероятности общего авторства |
| Adversarial Robustness | 0.3173 | Средняя схожесть оригинал↔замаскированный текст (чем ниже — тем лучше) |
📈 Визуализация результатов
Динамика функции потерь по стадиям обучения
График показывает, как снижается ошибка модели (train/val loss) на каждой из последовательных стадий обучения (v1.0 → v2.0 → v3.0 → ...). Стабильное снижение val_loss без резкого расхождения с train_loss говорит об отсутствии переобучения.
Матрица ошибок (Confusion Matrix)
Показывает количество верных и ошибочных предсказаний модели в разрезе двух классов: «один автор» и «разные авторы», при фиксированном пороге классификации 0.5.
ROC-кривая
Демонстрирует компромисс между True Positive Rate и False Positive Rate при различных порогах классификации. Площадь под кривой (AUC) — интегральная метрика качества ранжирования.
2D-карта стилистических кластеров авторов (t-SNE)
Каждая точка — эмбеддинг одного сообщения, спроецированный из 384-мерного пространства в 2D с помощью t-SNE. Цвет точки соответствует ID автора. Чёткое разделение на визуальные кластеры — наглядное подтверждение того, что модель научилась различать авторов по стилю, а не по теме сообщения.
Устойчивость к маскировке стиля (Adversarial Robustness)
Метрика показывает, насколько сильно меняется эмбеддинг текста при попытке «перерисовать» его в чужом стиле. Низкое значение косинусной схожести между оригиналом и замаскированной версией говорит о том, что модель устойчива к простым попыткам имитации чужой манеры письма.
📦 Установка
Модель совместима с библиотекой sentence-transformers (рекомендуется) или напрямую с transformers.
pip install sentence-transformers
Либо, если вы планируете использовать «сырой» transformers API или ONNX-инференс:
pip install transformers onnxruntime torch
🚀 Быстрый старт (Quickstart)
Самый простой способ проверить, написаны ли два текста одним автором:
from sentence_transformers import SentenceTransformer, util
# Загружаем модель прямо с Hugging Face Hub (веса скачаются автоматически и закэшируются)
model = SentenceTransformer("AtesiT/osint-stylometry-model")
text_a = "го глянем новый дамп там что-то интересное было"
text_b = "го посмотрим свежий слив вроде движуха там движется"
text_c = "Добрый день, направляю вам отчёт по итогам квартала."
# Кодируем все тексты в векторы одним вызовом
embeddings = model.encode([text_a, text_b, text_c], convert_to_tensor=True)
# Считаем косинусную схожесть между парами
sim_ab = util.cos_sim(embeddings[0], embeddings[1]).item()
sim_ac = util.cos_sim(embeddings[0], embeddings[2]).item()
print(f"Схожесть A-B (ожидаем высокую, похожий стиль): {sim_ab:.3f}")
print(f"Схожесть A-C (ожидаем низкую, разный стиль): {sim_ac:.3f}")
🛠️ Продвинутое использование
Кластеризация большого набора сообщений по вероятному авторству
from sentence_transformers import SentenceTransformer
from sklearn.cluster import AgglomerativeClustering
import numpy as np
model = SentenceTransformer("AtesiT/osint-stylometry-model")
messages = [
"го глянем новый дамп там что-то интересное было",
"заказал пиццу и весь вечер кодил лол",
"го посмотрим свежий слив вроде движуха там движется",
"Добрый день, направляю вам отчёт по итогам квартала.",
"Коллеги, прошу ознакомиться с материалами до пятницы.",
]
embeddings = model.encode(messages, convert_to_numpy=True, normalize_embeddings=True)
# Иерархическая кластеризация по косинусному расстоянию —
# помогает автоматически сгруппировать сообщения по вероятному автору
clustering = AgglomerativeClustering(
n_clusters=None,
distance_threshold=0.4,
metric="cosine",
linkage="average",
)
labels = clustering.fit_predict(embeddings)
for msg, label in zip(messages, labels):
print(f"[Кластер {label}] {msg}")
Использование через «сырой» transformers API (без sentence-transformers)
import torch
from transformers import AutoTokenizer, AutoModel
import torch.nn.functional as F
tokenizer = AutoTokenizer.from_pretrained("AtesiT/osint-stylometry-model")
model = AutoModel.from_pretrained("AtesiT/osint-stylometry-model")
def mean_pooling(model_output, attention_mask):
# Усредняем токен-эмбеддинги с учётом маски внимания (стандартный pooling для SBERT)
token_embeddings = model_output[0]
mask = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
return torch.sum(token_embeddings * mask, 1) / torch.clamp(mask.sum(1), min=1e-9)
texts = ["пример первого текста", "пример второго текста для сравнения"]
encoded = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
output = model(**encoded)
embeddings = mean_pooling(output, encoded["attention_mask"])
embeddings = F.normalize(embeddings, p=2, dim=1)
similarity = torch.matmul(embeddings[0], embeddings[1])
print(f"Косинусная схожесть: {similarity.item():.3f}")
⚡ Инференс через ONNX (CPU, миллисекунды)
Для продакшен-сценариев, где недоступен GPU или важна минимальная задержка (например, real-time
скоринг сообщений в потоке мониторинга), модель экспортирована в формат ONNX и лежит в папке
onnx/ репозитория.
import onnxruntime as ort
from transformers import AutoTokenizer
import numpy as np
from huggingface_hub import hf_hub_download
REPO_ID = "AtesiT/osint-stylometry-model"
# Скачиваем onnx-модель и токенизатор из репозитория
onnx_path = hf_hub_download(repo_id=REPO_ID, filename="onnx/model.onnx")
tokenizer = AutoTokenizer.from_pretrained(REPO_ID, subfolder="onnx")
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
def encode_onnx(texts):
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="np", max_length=128)
outputs = session.run(None, {
"input_ids": inputs["input_ids"],
"attention_mask": inputs["attention_mask"],
})
last_hidden = outputs[0]
mask = inputs["attention_mask"][..., None]
pooled = (last_hidden * mask).sum(1) / np.clip(mask.sum(1), 1e-9, None)
norm = pooled / np.linalg.norm(pooled, axis=1, keepdims=True)
return norm
emb = encode_onnx(["текст один", "текст два"])
cos_sim = float(np.dot(emb[0], emb[1]))
print(f"ONNX cosine similarity: {cos_sim:.3f}")
На CPU (без GPU) инференс одного сообщения через ONNX Runtime занимает, как правило, единицы–десятки миллисекунд, что делает модель пригодной для встраивания в высоконагруженные пайплайны мониторинга без необходимости содержать GPU-инфраструктуру.
⚖️ Сравнение с альтернативными подходами
| Подход | Учитывает стиль | Учитывает содержание | Требует разметки | Скорость инференса |
|---|---|---|---|---|
| Ручной анализ лингвиста-эксперта | ✅ Высокая точность | ✅ | ❌ Не требует | 🐢 Очень медленно |
| Классический TF-IDF + классификатор | ⚠️ Частично (через n-граммы) | ✅ Сильная зависимость | ✅ Требуется | ⚡ Быстро |
| Общая языковая модель (semantic embedding) | ❌ Слабо, фокус на смысле | ✅ Сильно | ❌ Zero-shot возможен | ⚡ Быстро |
| Данная модель (stylometry siamese) | ✅ Основной фокус | ⚠️ Специально подавлено | ⚠️ Синтетическая авто-разметка | ⚡⚡ Быстро (+ONNX) |
Ключевое отличие этой модели от универсальных text-embedding моделей (таких как исходная
all-MiniLM-L6-v2) в том, что она дообучена намеренно подавлять сигнал темы сообщения и усиливать
сигнал стиля — благодаря чему её эмбеддинги остаются стабильными даже при резкой смене тематики
переписки одного и того же автора.
⚠️ Ограничения модели
- Синтетические данные. Модель обучена преимущественно на синтетически сгенерированных текстах, имитирующих стилистические маркеры (сленг, опечатки, эмодзи). Реальные тексты могут содержать более тонкие и разнообразные стилистические признаки, не охваченные генератором.
- Короткие тексты. При длине сообщения менее 5–7 слов стилистического сигнала может быть недостаточно для надёжного сравнения — рекомендуется агрегировать несколько сообщений одного автора.
- Целенаправленная имитация стиля профессионалом. Хотя модель устойчива к простой маскировке (см. Adversarial Robustness), целенаправленная и качественная имитация стиля другого человека экспертом-лингвистом может снизить точность атрибуции.
- Не заменяет юридическую экспертизу. Результаты модели носят вероятностный, вспомогательный характер и не должны использоваться как единственное доказательство в судебных или иных официальных разбирательствах.
- Языковой охват. Модель ориентирована преимущественно на русскоязычный текст со вставками английского сленга; качество на других языковых парах не гарантируется без дополнительного дообучения.
🛡️ Этика и ответственное использование
Технологии атрибуции авторства обладают значительным потенциалом двойного назначения. Мы призываем использовать эту модель исключительно в законных целях: расследование киберпреступлений, Threat Intelligence, корпоративная безопасность, журналистские расследования, академические исследования в области компьютерной лингвистики.
Запрещено и настоятельно не рекомендуется использовать модель для: преследования частных лиц, нарушения права на анонимность добросовестных источников информации (например, разоблачителей — whistleblowers), политических репрессий или любых форм незаконного наблюдения. Всегда действуйте в соответствии с применимым законодательством о защите персональных данных и регламентами организации.
📋 История версий (Changelog)
| Дата | Версия | Accuracy | F1-Score | Изменения в датасете / Архитектуре |
|---|---|---|---|---|
| 2026-08-30 18:10 | v12 | 0.6716 | 0.7211 | Обновление синтетических данных и дообучение модели |
🤝 Как внести вклад
Проект развивается итеративно в Google Colab. Если вы хотите предложить улучшения:
- Форкните репозиторий модели на Hugging Face Hub или изучите структуру ноутбука.
- Расширьте генератор синтетических данных новыми стилистическими маркерами.
- Опишите изменение и, при возможности, приложите метрики до/после.
- Откройте обсуждение (Discussion) в репозитории модели на Hugging Face Hub.
📚 Цитирование
Если вы используете эту модель в исследовании или продукте, пожалуйста, укажите ссылку на репозиторий:
@misc{osint_stylometry_model,
title = {OSINT Stylometry and Author Attribution Model},
author = {AtesiT},
year = {2026},
howpublished = {\url{https://huggingface.co/AtesiT/osint-stylometry-model}},
note = {Siamese Sentence-Transformer, дообученный для задач стилометрической атрибуции авторства}
}
❓ Часто задаваемые вопросы
Вопрос: Может ли модель определить автора текста «с нуля», без предварительно собранной базы? Нет. Модель определяет схожесть двух и более текстов, а не «имя» автора. Для практического применения необходима база текстов с уже известным (или предполагаемым) авторством, с которой сравнивается новый текст.
Вопрос: Какой минимальный объём текста нужен для надёжного сравнения? Рекомендуется использовать сообщения длиной от 15–20 слов, либо агрегировать несколько коротких сообщений одного автора в один пример для более стабильного эмбеддинга.
Вопрос: Работает ли модель с текстами не на русском языке? Модель ориентирована на русскоязычные тексты с англоязычными сленговыми вставками. Для других языков рекомендуется дообучение.
Вопрос: Как часто обновляется модель? Модель дообучается итеративно в рамках отдельных сессий Colab; актуальная версия и метрики всегда отражены в разделе Changelog выше.
Вопрос: Можно ли использовать модель офлайн, без интернета?
Да — после первого скачивания весов через from_pretrained они кэшируются локально; также доступна
полностью автономная ONNX-версия для offline CPU-инференса.
📄 Лицензия
Данный проект распространяется под лицензией MIT. Вы можете свободно использовать, модифицировать и распространять модель и код при условии сохранения указания на первоисточник и соблюдения раздела «Этика и ответственное использование».
- Downloads last month
- 53
Evaluation results
- Accuracyself-reported0.672
- F1 Scoreself-reported0.721
- ROC AUCself-reported0.943




