國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
34
3.4. 重複樣式探勘
在 3.2 節問題定義我們提到希望透過重複樣式的方式減少計算量,在本節我們希 望在線性組合 SSMhybrd之上做重複樣式探勘(Repeating Pattern Mining)來達到段 落分群的目的。
[定義 3.1] 段落(Block)
給定一個歌詞 L,一個段落是由連續詞行所構成 b = (s, e),1 ≤ s ≤ e ≤ N,s 代表段落的起始行號,e 代表段落的結束行號,N 為歌詞總行數,段落的長度 len(b)
= (e – s + 1)。
[定義 3.2] Path
給定一個歌詞生成的 SSMhybrid,在 SSMhybrid中任意 SSMhybrid(i, j)到 SSMhybrid(i + L, j + L)為一條 45 度的斜線樣式,稱為一條 Path p,0 ≤ L ≤ N – max(i, j),N 為 歌詞總行數,函數 max(i, j)為在 i, j 中取較大的數值,p 長度 len(p)=L + 1。每條 Path 會對應到兩個段落 b1=(i, i+L), b2 = (j, j + L)。例如某 SSMhybrid為一 10*10 的 矩陣,Path p 從 SSMhybrid(2, 3)到 SSMhybrid(7, 8),len(p)=6,對應到段落(2, 7)與段 落(3, 8)。
[定義 3.3] Path 分數(Path Score)
給定一條 Path p = SSMhybrid(i, j)到 SSMhybrid(i + L, j + L),其 Path 分數 Ps 定義 為(3.19):
Ps p = SSMhybrid i + τ, j + τ
L
τ=0
(3.19)
‧
到 SSMhybrid(2, 8),len(p1)=2。副歌為段落(3, 6)、段落(9, 12)與段落(13, 16)構成,反應在 p2 = SSMhybrid(3, 9)到 SSMhybrid(6, 12)、p3 = SSMhybrid(3, 13)到 SSMhybrid(6,
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
36
圖 3.14 為趙傳《我很醜,可是我很溫柔》歌詞產生的 SSMhybrid,在其歌詞 的詞式,主歌為段落(1, 4)與段落(9, 12)構成,副歌為段落(5, 8)、段落(13, 16)與 段落(17, 20)構成。p2 = SSMhybrid(1, 9)到 SSMhybrid(4, 12),Ps(p2) < 1,這表示即使 段落(1, 4)與段落(9 ,12)同為主歌,但兩段落可能也只有部份相似度(灰色)。即使 如此,p3 的整體的顏色還是較 p2 深,這表示 Ps(p2) > Ps(p3)。相同的 p1 =
SSMhybrid(5, 13)到 SSMhybrid(8, 16),段落(5, 8)與段落(13, 16)雖然同為副歌,可是
歌詞中第 6 行與第 14 行、第 8 行與第 16 行也是只有部分相似度存在,相似度呈 現一種跳躍式的樣式。圖 3.15 為此兩段落的歌詞對照。
圖 3.14 《我很醜,可是我很溫柔》SSMhybrid
圖 3.15《我很醜,可是我很溫柔》段落(5, 8)與段落(13, 16)歌詞
5. 我很醜 可是我很溫柔
6. 外表冷漠 內心狂熱 那就是我 7. 我很醜 可是我有音樂和啤酒 8. 一點卑微 一點懦弱 可是從不退縮
13. 我很醜 可是我很溫柔
14. 白天黯淡 夜晚不朽 那就是我 15. 我很醜 可是我有音樂和啤酒 16. 有時激昂 有時低首 非常善於等候
p1 p2 p3
‧
辛曉琪《領悟》歌詞的副歌為段落(15, 22)、段落(32, 38)與段落(39, 46)構成。
雖然同為副歌,可是段落(32, 38)長度為 7 行,而另外兩個段落長度為 8 行,有
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
38
[定義 3.6] 實體 Path 矩陣(IPM)
給定一個 SSMhybrid與樣式段落 Bp = (sp, ep),其所有實體 Path 可以出現範圍 矩陣為 SSMhybrid的ㄧ個子矩陣(submatrix)IPM = SSMhybrid(sp~ep, ep~N),N 為歌詞 總行數。則 IPM 稱為段落 Bp的實體 Path 矩陣。
[定義 3.7] 實體段落(Instance Block)
給定一個樣式段落 Bp = (sp, ep)與一條 Bp的實體 Path p,則此 p 對應的兩個 段落,其中一段落 I = (sI, eI),滿足 sI > ep,則此段落 I 稱為樣式段落 BP的實體段 落。
圖 3.17 為樣式段落 Bp=(5, 8)其實體 Path 矩陣、實體 Path 與實體段落說明的 例子。圖 3.17 最左方紅框為一個樣式段落 Bp=(5, 8),右方在對角線下的矩形紅 框為 Bp的實體 Path 矩陣,因此 Path1 到 Path4 皆為 Bp的實體 Path,而 Path 5、
Path6 不為 Bp的實體 Path。Path 1 與 Path 2 的實體段落皆為(10, 11),長度為 2。
Path 3 的實體段落為(17, 20),長度為 4。Path 4 的實體段落為(14, 14),長度為 1。
圖 3.17 樣式段落(5, 8)的實體段落例子 Path 1 Path 2
Path 3 Path 4 Path 5 Path 6
‧
Search 的一般性的遞迴關係為(3.20)、(3.21),初始化關係為(3.22):Score i, j = IPM i, j + max Score k, j − 1 + Ts k, i (3.20)
Ts k, i = Sdiag, if i = k + 1
Sother , otherwise (3.21)
Score i, 0 = IPM i, 0 , ∀i ∈ {0,1, … , len Bp − 1} (3.22) 其中 i, j 出現的位置皆在樣式段落 Bp的實體 Path 矩陣內。此演算法的想法來自 Viterbi Algorithm,我們可以把 i 想像成狀態(state),j 則是時間,所以總共有 len(Bp) 種狀態。因此 Score(i, j)代表在時間狀態 i 的在時間 j 時的最大可能性分數。IPM(i, j)可以想像成觀察分數(Observation Score)。Ts(k, i)可以想像成從狀態 k 到狀態 i 的轉移分數(Transition Score)。圖 3.18 為一個轉移分數的說明示意圖,實線箭頭 代表 Ts(k, i) = Sdiag的情況,虛線箭頭代表 Ts(k, i) = Sother的情況。我們將轉移分
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
40
在此 Instance Path Search 演算法我們利用填表法求遞迴關係解。演算法虛擬碼如 圖 3.19。
Algorithm Instance Path Search Input: 樣式段落 Bp=(sp, ep), IPM Output: Score Matrix(分數累積矩陣)
Procedure IPS(Bp):
Score = matrix(len(Bp), (N – ep)) /*宣告一個大小為 len(Bp)*(N-ep)的矩陣 */
for i = 0 to len(Bp) - 1 : /*Score 矩陣初始化*/
Score(i, 0) = IPM(i, 0) for j = 1 to len(Bp) - 1:
for i = 0 to len(Bp) – 1:
score = 0
for k = 0 to len(Bp) – 1:
if k + 1 = i and Score(k, j - 1) + Pdiag > score:
score = IPM(i, j) + Score(k, j - 1) + Pdiag else:
score = IPM(i, j) + Score(k, j - 1) + Pother Score(i, j) = score
圖 3.19 Instance Path Search 演算法
我們利用經過 Instance Path Search 演算法的計算後,我們可以得到實體 Path,
p1, p2, …,pM的最佳 Path 分數加總,接下來我們要做 Instance Path Tracking,來得 到 p1, p2, …,pM,演算法如圖 3.20。
‧
Algorithm Instance Path Tracking Input: Score Matrix
Output: Instance Path List
Procedure InstancePathTracking(Score):
IPL = <∅>
nowState = argmax(Score(sp~ep, N)) /* N 為歌詞行數,取分數最大的狀態*/
path = < (nowState, N) >
for j = (N -1) to (ep + 2)
comeScoreList = ComeScore(nowState, j, Score) prevState = argmax(comeScoreList)
if prevState + 1 == nowState:
path.append( (prevState, j) ) else:
IPS.append(path)
path = < (prevState, j) >
nowState = prevState return IPL
Procedure ComeScore(nowState, j, Score):
comeScoreList = <∅>
for i = sp to ep :
if i + 1 == nowState:
comeScoreList.append(Score(i, j - 1) + Pdiag) else:
comeScoreList.append(Score(i, j - 1) + Pother) return comeScoreList
圖 3.20 Instance Path Tracking 演算法
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
42
圖 3.21 為兩個 Instance Path Tracking 在趙傳《我很醜,可是我很溫柔》所 找出實體 Path 的例子。圖 3.21(a)下方為給定的樣式段落 Bp=(5, 8) Instance Path Tracking 在實體 Path 矩陣(紅色框)搜尋的結果,上方為 Instance Path Tracking 搜 尋對應到的實體 Path,總共有 3 條長度為 4 的實體 Path。圖 3.21(b)下方為給定 的樣式段落 Bp=(6, 9) Instance Path Tracking 在實體 Path 矩陣(紅色框)搜尋的結果,
上方為 Instance Path Tracking 搜尋對應到的實體 Path,總共有 6 條,長度有 1、2 或 3。可以發現圖 3.21(b)找到的實體 Path 相較於圖 3.21 (a)來的多,並且長度都 小於給定的樣式段落長度 4,如此也便為一個找出的實體 Path 較為零碎的例子。
(a) (b)
圖 3.21 Instance Path Tracking 的兩個例子 (a) 樣式段落 Bp=(5, 8) (b) 樣式段落 Bp=(6, 9)
針對此樣式段落 Bp完成 Instance Path Tracking 之後,我們將得到的實體 Path p1, p2,…,pM,若這些 Path 同時滿足:(1)Ps(pi) / len(pi) ≥ Tsim,1 ≤ i ≤ M;(2) len(pi)
≥ Tsim,1 ≤ i ≤ M,則將其 Path 保留下來,pk1, pk2,…, pkm,km ≤ M,最後取出這 些實體 Path 對應的實體段落,Ik1, Ik2,…, Ikm,稱之為 Bp的有效實體段落,我們 將樣式段落 Bp與其有效實體段落稱為一個 Family f(Bp)={Bp, Ik1, Ik2,…, Ikm },一 個 Family 也就相當於達到了段落分群的目的。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
43
給定一個 Bp 我們可以找到其 Family,接著我們對各種可能的 Bp 產生其 Family,希望尋找最佳的 Family 組合方式,首先我們先建立一個 Family 內聚力 矩陣做為搜尋最佳 Family 組合的資料結構。
給定一個 Family f(Bp),其中所有的段落(包含樣式段落) f(Bp)={b1,b2,…,bn},
任意兩兩段落 bi, bj之間的相似度定義為(3.23):
Bsim bi, bj = max Ps P (3.23)
為了一般性設 len(bi) ≤ len(bj),其中 P 為一個 Path 的集合,集合 P 是由輸入的 bi=(si, ei), bj=(sj, ej)所形成的子矩陣 SSMhybrid(si~ei, sj~ej)中,所有長度為 len(bi)的 Path 構 成。圖 3.22 為給定段落 bi=(4, 6), bj=(7, 10)所形成的子矩陣,總共有兩條 Path,
len(Path1) = len(Path2) = 3。最後 Bsim(bi, bj)選 Ps(Path1)、Ps(Path2)最大的分數做 為 bi, bj的段落間的相似度。
圖 3.22 有效實體段落間相似度例子
有了段落間的相似度 Bsim,我們將給定 Family f(Bp)的內聚力 Co 定義為(3.24):
Co 𝑓(Bp) = n−1i=1 nj=i+1Bsim bi, bj
n ∗ (n − 1) 2 (3.24) 其中 n 為 Family f(Bp)中段落的總個數。
6 5 4
7 8 9 10
Path 1 Path 2
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
44
現在給定一個 N 乘 N 的 SSMhybrid我們將產生所有滿足 2 ≤ len(Bpi) ≤ N/2 的 樣式段落 Bp1 = (sp1, ep1), Bp2 = (sp2, ep2),…,Bpk= (spk, epk),1 ≤ i ≤ k,並且產生各自 的 Family f(Bp1), f(Bp2),.., f(Bpk)。最後形成一個 Family 內聚力矩陣 F:
F = ∀i ∈ {1,2, … , k}: F len Bpi , spi = Co f Bpi 。
圖 3.23 為一個趙傳《我很醜,可是我很溫柔》所形成的 Family 內聚力矩陣 F,橫軸數線代表 Family f(Bpi)中 Bpi的起始行號 spi,縱軸代表長度 len(Bpi),每一 個仍素代表 f(Bpi)的內聚力,右方的白色倒三角形為無填值的區塊。F 中顏色樂 白表示 f(Bpi)的內聚力越高,反之越暗則 f(Bpi)的內聚力越低,內聚力值介在[0, 1]。
可以發現有很多內聚力為 0(黑色)的 f(Bpi),那就代表此 f(Bpi)沒有重複樣式存在。
圖 3.23 趙傳《我很醜,可是我很溫柔》的 Family 內聚力矩陣
我們認為歌曲中最重要的就是主歌與副歌這兩種樣式,因此接下來我們利用 Family 內聚力矩陣 F 做任意兩兩 Family 的組合,其中兩個 Family f(Bpi), f(Bpj)可 以組合的條件為,滿足 A = f(Bpi) ∪ f(Bpj),集合 A 中的兩兩段落之間不能有範圍 重疊即可做組合。為了要取得最佳化的組合分數,我們將任兩個 Family f(Bpi)與
f(B
pj)的組合分數 CS 參考[17]定義為:CS 𝑓 Bpi , 𝑓 Bpj = 2 ∗ precision ∗ recall
precision + recall (3.25) CS 的計算方式是源自 f-score,接下來定義 precision 與 recall 為(3.26)與(3.27):
無填值
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
45
precision 𝑓 B
pi, 𝑓 B
pj= Co 𝑓 B
pi∗ len(b
x) len b
x+ len b
y+ Co 𝑓 B
pj∗ len(b
y)
len(b
x) + len(b
y)
(3.26)
recall
𝑓 B
pi, 𝑓 B
pj= len(b
x) + len(b
y)
N
(3.27)其中(3.26)與(3.27)中的 bx代表 Family f(Bpi)中任一段落,by代表 Family f(Bpj)中任 一段落。(3.27)中的 N 代表歌詞總行數。
在此 precision 的意義為希望找出來的 Family 組合結果的內聚力依長度 Family 段落總長度比例的總和越高越好。可是長度較短的 Family 出現內聚力高 的可能性較大,因此 recall 在此是希望此 Family 組合對於歌詞總行數的覆蓋率越 高越好,用以帄衡兩者之間的關係。
圖 3.24 為一個組合分數計算的例子。輸入的歌詞總共 10 行,上方的編號為 行號。段落樣式 Bp1=(1, 3)、Bp2=(4,5)。Family f(Bp1) = {(1, 3), (7, 9)}(藍色區塊)、
f(B
p2) = {(4, 5), (10, 11)}(橘色區塊)。假設 Co(f(Bp1)) = 0.7、Co(f(Bp2)) = 0.6,則 precision = 0.7 *6 / 10 + 0.6 * 4 / 10 = 0.66,recall = 10 / 11 = 0.91。最後組合分數 CS(f(Bp1), f(Bp2)) = 2 * 0.66 * 0.91 / (0.66 + 0.91) = 0.76。1 2 3 4 5 6 7 8 9 10 11
圖 3.24 可能性分數計算例子
我們將計算所有 Family 組合的可能性,取最大組合分數的 Family 組合做為 最佳的組合。我們利用 Family 內聚力矩陣 F 可以減少部分的組合計算量。例如 F(4, 3)代表長度為 4,起始行為 3 的 f(Bpi),可以推斷在 F 矩陣上第 3 到 6 欄的 f(Bpj)
‧
Algorithm Optimal Family Combination Search(OFCS) Input: Family Cohesion Matrix (F)
Output: Optimal Family Combination (OFC) bestCombination = <∅>
bestScore = 0 Procedure OFCS( F):
combineList = <∅>
Combination(F, 1, 0, combineList) return bestCombination
Procedure Combination(F, length, start, combineList):
if combineList.length == 2: /* 確定已經組合兩種 Family */
score = CS(combineList) /*計算此 Family 組合的分數*/
if score > bestScore:
bestScore = score
bestCombination = combineList maxStart = N
if combineList.length == 0:
maxStart = N/2 nextStart = start + length
for nextLength = 2 to N/2 : /*N 為歌詞總行數*/
for nextStart = nextStart to maxStart:
isOverlap = overlap(combineList, f(F(nextLength, nextStart) ))/*檢查重疊*/
if !isOverlap:
combineList.append(f(F(nextLength, nextStart)) 圖 3.25 Family 最佳組合搜尋演算法