第三章 宋詞斷詞器與本體論設計
3.2. 宋詞斷詞器
3.2.7. 節奏斷詞模組
節奏是音樂旋律中必備的條件,指語言上的停頓,也稱之為頓。而宋詞為長 短句,配合音樂依聲填詞,為了讓詞句吟詠時能有高低起伏、優美悅耳,填詞時 非常注重節奏。節奏約分為兩大類:聲律節奏與意義節奏。舉例來說,4 字句的詞 句,常切分為(2,2),或(1,3)[28]:
28
29 未知詞(Unknown Word)的問題。
詞中三字句至九字句佔的數量最多,我們整理出表 2詞的常用節奏[13]。四字
八字句 (3,5)(5,3)(1,7)(2,6)(4,4)(6,2)
九字句 (3,6)(5,4)(6,3)(7,2)(1,8)(2,7)(4,5)(6,3)
十字句 (3,7)(7,3)(4,6)(6,4)(5,5 詞譜標豆)
30 (3) 規則 3:六字句或讀,(2,2,2)
(4) 規則 4:七字句或讀,(2,2,3)
(5) 規則 5:三字句或讀,(1,2)或(2,1)
節奏斷詞模組針對常用的節奏進行斷詞。不過以五字為例,可能切為(2,3)、
(3,2)、(2,2,1)、(1,4)、(1,2,2)這幾種組合,如果直接切成(2,3)
難免有以偏概全之疑慮,此時就有賴於其它模組的輔助。如:
念武陵春晚
–李清照《鳳凰臺上憶吹簫》
「念」是領字,若領字模組正確切割出此字,那麼這個五字句就可能就是 (1,
4) 或(1,2,2) 的組合;而「武陵」是專有名詞,同樣地,若專有名詞模組 正確地切分出此字組,那麼五字句的組合就為(1,2,2)。如果其它模組都無法 輔助進行切分的動作,就參考四字讀斷為(1,2,2)。
針對三字句或讀沒有一定的切分準則,切分的方式首先根據詞庫進行比對,
找尋(2,1)或 (1,2) 之中的二字詞在詞庫的詞頻較高者為優先。若無法從 詞庫進行比對,則參考詞句是否對仗,再進行切割。
綜合以上所述,參考圖 7是節奏斷詞模組的比對流程。首先輸入詞句,判斷 詞句中每個詞彙的長度。若為一或二個句或讀,直接斷出不必再行處理,因為所 有詞的詞句中僅有一個字的只有陸游《釵頭鳳》一闕,此外都是以兩個音節為一 個單位。若為四、六字句或讀,則按常用規則切為雙字詞。五字句或讀則切為(2,
3);七字句或讀則切為(2,2,3)。而三、五、七字句或讀中可能會包含三字 詞,其解法是將三字詞先切為(2,1)與(1,2),再查詢兩個二字詞的詞頻,
以詞頻較高者為斷字原則。若無法取得詞頻,則留待對仗模組處理。
圖 7:節奏斷詞模組流程
根據圖 7的流程,定義出節奏斷詞模組的斷字演算法,參考演算法 3。
演算法 3:節奏斷詞模組斷字演算法 (針對一首詞)
Symbol Definition:
Ci:a Ci object
Sentence:a sentence object
SentenceCollection:a sentence collection of a Ci object instance Segment:a segment object representing a segmented word
SegmentCollection :a collection of all Segment object in a Sentence instance t1:temp variable
31
32
t2:temp variable Input:
Ci: a Ci object instance for segmenting Output:
newCi: a Ci object, contains all segmented words collection ,and tags with particular parser Algorithm :
Begin:
33
step 3: create a new SegmentCollection for the Sentencei ,
step 4: create one to many Segment objects representing a word in Sentencei add all Segment object into SegmentCollection
} else {
step 1:extract last two words Segmentj into Segmentk
step 2: tag Segmentk with WordParser / / WordParser代表節奏斷詞模組
step 3:create a new SegmentCollection for the Sentencei ,
step 4:create one to many Segment objects representing a word in Sentencei add all Segment object into SegmentCollection
}
} } End: