humanizer-ru 3.22.0 → 3.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
Claude Code / Cowork plugin. Kills AI smell in Russian text. The English [humanizer](https://github.com/blader/humanizer) won't help here. Russian AI markers are their own beast: bureaucratic noun-chains (канцелярит), English-syntax calques, missing particles like "же" and "ведь" that make Russian sound alive.
|
|
6
6
|
|
|
7
7
|
[](LICENSE)
|
|
8
|
-
[](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
|
|
9
9
|
[](https://github.com/ilyautov/humanizer-ru/stargazers)
|
|
10
10
|
[](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru)
|
|
11
11
|
[](https://www.npmjs.com/package/humanizer-ru)
|
|
@@ -44,6 +44,8 @@ Claude.ai, DeepSeek Harness and team rollout are covered in [Install](#install).
|
|
|
44
44
|
|
|
45
45
|
The [site's front page](https://humanizer-ru.aifrontier.tech/#audit) runs the same scanner in JavaScript: paste a text, get a 0-100 cleanliness score, highlighted markers and the install command for your agent. Everything runs in the browser, nothing is uploaded. Rules are exported from `markers.py` by `scripts/export_web_rules.py`; `scripts/test_web_parity.py` keeps the web and Python engines in step in CI.
|
|
46
46
|
|
|
47
|
+
The same scanner ships as a Chrome extension: select text on any page, pick "Проверить на следы нейросети" in the context menu, and the popup shows the score and highlights. Two permissions only, context menu and local storage; no host access, no network. Source in `extension/`, built by `scripts/build_extension.py`; until the Web Store listing is live, load it via `chrome://extensions` → Developer mode → Load unpacked.
|
|
48
|
+
|
|
47
49
|
## Install
|
|
48
50
|
|
|
49
51
|
Three deployment channels: upload to Claude.ai web UI, roll out across an organization, or install into local agents (Claude Code, Cowork, API).
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> [English version](README.en.md) · [中文](README.zh.md)
|
|
6
6
|
|
|
7
7
|
[](LICENSE)
|
|
8
|
-
[](https://github.com/ilyautov/humanizer-ru/blob/main/CHANGELOG.md)
|
|
9
9
|
[](https://github.com/ilyautov/humanizer-ru/stargazers)
|
|
10
10
|
[](https://skills.sh/ilyautov/humanizer-ru/humanizer-ru)
|
|
11
11
|
[](https://www.npmjs.com/package/humanizer-ru)
|
|
@@ -83,6 +83,8 @@ Claude.ai, DeepSeek Harness и раскатка на команду в [разд
|
|
|
83
83
|
|
|
84
84
|
На [главной странице сайта](https://humanizer-ru.aifrontier.tech/#audit) работает тот же сканер на JavaScript: вставьте текст, получите оценку чистоты от 0 до 100, подсветку найденных оборотов и команду установки для своей среды. Считается в браузере, текст никуда не отправляется. Правила экспортируются из `markers.py` скриптом `scripts/export_web_rules.py`, а паритет с Python проверяет `scripts/test_web_parity.py` в CI.
|
|
85
85
|
|
|
86
|
+
Тот же сканер есть как расширение Chrome: выделили текст на любой странице, в контекстном меню «Проверить на следы нейросети», и попап показывает балл и подсветку. Разрешений у него два, контекстное меню и локальное хранилище, доступа к сайтам и сети нет. Папка `extension/`, сборка `scripts/build_extension.py`; пока идёт модерация в Web Store, ставится через `chrome://extensions` → «Режим разработчика» → «Загрузить распакованное расширение».
|
|
87
|
+
|
|
86
88
|
## Установка
|
|
87
89
|
|
|
88
90
|
Скилл разворачивается тремя путями: загрузкой в веб-интерфейс Claude.ai, централизованной раскаткой на команду или установкой в локальные агенты (Claude Code, Cowork, API).
|
|
@@ -245,7 +247,7 @@ dsh сканирует `~/.agents/skills` и `~/.dsh/skills` сам, перез
|
|
|
245
247
|
других регистров снимает маркеры, которые там законны:
|
|
246
248
|
|
|
247
249
|
```bash
|
|
248
|
-
python skills/humanizer-ru/scripts/scan.py статья.txt --genre academic # ещё legal, fiction
|
|
250
|
+
python skills/humanizer-ru/scripts/scan.py статья.txt --genre academic # ещё legal, fiction, news
|
|
249
251
|
python skills/humanizer-ru/scripts/scan.py стало.txt --before было.txt # чистота до/после + факт-замок
|
|
250
252
|
```
|
|
251
253
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanizer-ru",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.23.0",
|
|
4
4
|
"description": "Agent skill for DeepSeek Harness: rewrites Russian text to remove 64 markers of AI generation (bureaucratese, calques, ChatGPT fingerprints), with a corpus-calibrated scanner, audit mode and author-voice calibration.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ilya Utov",
|
|
@@ -4,7 +4,7 @@ description: "Скилл для очеловечивания русскоязы
|
|
|
4
4
|
license: MIT
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# Humanizer-RU v3.
|
|
7
|
+
# Humanizer-RU v3.23.0
|
|
8
8
|
|
|
9
9
|
Ты редактор. Превращаешь стерильный AI-текст в живую русскую речь. Убираешь маркеры нейросети и возвращаешь в текст автора: мнение, ритм, характер.
|
|
10
10
|
|
|
@@ -75,7 +75,7 @@ license: MIT
|
|
|
75
75
|
|
|
76
76
|
**Аудит** (по запросу: «проверь», «найди AI-маркеры», «что выдаёт?»). Только диагностика. Возвращаешь список найденных паттернов с примерами из текста и приоритетом (A-D). Текст не переписываешь.
|
|
77
77
|
|
|
78
|
-
> **Машинная половина аудита.** Со скиллом едет детерминированный сканер: `scripts/scan.py` рядом с этим SKILL.md (в полном клоне репозитория: `skills/humanizer-ru/scripts/scan.py`). Он точно считает то, что LLM мерит на глаз: HARD BANS, 21 категорию маркеров, ритм предложений, морфологию. Если в среде можно запускать команды и есть python3 с пакетами `razdel` и `pymorphy3`, сначала прогони текст через него: `python3 <папка скилла>/scripts/scan.py файл.txt`, либо `echo "текст" | python3 <папка скилла>/scripts/scan.py -` (флаг `--json` для машинного вывода). Текст не маркетинговый? Добавь `--genre academic`, `--genre legal` или `--genre
|
|
78
|
+
> **Машинная половина аудита.** Со скиллом едет детерминированный сканер: `scripts/scan.py` рядом с этим SKILL.md (в полном клоне репозитория: `skills/humanizer-ru/scripts/scan.py`). Он точно считает то, что LLM мерит на глаз: HARD BANS, 21 категорию маркеров, ритм предложений, морфологию. Если в среде можно запускать команды и есть python3 с пакетами `razdel` и `pymorphy3`, сначала прогони текст через него: `python3 <папка скилла>/scripts/scan.py файл.txt`, либо `echo "текст" | python3 <папка скилла>/scripts/scan.py -` (флаг `--json` для машинного вывода). Текст не маркетинговый? Добавь `--genre academic`, `--genre legal`, `--genre fiction` или `--genre news` (новости и энциклопедические статьи): флаг снимает маркеры, законные для регистра, иначе научный, юридический и новостной текст тонет в ложных срабатываниях (цифры в секции «Ложные срабатывания»). Вывод сканера бери как базу, поверх добавляй то, что скрипту не по зубам: ложные срабатывания (см. одноимённую секцию), нелексические паттерны, приоритеты A-D. Пакетов нет? Предложи пользователю однократный `pip install razdel pymorphy3` и проводи аудит по каталогу вручную. Сканер недоступен или упал: молча работай по каталогу, как обычно. Аудит обязан состояться при любом раскладе.
|
|
79
79
|
|
|
80
80
|
> **Score чистоты (0-100).** Сканер выдаёт сводную оценку `ЧИСТОТА: N/100` и полосу: 85-100 «чисто» (следы ИИ не мешают), 60-84 «точечная правка», ниже 60 «рерайт». Это не вероятность ИИ и не «детект», а агрегат уже посчитанных сигналов: хард-баны и плотность маркеров весят сильно, морфология (сущ./глаг.) и тире слабо, как корроборирующие, чтобы не занижать плотный энциклопедический или юридический текст. Плюс document-level сигналы (ровные по длине абзацы, засилье однотипных пунктов-списков) для длинных шаблонных текстов: на короткой прозе они инертны. Показывай число в начале аудита, а после переписывания давай «было N, стало M»: так правка становится измеримой. Сканер не запускался (нет python, claude.ai web)? Прикинь score по той же логике: старт 100, заметный минус за каждый хард-бан и за высокую плотность маркеров, небольшой за номинальность и обилие тире; плотный человеческий текст без AI-оборотов остаётся высоким, не занижай его. Такую прикидку подписывай явно: «≈70, оценка без сканера». Число от сканера и число на глаз в одном формате путают читателя, а измеримость правки наше главное отличие.
|
|
81
81
|
|
|
@@ -120,6 +120,7 @@ license: MIT
|
|
|
120
120
|
- **Повтор намеренный.** Анафора, рефрен, повтор для нажима («Он не пришёл. Он не позвонил. Он просто исчез.»): приём, а не синонимическая бедность.
|
|
121
121
|
- **«Является» в роли термина/определения.** В научном или юридическом тексте связка иногда обязательна. Бей бытовое «является», не трогай терминологическое.
|
|
122
122
|
- **Академический регистр целиком.** Это не смягчение, а жёсткое правило, и оно измерено. Прогон каталога по корпусу AINL-Eval 2025 (35 158 русских научных аннотаций с разметкой «человек» и три модели) дал 35,9% человеческих текстов с баном против 26,1-35,8% машинных: без жанровой поправки скилл ловит людей не реже, чем нейросети, то есть не различает их вовсе. «Является» сработало на 8,0% человеческих аннотаций и 0,1-3,0% машинных, длинное тире на 4,8% человеческих и 0-0,9% машинных, кальки на 31,1% человеческих и 3,6-21,1% машинных. С жанровой поправкой человеческие срабатывания падают до 4,2%. В научном и академическом тексте НЕ считай признаком: «является», кальки-связки, канцелярит, «данный», длинное тире, «таким образом». Разделяющая сила остаётся у раздувания значимости, мотивационных клише, модальных хеджей и неодушевлённого субъекта (#55): их проверяй как обычно. Сканер поднимает то же правило флагом: `scan.py файл.txt --genre academic` (ещё `legal` и `fiction`).
|
|
123
|
+
- **Новости и энциклопедия.** Тоже измерено, на русской части LLMTrace (1 697 человеческих и 2 080 машинных новостей и энциклопедических статей): длинное тире стоит у 37,5% человеческих текстов против 27% машинных, «данный» у 6,2% против 5%, «является» у 15,8% против 24%, канцелярит и кальки не разделяют классы. Строгий режим ловит 56% людей и 59% машин, то есть не различает их. В новостном и энциклопедическом тексте не считай признаком: «является», «данный», длинное и короткое тире, диапазон «от X до Y», канцелярит, кальки, контекстуализаторы. Разделяют там формула-выводы, модальные хеджи, раздувание значимости, «играет ключевую роль» (лифт 13), «не только X, но и Y», «таким образом». Сканер: `--genre news`.
|
|
123
124
|
- **Структура оправдана длиной.** В лонгриде на 3000 слов подзаголовки и списки нужны. Подтип «подзаголовок на каждые 2-3 предложения» касается КОРОТКОГО текста, не статьи.
|
|
124
125
|
- **Формальный регистр как требование жанра.** Деловое письмо, оффер, документ имеют право быть формальными. Канцелярит убирай, но вежливые обороты и регистр не ломай.
|
|
125
126
|
- **Гладкость от мастерства, а не от AI.** Хороший редактор тоже выравнивает текст. Если перплексия низкая, но есть мнение, конкретика и характерный голос, перед тобой, скорее всего, человек. Низкая перплексия сама по себе не улика.
|
|
@@ -190,7 +191,7 @@ license: MIT
|
|
|
190
191
|
| «Не только X, но и Y» | Калька, маркер синтетического усиления | «X. И ещё Y» или просто перечисли |
|
|
191
192
|
| «В современном мире...» | Пустое открытие #1 у всех LLM | Начни с факта или вопроса |
|
|
192
193
|
| «Стоит отметить, что...» | Калька с «It's worth noting» | Убери и скажи напрямую |
|
|
193
|
-
| «Важно
|
|
194
|
+
| «Важно понимать/помнить/отметить, что...» | Калька с «It's important to understand / remember / note» | Убери или «Тут вот что:» |
|
|
194
195
|
| «Данный» / «Данная» / «Данное» | Канцелярский маркер, всегда заменяем | «Этот» / «Эта» / «Это» |
|
|
195
196
|
| «Является» (>1 раз на 500 слов) | В русском связка «быть» в настоящем времени не нужна | Перестрой предложение |
|
|
196
197
|
| «Играет важную/ключевую роль» | Раздувание значимости, клише | Покажи ПОЧЕМУ важно через данные |
|
|
@@ -62,7 +62,7 @@ davinci-003). Метод и полные таблицы: `eval/AINL-CALIBRATION.
|
|
|
62
62
|
До: «Исследования показывают, что удалёнка повышает продуктивность.»
|
|
63
63
|
После (факты автора): «Стэнфорд гонял эксперимент два года: удалёнщики на 13% продуктивнее. У себя в команде вижу примерно то же.» (источник и цифру дал автор; нет источника: убери ссылку и утверждай от своего лица, НЕ изобретай исследование)
|
|
64
64
|
|
|
65
|
-
**3. Раздувание значимости.** Каждый факт «ключевой», каждое событие «переломное»: «играет ключевую роль», «имеет огромное значение», «невозможно
|
|
65
|
+
**3. Раздувание значимости.** Каждый факт «ключевой», каждое событие «переломное»: «играет ключевую роль», «имеет огромное значение», «невозможно переоценить», «важный шаг на пути к». Сбрось пафос. Если что-то важно, покажи почему через данные, а не прилагательные.
|
|
66
66
|
|
|
67
67
|
**4. Формульные выводы.** Заключения, которые клеятся к любому тексту: «Таким образом, можно сделать вывод...», «Подводя итог...». Вывод должен добавлять новое. Если его можно удалить без потери смысла, удали.
|
|
68
68
|
|
|
@@ -299,7 +299,7 @@ davinci-003). Метод и полные таблицы: `eval/AINL-CALIBRATION.
|
|
|
299
299
|
|
|
300
300
|
**Канцелярит-маркеры:** осуществление, реализация, внедрение, оптимизация, функционирование, взаимодействие, в рамках, в целях, в контексте, на основе, посредством, в соответствии с, внимание уделяется, внимание уделено, посвящена анализу/изучению/разработке
|
|
301
301
|
|
|
302
|
-
**Кальки-маркеры:** является, стоит отметить, важно
|
|
302
|
+
**Кальки-маркеры:** является, стоит отметить, важно понимать/помнить/отметить, можно сказать, что касается, в то время как, с другой стороны, тем не менее, несмотря на то что, исследование фокусируется на (this study focuses on)
|
|
303
303
|
|
|
304
304
|
**Раздувание-маркеры:** ключевой, важнейший, значительный, огромный, колоссальный, переломный, фундаментальный, невозможно переоценить, играет роль
|
|
305
305
|
|
|
@@ -25,7 +25,10 @@ HARD_BANS: list[tuple[str, str]] = [
|
|
|
25
25
|
("Не только X, но и Y", r"\bне\s+только\b[^.!?]{1,40}?\bно\s+и\b"),
|
|
26
26
|
("В современном мире", r"\bв\s+современном\s+мире\b"),
|
|
27
27
|
("Стоит отметить, что", r"\bстоит\s+отметить\b"),
|
|
28
|
-
(
|
|
28
|
+
# Расширен по шахте LLMTrace (русские модели против людей тех же тем):
|
|
29
|
+
# «важно помнить, что» 155 машинных документов против 3 человеческих,
|
|
30
|
+
# «важно отметить, что» 144 против 1; в AINL у людей 0 и 2 из 8 769.
|
|
31
|
+
("Важно понимать/помнить/отметить, что", r"\bважно\s+(?:понимать|помнить|отметить)\b"),
|
|
29
32
|
# Только единственное число (как в SKILL.md HARD BAN). Множественные формы
|
|
30
33
|
# «данные/данных/данным/данными» совпадают с существительным «данные» (data)
|
|
31
34
|
# и давали ложные срабатывания на ML/статистических текстах.
|
|
@@ -112,6 +115,10 @@ SCANNER: dict[str, list[str | tuple[str, str]]] = {
|
|
|
112
115
|
"Раздувание": [
|
|
113
116
|
"ключев", "важнейш", "значительн", "огромн", "колоссальн", "переломн",
|
|
114
117
|
"фундаментальн", "невозможно переоценить", "играет роль",
|
|
118
|
+
# «важный шаг (на пути) к»: LLMTrace 156 машинных документов против 3
|
|
119
|
+
# человеческих, AINL 56 против 2. «Шаг вперёд» и «большой шаг» не
|
|
120
|
+
# разделяют, в маркер не входят.
|
|
121
|
+
("важный шаг", r"\bважн\w+\s+шаг\w*"),
|
|
115
122
|
],
|
|
116
123
|
"Формула-выводы": [
|
|
117
124
|
# Вводный коннектор-вывод, суженный так же, как одноимённый хард-бан:
|
|
@@ -332,6 +339,14 @@ FREQ_BANS_NOTE = "см. комментарий выше про парный за
|
|
|
332
339
|
#
|
|
333
340
|
# Жанры legal и fiction фильтруются по тем же правилам, что записаны в разделе
|
|
334
341
|
# «Ложные срабатывания» SKILL.md; корпусной проверки под них у нас пока нет.
|
|
342
|
+
#
|
|
343
|
+
# Жанр news (новости и энциклопедические статьи) измерен на русской части
|
|
344
|
+
# LLMTrace, домены news + factual, 1 697 человеческих и 2 080 машинных
|
|
345
|
+
# документов: глушится всё, у чего лифт (доля у машин / доля у людей) ниже 1,5.
|
|
346
|
+
# Длинное тире там у 37,5% людей (лифт 0,7), «данный» у 6,2% (0,8), короткое
|
|
347
|
+
# тире у 8,0% (0,9), «является» у 15,8% (1,5), канцелярит у 14,0% (0,9), кальки
|
|
348
|
+
# у 20,1% (1,4). Строгий режим ловит 55,7% людей против 58,7% машин, то есть не
|
|
349
|
+
# различает их; с профилем news 10,1% против 20,5%. Цифры: eval/llmtrace_calibration.py.
|
|
335
350
|
GENRE_MUTED_BANS: dict[str, set[str]] = {
|
|
336
351
|
"academic": {
|
|
337
352
|
"Является", "Длинное тире", "Короткое тире", "Данный/Данная/Данное",
|
|
@@ -347,15 +362,20 @@ GENRE_MUTED_BANS: dict[str, set[str]] = {
|
|
|
347
362
|
"Не только X, но и Y",
|
|
348
363
|
"Не просто X, а Y",
|
|
349
364
|
},
|
|
365
|
+
"news": {
|
|
366
|
+
"Является", "Длинное тире", "Короткое тире", "Данный/Данная/Данное",
|
|
367
|
+
"от X до Y (ложный диапазон)",
|
|
368
|
+
},
|
|
350
369
|
}
|
|
351
370
|
|
|
352
371
|
GENRE_MUTED_CATEGORIES: dict[str, set[str]] = {
|
|
353
372
|
"academic": {"Канцелярит", "Кальки", "Контекстуализаторы", "Формула-выводы"},
|
|
354
373
|
"legal": {"Канцелярит", "Кальки", "Контекстуализаторы"},
|
|
355
374
|
"fiction": {"Параллелизмы"},
|
|
375
|
+
"news": {"Канцелярит", "Кальки", "Контекстуализаторы"},
|
|
356
376
|
}
|
|
357
377
|
|
|
358
|
-
GENRES = ("marketing", "academic", "legal", "fiction")
|
|
378
|
+
GENRES = ("marketing", "academic", "legal", "fiction", "news")
|
|
359
379
|
|
|
360
380
|
|
|
361
381
|
# --- Что проверено корпусом, а что нет ------------------------------------
|
|
@@ -75,7 +75,7 @@ def main() -> int:
|
|
|
75
75
|
"Новый факт, которого не было в исходнике, даёт exit 2")
|
|
76
76
|
ap.add_argument("--genre", choices=GENRES, default="marketing",
|
|
77
77
|
help="жанр текста: снимает маркеры, законные для регистра "
|
|
78
|
-
"(academic, legal, fiction). По умолчанию marketing: "
|
|
78
|
+
"(academic, legal, fiction, news). По умолчанию marketing: "
|
|
79
79
|
"строгий режим, под него откалиброваны пороги")
|
|
80
80
|
args = ap.parse_args()
|
|
81
81
|
|