In this week assignment, since my mother tongue is cantonese, I plan to focus on word counting in Cantonese pop lyrics.
To enlarge the database, instead of analyzing a single text, I have aggregated 8 songs by 4 international cantonese artists, 2 songs from each (Beyond, Eason Chan, Joey Yung, G.E.M.) to explore shared themes across Canto pop.
Full Chinese lyrics have pasted into the code for processing.
Since Chinese text has no spaces, I used character-level tokenization:
This P5 code shows how I computed the frequencies.
let lyrics_all = `今天我寒夜裏看雪飄過
懷著冷卻了的心窩漂遠方
風雨裏追趕 霧裏分不清影蹤
天空海闊 你與我可會變 (誰沒在變?)
多少次迎著冷眼與嘲笑
從沒有放棄過心中的理想
一剎那恍惚 若有所失的感覺
不知不覺已變淡心裏愛 (誰明白我?)
原諒我這一生不羈放縱 愛自由
也會怕有一天會跌倒 oh, no
背棄了理想 誰人都可以
哪會怕有一天只你共我
今天我寒夜裏看雪飄過
懷著冷卻了的心窩漂遠方
風雨裏追趕 霧裏分不清影蹤
天空海闊 你與我可會變 (誰沒在變?)
原諒我這一生不覊放縱 愛自由
也會怕有一天會跌倒 oh, no
背棄了理想 誰人都可以
哪會怕有一天只你共我 oh, yeah
仍然自由自我 永遠高唱我歌
走遍千里
原諒我這一生不羈放縱 愛自由
也會怕有一天會跌倒 oh, no
背棄了理想 誰人都可以
哪會怕有一天只你共我 oh, yeah
oh, yeah
鐘聲響起歸家的訊號
在他生命裡
彷彿帶點唏噓
黑色肌膚給他的意義
是一生奉獻 膚色鬥爭中
年月把擁有變做失去
疲倦的雙眼帶著期望
今天只有殘留的軀殼
迎接光輝歲月
風雨中抱緊自由
一生經過彷徨的掙扎
自信可改變未來
問誰又能做到
可否不分膚色的界限
願這土地裡
不分你我高低
繽紛色彩閃出的美麗
是因它沒有
分開每種色彩
年月把擁有變做失去
疲倦的雙眼帶著期望
今天只有殘留的軀殼
迎接光輝歲月
風雨中抱緊自由
一生經過彷徨的掙扎
自信可改變未來
問誰又能做到
今天只有殘留的軀殼
迎接光輝歲月
風雨中抱緊自由
一生經過彷徨的掙扎
自信可改變未來
問誰又能做到
如果那兩個字沒有顫抖 我不會發現 我難受
怎麼說出口 也不過是分手
如果對於明天沒有要求 牽牽手就像旅遊
成千上萬個門口 總有一個人要先走
懷抱既然不能逗留 何不在離開的時候 一邊享受 一邊淚流
十年之前 我不認識你 你不屬於我 我們還是一樣
陪在一個陌生人左右 走過漸漸熟悉的街頭
十年之後 我們是朋友 還可以問候 只是那種溫柔
再也找不到擁抱的理由 情人最後難免淪為朋友
直到和你做了多年朋友 才明白我的眼淚
不是為你而流 也為別人而流
我唱得不夠動人你別皺眉
我願意和你約定至死
我只想嬉戲唱遊到下世紀
請你別嫌我將這煽情奉獻給你
還能憑甚麼 擁抱若未能令你興奮
便宜地唱出 寫在情歌的性感
還能憑甚麼 要是愛不可感動人
俗套的歌詞 煽動你惻忍
誰人又相信一世一生這膚淺對白
來吧送給你叫幾百萬人流淚過的歌
如從未聽過誓言如幸福摩天輪
才令我因你要呼天叫地愛愛愛愛那麼多
我唱出心裡話時眼淚會流
要是怕難過抱住我手
我只得千語萬言放在你心
比渴望地老天荒更簡單未算罕有
給你用力作二十首不捨不棄
還附送你愛得過火
給你賣力唱二十首真心真意
米高峰都因我動容 無人及我
你怎麼竟然說K歌之王 是我
Pride in your eyes 為我改寫下半生
眉目裡 找到我 失去的 自信心
才明白 被愛的 能活得這樣勇敢
See me fly I'm proud to fly up high
不因氣壓搖擺 只因有你擁戴
Believe me I can fly
I'm singing in the sky
假使我算神話 因你創更愉快
昂然地對著宇宙說 是借著你的風
Let me fly I'm proud to fly up high
不因氣壓搖擺 只因有你擁戴
Believe me I can fly
I'm singing in the sky
假使愛有奇蹟 跟你創最愉快
我覺得光榮 因有你擁戴
想不起 怎麼會病到不分好歹 連受苦都甜美
我每日捱著 不睬不理
但卻捱不死 又去癡纏你 難道終此一生
都要這麼 不可爭一口氣
很謙卑 只不過是我太過愛你 連自尊都忘記
跌到極麻木 只好相信
又再爬得起 就會有轉機
若我不懂憎你 如何離別你 亦怕不會飛
一天一點傷心過 這一百數十晚
春天分手 秋天會習慣 苦衝開了便淡
由這一分鐘開始計起 春風秋雨間
慢慢的心淡
一天一點傷心過 這一百數十晚
春天分手 秋天會習慣 苦衝開了便淡
夢內傾心一吻就算心動 現實可惜不配與你相擁
沉溺 於一刻的接觸 哪管即將結束 已經滿足
夜半再相見 迷霧裡繾綣 長夜夢中有過動魄迷人片段
沒法再相見 一醒了完全逆轉 就似夢裡面熾熱愛海變冰川
沉睡中的主角 怎會怕寂寞 童話中的主角 一百年躺臥
埋在心底的愛慕 能否跟你透露 期待你 只是虛無
夢內相擁一剎就算感動 現實可惜經已結霜冰封
誰奢想一生都抱緊 至少一刻的快感 亦當緣份
像 未曾認識你
像全部憶記 你早拋棄
太異樣 想要望穿你
直覺這刻你有 太多可揭秘
有兩個你
一個我憎恨 想要忘記
快將要視你 已經死
一個卻深夜 總會念記
記憶裡極美 這兩個你
異常地抽象
為何熟悉你已 彷彿似我幻象
怎去辨真相
這場遊戲 我只想
學懂怎樣識別你
有兩個你
心裡清楚 這是歪理
卻不惜包庇 沒有骨氣
心知不爭氣 卻甘心入戲
不捨不棄 這兩個你
`;
let freq = [];
let topN = 50;
function setup() {
createCanvas(1000, 600);
textFont("Noto Sans CJK TC");
// tokenize: keep only CJK chars
let chars = lyrics_all.replace(/[^\u4e00-\u9fff]/g, "").split("");
// count
let counts = {};
for (let c of chars) {
counts[c] = (counts[c] || 0) + 1;
}
// sort
freq = Object.entries(counts).sort((a,b) => b[1]-a[1]);
}
function draw() {
background(245);
let data = freq.slice(0, topN);
let margin = 80;
let barWidth = (width - 2*margin) / data.length;
let maxVal = max(data.map(d => d[1]));
// title
fill(50);
textAlign(CENTER);
textSize(22);
text("Top " + topN + " Characters Across 8 Cantopop Songs", width/2, 50);
// bars
for (let i=0; i<data.length; i++) {
let [char, count] = data[i];
let h = map(count, 0, maxVal, 0, height-200);
let x = margin + i*barWidth;
let y = height - margin - h;
fill(100 + i*5, 150, 220 - i*3);
rect(x, y, barWidth*0.7, h, 8);
fill(0);
textSize(18);
text(char, x + barWidth*0.35, height - margin + 25);
textSize(12);
text(count, x + barWidth*0.35, y - 8);
}
}
I counted the top 50 words frequencies of these 8 songs for visualization in the next step. You can also change the top words counting by changing the value of “let topN = 50;”