# 検証データ一式：AIっぽい文章の特徴

記事: https://debatecross.com/notes/ai-like-writing-features （DebateCross 検証ノート、2026 年 10 月の実験）

Claude Sonnet 5.5・GPT-6.1 Sol・Gemini 3.8 Flash に、12 お題 × 2 条件 × 各 5 回で書かせた日本語の文章 360 本と、文章ごとの数値、集計と図のプログラムです。OpenRouter 経由、温度などは各社の既定、出力上限は 3,000 トークン。生成は 2026 年 10 月 31 日、API 実費は合計 $2.961218 でした。

引用・再利用の際は、出典として記事の名前と URL を明記してください。AI の出力は、内容の正確さを保証しません。これは AI が書いたかどうかを判定するためのデータではありません。

## ファイル

| ファイル | 中身 |
| --- | --- |
| `texts.jsonl` | AI の文章 360 本。1 行 1 本。生成時のメタデータを含む |
| `topics.jsonl` | お題 12 本。`questionId`・`genre`・`prompt` |
| `instruction-natural-v1.md` | natural 条件で、お題の後ろに空行を挟んで足した 1 文 |
| `per-text-ai-360.csv` | AI 360 本の各指標（v1.1）と、記事集計の補助列 |
| `per-text-human-full.csv` | 本文だけにした人の文章 18 本の各指標（全文・v1.1） |
| `per-text-human-600.csv` | 同じ 18 本の冒頭約 600 字版の各指標（v1.1） |
| `results-v1/human-clean-rules.csv` | 本文以外を削除した行番号と理由。書き換え・追加・並べ替えはしていない。h19 は削除後 382 字で除外した 1 本で、数値 CSV に含めない |
| `results-v1/article-counts.md` | 定型句を含む本数（v1）、書式の本数・平均・範囲・出どころの件数（v1.1）、図の実例の数値 |
| `results-v1/analysis-v1.1.md` | 人 18 本との比較、条件別の平均・差と 95% 区間。分類は従来の全本標準化 |
| `results-v1/analysis-loto-train-only-v1.md` | 伏せたお題を標準化からも除いた分類（v1）。229/360 = 63.6% |
| `results-v1/analysis-loto-train-only-v1.1.md` | 同じ方法の分類（v1.1）。234/360 = 65.0% |
| `results-v1/summary-ai-360.md`・`results-v1/per-text-ai-360.csv` | 生成前固定の v1 による AI の集計と各本の数値。225/360 = 62.5% の結果 |
| `results-v1/historical-human-counts.md` | 本文化前19本と本文化後18本の変動係数の平均・丸めの再確認。旧全文0.644736842105は2桁では0.64（表示0.645からの二重丸めに注意） |
| `results-v1/false-positive-rates-v1.csv` | v1 の主な 12 項目を目で確かめた件数と誤検出率（AI 240 件、人 128 件）。本文の抜粋は含まない |
| `tools/ai_style_count.py` | 正規表現・文分割・指標の式の正本 |
| `tools/analyze_v1.py` | お題単位の交差検証、ブートストラップ区間、差の集計 |
| `tools/article_counts.py` | 記事に載せる本数と平均。数値 CSV からも再現できる |
| `tools/make_figures.py` | 人の本文を使わず、公開 CSV からも 2 枚の SVG を作れる |
| `tools/gen_texts.py` | AI の生成プログラム。既定では計画を表示するだけ |
| `tools/html_to_text.py` | ai_style_count.py・analyze_v1.py の HTML 入力用の補助。公開データの再集計には HTML は不要 |
| `figures/aistyle-cv.svg`・`figures/aistyle-example.svg` | 文章ごとの変動係数の点図、AI の実例 1 本の文長の棒図 |

`texts.jsonl` の列: `id`（お題・モデル・条件・回の組）、`questionId`、`genre`、`model`、`condition`、`runIndex`（0〜4）、`text`、`finishReason`、`servedModel`、`provider`、`inputTokens`、`outputTokens`、`costUsd`、`elapsedMs`、`at`（タイムゾーン付き生成日時）。`condition` は plain（お題だけ）／natural（自然な日本語で、の指示を追加）。全本 `finishReason=stop` です。

人の CSV の識別列は `id`・`questionId`・`source_type` のみで、ほかは数値です。公開用に h01〜h18 と振り直し、元の候補番号への対応表は置いていません。行削除の規則も同じ ID を使います。行番号は本文化前の抽出テキストの 1 始まり（空行も含む）、範囲の両端を含み、空欄は削除なしです。原文がないため、削除処理そのものはこの公開データだけではやり直せません。

## 人の文章の出どころ

ChatGPT が公開される前に保存されたウェブ記事を、ブログ・解説・感想の 5 お題に限って比較しました。本文を引用・転載する目的ではなく、数値を数えるためだけに使っています。人の文章の本文・一部の文・見出しと、出典 URL・サイト名・保存版の URL は、著作権への配慮と運営判断により置いていません。出どころの種類と件数、文章ごとの数値を公開します。

| 出どころの種類 | 本数 |
| --- | ---: |
| 個人ブログ・note | 7 |
| 企業・店舗・団体のサイト | 6 |
| 例文サイト | 2 |
| 報道・公的機関 | 2 |
| その他 | 1 |
| 合計 | 18 |

お題別: 在宅勤務（s01）4 本、ランニング（s02）4 本、降水確率（s03）3 本、野菜の保存（s04）3 本、『走れメロス』の感想（s11）4 本。AI の同じ 5 お題は各モデル 50 本（各条件 25 本）です。

## 再集計のしかた

Python 3 の標準ライブラリだけで動きます。以下は、この README のあるディレクトリで実行します。人の本文や API キーは不要です。`out/` に出すので、配布した結果は上書きしません。

```bash
python3 -I tools/article_counts.py --ai texts.jsonl --human-csv per-text-human-full.csv --human-600-csv per-text-human-600.csv --out out/article-counts.md
python3 -I tools/analyze_v1.py --ai texts.jsonl --markers v1.1 --human-csv per-text-human-full.csv --human-600-csv per-text-human-600.csv --out out/analysis-v1.1.md
python3 -I tools/analyze_v1.py --ai texts.jsonl --markers v1 --loto-train-only --out out/analysis-loto-train-only-v1.md
python3 -I tools/analyze_v1.py --ai texts.jsonl --markers v1.1 --loto-train-only --out out/analysis-loto-train-only-v1.1.md
python3 -I tools/ai_style_count.py texts.jsonl --markers v1 --out out/ai-v1 --classify
python3 -I tools/ai_style_count.py texts.jsonl --markers v1.1 --out out/ai-v1.1
python3 -I tools/make_figures.py --ai texts.jsonl --human-csv per-text-human-full.csv --out-dir out/figures
```

文章を新しく生成する場合の計画表示は次のとおりです。入力のお題や指示文は明示して渡してください。実際の生成は `--run` と環境変数 `OPENROUTER_API_KEY` が必要で、利用料がかかり、同じ文章にはなりません。キーを入力ファイルに保存しないでください。

```bash
python3 -I tools/gen_texts.py --topics topics.jsonl --instruction instruction-natural-v1.md --out out/new-texts.jsonl
```

## 指標の式と集計単位

- `chars` は空白（半角・全角空白、タブ、改行など `\s`）を除いた字数。分母は最小 1。Markdown 記号・句読点は除きません。
- P（定型句）・R（修辞）・H（ぼかし）・F（書式）は、規則に一致した回数 ÷ `chars` × 1,000 を小数第 3 位に丸めます。「本数」の表は一致が 1 回以上ある文章の数で、回数の合計とは異なります。正規表現と、行ごとに数えるか一致ごとに数えるかは `markers_for()` にあります。P10 は「ぜひ」から 20 字以内の「ください」等（改行をまたがない）。
- 文分割は `。！？!?` の直後と改行です。前後の空白と、記号だけの行を除きます。見出し・箇条書きも文に含みます。各文の長さ L は空白を除く字数です。図も同じ数え方に統一しました。
- `S01_mean_sent_len` は L の平均（小数第 2 位）、`S02_sd_sent_len` は母標準偏差（小数第 2 位）。文がないときは L=[0] とします。
- `S03_same_ending_rate` は同じ文末の型が隣接する組数 ÷ max(1, 文数−1)。文末型は規則による近似です。
- `S04_taigen_rate` は v1 だけにある残余の文末の割合。体言止めを測れていなかったため、v1.1 では削除しています。
- `S05_cv_sent_len` は L の母標準偏差 ÷ 平均、`S06_adj_len_change` は隣接する L の差の絶対値の平均 ÷ L の平均。文が 2 未満ならどちらも 0。
- `S07_para_sent_cv` は段落ごとの文数の母標準偏差 ÷ 平均。段落が 2 未満なら 0。`S08_mean_para_sents` はその文数の平均（段落がなければ 0）。段落は空行区切り、見出し（#）・箇条書き（- / * / ・ / 数字. ）だけのブロックは除きます。
- `R05_neg_then_pos` は「ではない／じゃない／ではありません／わけではない／わけではありません／だけではない／だけではありません」で終わり直後に文がある箇所数 ÷ `chars` × 1,000。次の文の意味は判定しません。S03・S05〜S08・R05 は小数第 3 位に丸めます。
- CSV の `sentence_count` は文数、`short_sentence_rate` は 15 字以下の文数 ÷ max(1, 文数)、`long_sentence_rate` は 60 字以上の同じ割合。`inline_1`〜`inline_7` は旧仮集計の検索に当たるか（0/1）で、定型句表とは定義が異なります。順は「いかがでしたか／することができ／と考えられ・と思われ／と言えるでしょう・と言えます／結論から言うと・結論として／重要・大切・鍵です／ぜひ」。式は `article_counts.py` の `INLINE` を参照。
- 群の平均は文章を等重みで平均。変動係数を全文をつないで算出するわけではありません。600 字版は空白を除いて 600 字を超えた最初の文末または改行まで（600 字以下の本文は全文）。

## 分類と区間の読み方

分類は最近傍重心です。各特徴を z=(値−平均)÷母標準偏差（標準偏差 0 は分母 1）にし、各モデルの訓練側の重心からユークリッド距離が最も近いモデルを予測します。`chars` は分類に使いません。お題を 1 つずつ抜いて 12 回判定します。従来の全本標準化と、標準化も訓練側 11 お題に限定した結果は分けて掲載しています。**63.6% は v1 の結果です。v1.1 の訓練側標準化は 65.0% でした。**

v1 は生成前固定版。v1.1 は結果を見た後に F02 の箇条書き・F06 のコロンの誤検出を減らし、F05 を区切り線と文中ダッシュに分け、S04 を削除した版です。F07・R05 は名称だけを修正。全本標準化では v1 が 62.5%、v1.1 が 65.6% です。

区間は seed=20261101、2,000 回のパーセンタイル・ブートストラップ。2.5・97.5 パーセンタイルを位置 (n−1)p で線形補間します。Q1 は予測を固定し、12 お題を復元抽出して正解率を集計。Q2・Q3 は 12 お題を復元抽出し、選ばれたお題の全本を投入。人との比較は 5 お題を復元抽出し、その出現ごとにお題×群内の文章も元と同数だけ復元抽出します。差の両辺で同じお題抽出を共有します。多重比較の補正はなく、表の＊は丸め前の区間が 0 を含む印です。

## 限界

日本語・約 600 字・12 お題・各社 1 モデルの結果です。別のモデル、長さ、指示やアプリの出力にはそのまま当てはまりません。正規表現は文脈を読まず、引用や用語の鉤括弧も数えます。修正版の誤検出率は再評価していません。

人の 18 本は AI と同じ指示で書かれたものではなく、年代・媒体・書き手・編集条件もそろっていません。人との比較と区間は探索的です。原文と出典を非公開にしているため、独立に確認できるのは公開数値からの集計と AI の再計数までです。人の原文の採用・抽出・計数そのものは追試できません。読みやすさや「AI らしく感じるか」を人に評価してもらった実験ではありません。
