Markdownの「リズム」(文長の揺れ・段落構造・burstiness)を計測し、実測分布と照合するCLIです。あなたの文章が人間分布のどこに位置するかをパーセンタイルで示し、AI方向の単調化を検出します。日本語(7 LLM×350文書 vs 人間696記事)に加え、v0.2.0から英語・ポルトガル語(各7 LLM×約350文書 vs 人間853/403記事)に対応しました。
Evidence-calibrated rhythm meter for Japanese, English, and Portuguese prose. Measures interpretable rhythm metrics and locates your document on measured human/AI distributions from the paper "Lexical and Rhythmic Fingerprints of Japanese LLM-Generated Text" (DOI: 10.5281/zenodo.21413035) and its cross-lingual follow-up "Rhythmic Monotonization in LLM-Generated Text Is Cross-Lingual" (DOI: 10.5281/zenodo.21424903). Not an AI detector — a writing feedback instrument.
しきい値は感覚値ではありません。全指標のしきい値・分布・効果量は、公開済み論文の実測データから凍結生成しています。
- 人間側: LLM以前(2020〜2022年)のQiita/Zenn技術記事696本
- AI側: 7 LLM(Claude 3 Haiku / Sonnet 4 / Opus 4 / GPT-3.5 Turbo / GPT-4o / GPT-OSS 20B / Llama 3.2 1B)の生成350文書
- 論文の主結果: リズムの単調化は全7モデル共通(burstiness Cohen's d = −0.96)。方向はモデル普遍、程度はモデル依存
| 中核指標 | AI方向 | Cohen's d |
|---|---|---|
| burstiness(文字) | 低い=単調 | −0.96 |
| burstiness(モーラ) | 低い=単調 | −0.80 |
| 段落あたり文数のCV | 低い=均質 | −0.67 |
| 文長CV(文字) | 低い=単調 | −0.56 |
pipx install git+https://github.com/kenimo49/rhythm-lens
# または
pip install git+https://github.com/kenimo49/rhythm-lens依存はMeCab(mecab-python3 + unidic-lite、日本語用)とpyphen(EN/PT音節近似用)のみ。LLM・ネットワーク不要、完全ローカルで決定的に動きます。
rhythm-lens article.mdarticle.md — 90文 / 31段落 (地の文 85文)
指標 値 人間分布での位置 判定
burstiness (文字) -0.291 下位35%
burstiness (モーラ) -0.323 下位20% ⚠ AI方向 (AI中央値 -0.354)
段落あたり文数のCV 0.432 下位14% ⚠ AI方向 (AI中央値 0.471)
文長CV (文字) 0.549 下位35%
...
総合: ⚠ 中核4指標のうち2つがAI方向です (単調化の兆候)
→ 音数の振れ幅を大きく (読み上げたときの拍で変化をつける)
→ 段落サイズを揃えすぎない (1文段落や長い段落を混ぜる)
根拠: 人間696記事×AI 350文書の実測分布 (Imoto 2026, DOI 10.5281/zenodo.21413035)
--allで全指標を表示(日本語12指標 / EN・PT 14指標)--jsonでCI/エディタ連携向けの機械可読出力--lang ja|en|ptで言語を明示指定(省略時はファイルごとに自動判定。判定結果はレポート先頭に表示され、誤判定時は--langで上書きできます)
リズム単調化が言語横断で成立することを確認したcross-lingual実験(exp029、論文準備中)の実測分布を、日本語版と同じ方式で凍結同梱しています。
| 人間コーパス | AIコーパス | |
|---|---|---|
| EN | Dev.to 人気技術記事 853本(2019-01〜2022-10、pre-ChatGPT) | 7 LLM × 349文書 |
| PT-BR | TabNews 投稿 403本(2022-05〜2022-11、pre-ChatGPT) | 7 LLM × 348文書 |
AIモデルは claude-haiku-4-5 / claude-sonnet-5 / claude-opus-4-8 / GPT-3.5 Turbo / GPT-4o / GPT-OSS 20B / Llama 3.2 1B(日本語版のClaude 3系3モデルはAPI引退のため現行3ティアで代替)。
中核4指標は日本語版と対称です(モーラ→音節。音節はpyphenのハイフネーション位置による近似)。
| 中核指標 | AI方向 | EN Cohen's d | PT Cohen's d |
|---|---|---|---|
| burstiness(文字) | 低い=単調 | −1.12 | −1.03 |
| burstiness(音節) | 低い=単調 | −1.12 | −0.95 |
| 段落あたり文数のCV | 低い=均質 | −0.54 | −0.34 |
| 文長CV(文字) | 低い=単調 | −1.06 | −0.99 |
正直に書いておくと、段落あたり文数のCVはEN/PTでは効果が弱いです(pooled d: EN −0.54 / PT −0.34。日本語は−0.67)。EN/PTでこの指標のフラグは他の3指標より軽く受け取ってください。burstinessと文長CVは3言語とも全7モデルで方向一致(d<0)です。
日本語固有の指標(体言止め率・「ではなく」率・モーラ系列)はEN/PTにはありません。代わりに語数ベースのburstiness(語)・文長CV(語)が参考表示されます。カンマ/文は言語で符号が逆転する(EN: AIが多い / PT: AIが少ない)ため、方向を仮定しない参考指標です。
論文の結論そのままです: 人間/AI検出に効くのは語彙(AUC 0.998)で、リズムは0.897どまり。しかもリズム信号の相当部分は文書長の差に乗っています。rhythm-lensはAI判定のためのツールとしては設計していません。
リズム指標の価値は別のところにあります。少数で、人間が読めて、全モデル共通に効き、書き手が行動に移せる(「文の長短を揺らす」は実行できるが「800字の中で特定の語の頻度を下げる」は実行できない)。だからこれは検出器のふりをしない、執筆フィードバックの計測器です。
本ツールの起点は coji/natural-japanese(MIT)です。「AI臭は語彙よりリズムに出る」という同プロジェクトの観察が論文の出発点になり、burstiness・モーラ近似・文分割の定義は同プロジェクトの方式に準拠しています。
| natural-japanese | rhythm-lens | |
|---|---|---|
| 形態 | Agent Skill(LLMが読んで直す) | 決定的CLI(LLM不使用) |
| 主目的 | 文章を直す | 測って根拠を示す |
| しきい値 | 実務観察ベース | 論文実測分布(パーセンタイル) |
立ち位置は競合というより計測層です。natural-japaneseで直す前後にrhythm-lensで測る、という併用を想定しています。
- 判定は技術ブログのレジスタで校正されています。小説・詩・チャットログでは分布が異なります
- EN人間分布はDev.toの技術記事レジスタ、PT人間分布はTabNews(技術記事とフォーラム的な議論投稿が混ざる)で校正されています。同じ「技術系」でもQiita/Zenn(JA)とはレジスタが異なるため、言語間のパーセンタイル値を直接比較しないでください
- 5文未満の文書は判定対象外(論文と同じ最小文数)
- YAML frontmatterは計測前に除去します(論文コーパスにはfrontmatterが無いため、この点のみ論文の前処理への追加です)
- モーラ数(JA)はUniDic読みからの近似で、英語混じり文では過小になります(文字ベース指標と併読してください)
- 音節数(EN/PT)はpyphenのハイフネーション近似です。単音節語の連続などで実音節数とずれることがあります
- EN/PTの文分割は略語ガード付きregexです。文末が略語で終わるケース("..., etc. The next ...")は次の文と結合されます
- 言語自動判定は簡易ヒューリスティクス(日本語文字比率 / PT固有語・ダイアクリティクス)です。コード片が支配的な文書などで誤判定したら
--langで指定してください - EN/PTの段落あたり文数のCVは効果量が弱い指標です(前節参照)
src/rhythm_lens/data/baseline.json は論文リポジトリ llm-text-fingerprints-ja の公開CSVから scripts/build_baseline.py で決定的に再生成できます。計測コードは論文の rhythm_metrics.py と同一定義で、論文CSVとの数値一致を検証済みです。
baseline_en.json / baseline_pt.json はcross-lingual実験(exp029)の実測CSV(rhythm_metrics_en.csv / rhythm_metrics_pt.csv)から scripts/build_baseline_latin.py で決定的に生成しています。計測コード metrics_latin.py はexp029の rhythm_metrics_ml.py と同一定義です。生成元と生成方法は各JSONの note フィールドにも記録してあります。exp029のデータは論文公開時にあわせて公開予定です。
- 英語・ポルトガル語対応(
--lang ja|en|pt+ 自動判定) metrics_latin.py(exp029の計測モジュールと同一定義)とbaseline_en.json/baseline_pt.jsonを追加- 依存にpyphenを追加(EN/PT音節近似)
- 日本語の計測・判定は v0.1.0 と同一(baseline.json / metrics.py は無変更)
- 初版。日本語12指標、論文実測分布(人間696記事×AI 350文書)との照合
@misc{imoto2026fingerprints,
title={Lexical and Rhythmic Fingerprints of Japanese LLM-Generated Text: A Cross-Model, Two-Layer Analysis},
author={Imoto, Ken},
year={2026},
doi={10.5281/zenodo.21413035}
}MIT