Skip to content

kenimo49/rhythm-lens

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rhythm-lens

DOI

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.md
article.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 で上書きできます)

英語・ポルトガル語対応(v0.2.0)

リズム単調化が言語横断で成立することを確認した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検出器ではありません

論文の結論そのままです: 人間/AI検出に効くのは語彙(AUC 0.998)で、リズムは0.897どまり。しかもリズム信号の相当部分は文書長の差に乗っています。rhythm-lensはAI判定のためのツールとしては設計していません。

リズム指標の価値は別のところにあります。少数で、人間が読めて、全モデル共通に効き、書き手が行動に移せる(「文の長短を揺らす」は実行できるが「800字の中で特定の語の頻度を下げる」は実行できない)。だからこれは検出器のふりをしない、執筆フィードバックの計測器です。

natural-japanese との関係

本ツールの起点は 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のデータは論文公開時にあわせて公開予定です。

Changelog

v0.2.0(2026-07-18)

  • 英語・ポルトガル語対応(--lang ja|en|pt + 自動判定)
  • metrics_latin.py(exp029の計測モジュールと同一定義)と baseline_en.json / baseline_pt.json を追加
  • 依存にpyphenを追加(EN/PT音節近似)
  • 日本語の計測・判定は v0.1.0 と同一(baseline.json / metrics.py は無変更)

v0.1.0(2026-07-17)

  • 初版。日本語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}
}

License

MIT

About

日本語文章のリズム計測CLI。論文実測分布 (7 LLM×350 vs 人間696記事) とのパーセンタイル照合で単調化を検出。Evidence-calibrated rhythm meter for Japanese prose

Topics

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Sponsor this project

  •  

Packages

 
 
 

Contributors

Languages