🎤

ラッパーの語彙を分析するCLIツールを作った

に公開

はじめに

というのをやりたくて、まずラッパーの語彙を収集しようと作ったCLIツールがBarScanです
そのツールの紹介と実際に使って4人のアーティストの語彙を分析してみた記事です
BarScanの出力フォーマットであるWordGrainの設計思想については別記事にまとめています

https://zenn.dev/shimpeiws/articles/53370eef4a7b60

BarScanの紹介

BarScanはGenius(音楽歌詞のプラットフォームサイト)からAPI経由で歌詞を取得し、自然言語処理で語彙を分析するCLIツールです
GitHub上のパブリックリポジトリで開発し、PyPIにも公開しました

https://github.com/shimpeiws/barscan

https://pypi.org/project/barscan/

インストールと基本的な使い方

インストール
# インストール
pip install barscan
# 日本語サポートのためには以下extraが必要
# pip install barscan[japanese]

# アーティストの語彙分析を実行
barscan analyze "アーティスト名"
CLIの詳細オプション(出力フォーマット・フィルタリング)

主要なオプション

# 分析する曲数を指定(デフォルト: 10曲)
barscan analyze "アーティスト名" --max-songs 20

# 表示するTop語数を変更(デフォルト: 50語)
barscan analyze "アーティスト名" --top 100

# 組み合わせ(短縮オプション: -n, -t)
barscan analyze "アーティスト名" -n 15 -t 50

出力フォーマット

# テーブル形式(デフォルト)
barscan analyze "アーティスト名"

# JSON形式
barscan analyze "アーティスト名" --format json

# WordGrain形式(語彙分析データの標準スキーマ)
barscan analyze "アーティスト名" --format wordgrain

# ファイルに保存
barscan analyze "アーティスト名" --format wordgrain --output jpthewavy.json

フィルタリング

# ストップワード除去を無効化("the", "a" 等も含める)
barscan analyze "アーティスト名" --no-stop-words

# 特定の単語を除外
barscan analyze "アーティスト名" --exclude "yeah" --exclude "oh"

出力結果

テーブルでの出力結果:

出力結果
$ barscan analyze "beyonce"  --top 5
Found Beyoncé with 10 songs

Artist: Beyoncé
Songs analyzed: 10
Total words: 3,001
Unique words: 839

          Word Frequencies          
┏━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┓
┃ Rank ┃ Word ┃ Count ┃ Percentage ┃
┡━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━━━━━━┩
│    1 │ love │    94 │      3.13% │
│    2 │ like │    94 │      3.13% │
│    3 │ halo │    69 │      2.30% │
│    4 │ ai   │    53 │      1.77% │
│    5 │ slay │    49 │      1.63% │
└──────┴──────┴───────┴────────────┘

WordGrainでの出力結果(フォーマットの詳細は別記事を参照):

WordGrain出力例(JSON)

barscan analyze "beyonce" --format wordgrain -enhanced -c short --detect-slang -o beyonce.wg.json

beyonce.wg.json
{
  "$schema": "https://raw.githubusercontent.com/.../wordgrain.schema.json",
  "meta": {
    "source": "genius",
    "artist": "Beyoncé",
    "generated_at": "2026-02-12T20:03:34.711344Z",
    "corpus_size": 10,
    "total_words": 3001,
    "generator": "barscan/0.2.1",
    "language": "en"
  },
  "grains": [
    {
      "word": "love",
      "frequency": 94,
      "frequency_normalized": 313.23,
      "is_slang": false,
      "contexts": ["Drunk in love, I want...", ...]
    },
    { "word": "like", "frequency": 94, ... },
    { "word": "halo", "frequency": 69, ... },
    // ... 以下続く
  ]
}

技術スタック

  • Python 3.11+ - 言語
  • Typer + Rich - CLIフレームワークとターミナル出力(テーブル表示、カラー出力)
  • lyricsgenius - Genius APIラッパー。歌詞・アーティスト情報の取得
  • NLTK - 自然言語処理(トークナイズ、レンマタイズ、ストップワード除去、POS tagging、VADER感情分析)
  • Janome - 日本語形態素解析(pip install barscan[japanese] で追加)
  • Pydantic + pydantic-settings - データバリデーション・WordGrainスキーマ定義・環境変数ベースの設定管理
  • Hatchling - ビルドシステム。PyPIへのパッケージ配布
  • pytest + ruff + mypy - テスト・リンティング・型チェック

ラッパー4人の語彙を分析してみた

実際にBarScanで4人のラッパーの語彙を分析してみました、自分自身もよく聞く、主に日本語でラップする4人のアーティストを対象としています

分析対象

Genius上にリリックが登録されているアーティストから以下のアーティストを選定しました

アーティスト 選定理由
KOHH シンプルな言葉の繰り返しが耳に残る、ずっと聞いてた
Awich 日本人femaleラッパーQueen、リリックもパフォーマンスも力強い
JP THE WAVY 圧倒的にポップなスタイル、作品だけではなくファッション含めて
Tohji 確固とした世界観、そんなワードある?っていうセンスがリリックで飛び出す

語彙の豊かさ[1]

アーティスト 総語数 ユニーク語数 TTR
Awich 7,305 3,060 0.419
Tohji 3,458 1,173 0.339
JP THE WAVY 5,518 1,669 0.303
KOHH 5,358 1,450 0.271

Awichが0.419で圧倒的に高く、KOHHが0.271で最も低い結果です

Awichは総語数も7,305と最多で、母数が大きいほどTTRは下がりやすいにもかかわらずこの数値は、語彙の幅が圧倒的に広いことを示しています

一方KOHHのTTRの低さは語彙の貧弱さではなくスタイルを示すものだと言えます
頻出ワードの上位を占める同じ言葉を何度も繰り返して刻み込むスタイルがそのままTTRに反映されており、
反復それ自体が表現手法であり、数値の低さがむしろスタイルの一貫性を示していると言えます

頻出語の違い

上位頻出語を見ると、4人のスタイルの差が鮮明に浮かび上がります

テーブル各項目(frequency / tfidf / sentiment)の補足
  • frequency: コーパス(対象30曲)内での出現回数
  • tfidf: そのアーティストにとって「特徴的」な単語ほど高スコアになる指標です。0.0〜1.0に正規化されています
    • 計算式: TF × IDF(最大値で割って正規化)
    • TF(Term Frequency): コーパス全体での単語頻度 = 出現回数 / 総単語数
    • IDF(Inverse Document Frequency): log(総曲数 / その単語を含む曲数)
  • sentiment: VADER感情分析によるポジティブ/ネガティブ/ニュートラルの判定

KOHH — 語彙がスタイルそのもの

上位に「死ぬ」「吸う」「生きる」「dirt」「iphone」「ジュンジタカダ」、
生と死、日常、地元のリアルなどを表す言葉で構成されており、装飾的な言葉はほとんどありません
アーティスト名を伏せてリストを見ても、KOHHだと気づくことができそうです

word frequency tfidf sentiment
cbd 119 1.0 neutral
dirt 84 0.8866 negative
f**k 71 0.3206 negative
p***y 66 0.4716 neutral
死ぬ 65 0.2024 neutral
ビ*チ 64 0.3558 neutral
tonight 61 0.6438 neutral
吸う 60 0.3336 neutral
iphone 59 0.328 neutral
die 54 0.3858 negative

Awich — 圧倒的な英語率

上位50語のうち日本語は7語(14%)、他の3人が45-50%前後なのに対して圧倒的なバイリンガル度合いです
感情分析ではPositiveとNegativeがおよそ半分ずつ含まれており、ただ「前向きに」というメッセージではなく、ネガティブな状況を逆転させるような強さをラップしていることが彼女のパワフルな楽曲スタイルにつながっているのだと考えられます

word frequency tfidf sentiment
bad 76 0.5241 negative
like 59 0.37 positive
run 48 1.0 neutral
get 47 0.2948 neutral
b***h 46 0.3814 negative
wax 46 0.9583 neutral
yeah 45 0.4085 positive
f**k 44 0.2034 negative
know 43 0.2965 neutral
ya 42 0.4175 neutral

JP THE WAVY — "陽"の語彙

「仲間」57回、「いい」49回、「cool」46回、「好き」23回、「飛ぶ」27回、唯一ポジティブな語彙が上位を占めるアーティストでした
一方でf**kわずか9回で、他の3人(71, 44, 51回)と比べて圧倒的に少ない傾向にあります
アドリブ・感嘆詞の比率が8.2%で最高なのも、彼のスタイルがデータに表れていると言えます

word frequency tfidf sentiment
ya 113 1.0 neutral
yeah 102 0.2865 positive
見える 68 0.4942 neutral
wavy 65 0.203 neutral
yah 64 0.953 neutral
okay 63 0.5575 positive
仲間 57 0.1432 neutral
いい 49 0.3561 neutral
like 48 0.2418 positive
cool 46 0.685 positive

Tohji — 誰とも重ならない世界観と語彙

「oreo」「godzilla」「mantle」「naked」「snowboarding」など、他のラッパーの語彙とまったく重ならない独自の単語が並びます
全体に感嘆詞が少ないものの、楽曲から感じられる雰囲気・ニュアンスが豊かなのは、感情を直接的な語彙ではなく独自のワードで置き換えているからかもしれません
「love」がたった1回というのも象徴的です

word frequency tfidf sentiment
oreo 139 1.0 neutral
yeah 101 0.1787 positive
f**k 51 0.1736 negative
nay 45 0.3237 neutral
がいす 36 0.259 neutral
wassa 36 0.259 neutral
wanna 30 0.1137 neutral
mantle 29 0.2086 neutral
godzilla 27 0.1942 neutral
duh 27 0.1942 neutral

発見

Tohjiの「oreo」139回

『Oreo』の中で繰り返し出てくるワードで、全アーティスト・全単語中で最高頻度です

https://genius.com/Tohji-oreo-lyrics

統計的にいうとノイズとなるデータではありますが、これも実際の楽曲とリリック、Tohjiの他作品ともあわせて見ると彼のスタイルをあらわすものに見えます

yeah/yaはノイズか、それともスタイルか

「yeah」「ya」「yah」などの感嘆詞はストップワードとして除外すべきノイズにも見えます
BarScanには特定ワードのフィルタ機能もあるので除去可能です

しかし、実際にはアーティストによって使用頻度に大きな差があり(JP THE WAVYは上位3語すべてが感嘆詞、KOHHの上位10語には1語も入らない)、フロウやアドリブの多い/少ないがそのままデータに表れているとも言えます
ノイズとして切り捨てるよりも、スタイルの指標として残しておく方が面白い結果が得られそうです

感情分析

Positive/Negative比率を出してみると以下のようになります[2]

  • AwichのP/Nはほぼイーブン
  • KOHHは圧倒的にNegative寄り、JP THE WAVYは真逆でPositive寄り
  • Tohjiは感情語の出現率自体が最も少ない
指標 KOHH Awich Tohji JP THE WAVY
Positive語彙数 27 101 20 48
Negative語彙数 23 102 20 32
P/N比 36:64 45:55 60:40 76:24
感情語出現率 10.1% 13.2% 8.8% 10.3%

全員共通の語彙は8語のみ

Top100ワード内で4人全員が使う単語はb***h, know, uh, yeah, やる, 全部, 見る, 言うわずか8語のみでした

4人のスタイルがいかに異なるかを端的に示していますし、英語4語・日本語4語というバランスも、日本語ラップの日英混在という側面がよくあらわれているように見えます

対象アーティストをもっと増やしてどうなるかが気になります

まとめ

BarScanで4人のラッパーの語彙を収集し分析した結果、数値データからでもアーティストごとのスタイルの違いがはっきりと浮かび上がりました

  • TTR(語彙多様性) だけでも、Awichの圧倒的な語彙の広さとKOHHの反復で刻み込むスタイルが対照的に見える
  • 頻出語 を並べれば、KOHHのリアル、Awichのバイリンガルな強さ、JP THE WAVYの陽のエネルギー、Tohjiの独自の世界観がそのまま表れる
  • 感情分析共通語彙の少なさ(Top100で全員共通はわずか8語)からも、4人それぞれのスタイルの独立性が裏付けられる

「歌詞の語彙」は単なるテキストデータですが、頻度・多様性・感情といった切り口で見ることで、アーティストのスタイルを定量的に捉えられる可能性を感じました

もともとの動機だった「ラッパーのペルソナでLLMに話させたい」という目的に対しては、BarScanの出力フォーマットであるWordGrainをプロンプトに組み込むことで、アーティスト固有の語彙や口調をLLMに渡す入口になると考えています
WordGrainを実際にLLMプロンプトに活用する部分は今まさに他のアプリケーションで実装中です

リンク集

脚注
  1. TTR(Type-Token Ratio)はユニーク語数を総語数で割った値で、語彙の多様性を示す指標です。BarScanの出力では meta.total_words が総語数、grains 配列の長さがユニーク語数にあたります。 ↩︎

  2. P/N比は語彙数ではなく出現頻度ベースで算出しています。 ↩︎

Discussion