如果唐詩有 NLP:詩詞格律的自動分析與風格辨識

ancient%20Chinese%20battlefield%20with%20dramatic%...
發表時間:2026 年 10 月 31 日 | 更新日期:2026 年 10 月 31 日 | 編輯:雅寶社區編輯團隊
如果唐詩有 NLP:詩詞格律的自動分析與風格辨識 - 雅寶社區 · 頂客論壇

平仄:最漂亮的二元序列

平仄是格律的地基。中古漢語有四聲:平、上、去、入。其中「平」為平聲,上、去、入合稱仄聲。於是每一個字在格律層面上都被映射成一個二元值:平(記為 0 或 ─)或仄(記為 1 或 │)。

一首五言絕句,就是一個二十位元長的二元序列。而格律規範,說白了就是「這個序列必須符合某幾種模板之一」。以最常見的「首句仄起不入韻」五絕為例,理想格式是:

句次

理想平仄

範例(王之渙〈登鸛雀樓〉)

第一句

仄仄平平仄

白日依山盡

第二句

平平仄仄平

黃河入海流

第三句

平平平仄仄

欲窮千里目

第四句

仄仄仄平平

更上一層樓

這張表看起來很整齊,但實務上立刻遇到兩個麻煩。第一個是「一三五不論,二四六分明」——第一、三、五個字(七言裡)可以鬆動,第二、四、六個字必須守死。第二個是拗救:某些位置真的沒辦法守規矩時,詩人會用「拗」加「救」的方式補回來。例如出句該平而用了仄,就在對句相應位置補一個平聲字。這些規則在傳統詩律學裡講得很細,但對機器來說,它們全部可以寫成帶條件的正則表達式或有限狀態機。

真正麻煩的其實是「字怎麼分類」。同一個字在現代漢語是平聲,在中古可能讀入聲。例如「白」,普通話讀 bái,是陽平,但在平水韻裡屬入聲陌韻,是仄聲。如果直接拿現代拼音去判斷平仄,整首詩會錯得亂七八糟。所以 NLP 系統在這裡必須接一個中古音韻資料庫,或者至少接一套「平水韻字表」,把每個字映射到它在中古的聲調類別。這件事在技術上不難,但它是所有格律分析的地基,地基歪了,後面全歪。

押韻:韻書就是古代的音韻資料庫

押韻自動分析的關鍵,在於「韻部」這個概念。唐詩用的是《切韻》系統,後來宋代整理成《廣韻》兩百零六韻,金元以後通行的是「平水韻」一百零六韻。也就是說,判斷兩個字是否押韻,不能看它們今天讀起來像不像,而要看它們在韻書裡是不是同一個韻部。

這裡有一個很經典的例子:杜甫〈春望〉「國破山河在,城春草木深。感時花濺淚,恨別鳥驚心。烽火連三月,家書抵萬金。白頭搔更短,渾欲不勝簪。」韻腳是深、心、金、簪,在平水韻裡都属下平十二侵。但今天普通話讀起來,「簪」讀 zān,跟「深」shēn、「心」xīn 完全不像。如果只靠現代讀音,模型會判定這首詩「出韻」;但只要接上韻書,立刻就是完美的合韻。

所以押韻模組的實作邏輯大致是:先把韻腳字抽出來,查韻書映射到韻部,再檢查是否全部落在同一個韻部內(首句入韻的情況要允許第一句單獨一組)。更精細一點,還要處理「鄰韻通押」的問題——某些韻部在實際創作中允許互相借用,這在近體詩裡比較嚴格,在古體詩裡就寬鬆得多。模型必須先判斷這首詩是近體還是古體,才能決定要用哪一套標準去檢查。

對仗:語法樹與語意相似度的雙重約束

如果說平仄和押韻是「音」的約束,對仗就是「義」與「法」的約束,也是三者中最難自動化的一個。傳統上說對仗要「詞性相對、結構相對、意義相關而不相同」,這三句話每一句都很難翻譯成程式碼。

比較可行的做法是分層處理。第一層做詞性標註:把上下句切成詞,標上名詞、動詞、形容詞、方位詞、數量詞等。第二層做句法分析:判斷兩句的結構是不是同構,例如「名詞+動詞+名詞」對「名詞+動詞+名詞」。第三層做語意相似度計算:用詞向量或預訓練模型算出對應詞之間的距離,距離太近(合掌)要扣分,距離太遠(不相關)也要扣分,中間那段「若即若離」才是好對仗。

這裡有一個很能說明問題的例子:「兩個黃鸝鳴翠柳,一行白鷺上青天。」數量詞對數量詞(兩個/一行),鳥名對鳥名(黃鸝/白鷺),動詞對動詞(鳴/上),顏色加名詞對顏色加名詞(翠柳/青天)。機器做這層結構標註其實相當擅長,困難的地方在於「翠柳」和「青天」為什麼是好對——顏色對顏色是形式,但「翠」與「青」在色彩光譜上非常接近,這就涉及語意空間裡的距離計算了。

再往下走,「無邊落木蕭蕭下,不盡長江滾滾來」這種對仗,還牽涉到「疊字對疊字」與「雙聲疊韻」的語音效果。這時候對仗分析就不只是語法問題,而是語音、語法、語意的三維聯合判定。這也是為什麼直到今天,對仗判定仍然是格律自動分析裡最不成熟的一塊。

三、格律自動分析怎麼做?規則引擎與統計模型的雙人舞

把上面這些拆解開來,一個完整的唐詩格律分析系統大致可以分成四步。這四步的順序很重要,因為每一步的輸出都是下一步的輸入。

第一步:詩句切分與標點還原

聽起來很無聊,但這一步其實是很多系統翻車的地方。古籍原文大多沒有標點,一首詩傳來可能是連續的一長串字。模型必須先判斷:這首詩是五言還是七言?是絕句還是律詩?是近體還是古體?然後才能正確斷句。

近體詩的斷句相對簡單,因為字數固定、句數固定,五絕二十字、七絕二十八字、五律四十字、七律五十六字,對不上就是有問題。但古體詩就麻煩了,〈蜀道難〉、〈將進酒〉那種長短句混雜的樂府,斷句需要依賴韻腳與句法线索。比較穩健的做法是用「韻腳偵測+句法邊界預測」聯合判斷,也就是先找出所有可能押韻的字,再從韻腳往前回推句長。

第二步:平仄標註與拗救偵測

斷好句之後,把每個字映射到平水韻的聲調,得到一組實際平仄序列。接著拿它去比對該詩體對應的幾種標準格式,找出「最接近」的那一個作為基準。比對完之後,標記出所有偏離位置,再套用拗救規則判斷這些偏離是「合法拗救」還是「出律」。

拗救規則可以用規則引擎(rule engine)實作,因為它的條件非常明確:例如「出句第四字該平而仄,則對句第三字該仄而平以救之」(五言),翻成 if-then 就是幾行條件判斷。這比硬套機器學習可靠得多,因為拗救本來就是人為約定的規則,不是統計傾向。

但規則引擎也有盲點:當一首詩同時出現多處拗、多處救時,規則之間可能互相衝突,或者出現「一拗多救」的模糊地帶。實務上比較好的做法是「規則為主、統計為輔」——用規則跑出候選解,再用語料庫的統計分佈去排序,選出歷史上最常見的那種解釋。

第三步:押韻檢核與韻部聚類

押韻檢核的技術難度不高,難在資料。韻書數位化這件事,學界已經做了很多年,平水韻一百零六韻的字表相對完整。但要注意三個坑:一是異體字與通假字,二是多音字的韻部選擇(同一個字在不同語境可能屬不同韻部),三是首句入韻的判定。

更進一步,還可以做「韻部聚類」的統計分析:把全唐詩的韻腳全部抽出來,統計每個韻部的使用頻率,以及不同時期、不同詩人的用韻偏好。這類研究早已有之,但如果用 NLP 大規模跑一遍,說不定能發現一些過去靠人工抽樣沒注意到的模式——例如安史之亂前後,詩人用韻的寬嚴程度有沒有變化?

第四步:對仗判定的難題

前面已經說過,對仗是最難自動化的一塊。實際系統通常採用「多特徵加權評分」的方式:詞性一致度、句法結構同構度、詞義距離適中度、字數與節奏對稱度,各自給一個分數,加權平均後輸出一個「對仗品質分」。

這個分數當然不是絕對的評判,但它有兩個實用好處。第一,可以快速篩出「明顯不對仗」的句子,節省人工檢查時間。第二,可以做成視覺化工具,把首聯、頷聯、頸聯、尾聯的對仗強度畫成一條曲線,讓研究者一眼看出律詩的內部結構張力。有些詩刻意在頸聯放鬆對仗以製造語勢流動,這種「破格」如果能量化,對詩學分析其實很有幫助。

四、風格辨識:給每位詩人做一張「語言指紋」

格律分析處理的是「形式合不合法」,風格辨識處理的則是「這像不像某個人寫的」。前者是規則問題,後者是分類問題,方法論完全不同。但有趣的是,最有效的風格辨識,往往還是要回到格律層面的特徵——因為詩人的個人習慣,經常就藏在那些看似最機械的地方。

用詞偏好:高頻字與虛詞的祕密

每個詩人都有自己的「口頭禪」。李白的詩裡「我」「君」「白」「月」出現頻率極高,杜甫偏愛「老」「病」「秋」「愁」,王維則滿是「空」「靜」「山」「雲」。這些高頻字當然不能單獨作為判別依據,因為主題不同頻率也會變,但如果把範圍限定在同主題、同體裁的作品裡,用詞偏好就會浮現出來。

虛詞更是關鍵。近體詩因為格律限制,虛詞用量本來就少,正因如此,誰用、用在第幾個字、用什麼虛詞,就特別有辨識度。「猶」「尚」「已」「空」「獨」「更」「應」,這些字在不同詩人筆下的分佈差異,往往比名詞更能反映個人語感。用 TF-IDF 或更簡單的卡方檢定,就能把這類特徵抓出來。

句法與節奏:五言與七言只是表象

表面上看,李白寫七言、杜甫五七言都寫,句長差異好像沒什麼意義。但深入一層,句內節奏才是重點。五言的節奏通常是「二/三」或「二/一/二」,七言是「二/二/三」或「四/三」。同一個節奏框架下,詩人怎麼安排詞組的邊界、怎麼控制停頓的密度,其實是一種很個人的簽名。

用 NLP 的做法,可以把每句詩轉換成一串詞性標籤,再計算相鄰詞性之間的轉移機率,得到一個「句法節奏剖面」。把一位詩人所有作品的剖面平均起來,就得到一條曲線。把李白和杜甫的曲線疊在一起看,通常能看到明顯差異:李白的轉換更跳躍、更具爆發性,杜甫則更綿密、層次更多。這種差異用肉眼讀詩能感覺到,但用統計方式畫出來,會具體得讓人吃驚。

意象網絡:從「月」「酒」「劍」看詩人的世界觀

意象可以說是唐詩風格辨識裡最有詩意的一層。做法是把每首詩裡的意象詞抽出來,統計它們的共現關係,建成一個圖(graph)。節點是意象,邊是共現次數,這樣就得到一位詩人的「意象網絡」。

李白的意象網絡中心大概是「月」「酒」「劍」「天」「雲」,節點之間連接密集,跳躍感強。杜甫的網絡中心則是「秋」「江」「舟」「淚」「家」,節點之間連結更沉、更糾纏。王維的網絡會呈現出「山」「水」「空」「鳥」「鐘」的環狀結構,彼此互為背景。這些結構上的差異,用圖神經網路(GNN)跑相似度,往往能得到比單純用詞頻更穩定的辨識結果。

從 TF-IDF 到 BERT:模型怎麼進化

風格辨識的技術演進,大概可以分三個階段。第一階段是「特徵工程時代」,靠人工設計字頻、詞頻、句長、平仄模式等特徵,再丟進 SVM 或樸素貝氏分類器。這個階段的好處是解釋性強,壞處是特徵總有遺漏。第二階段是「詞向量時代」,用 Word2Vec 或 GloVe 把字詞變成向量,再平均成詩向量,效果比純字頻好,但還是丟失了語序資訊。第三階段是「預訓練模型時代」,直接把整首詩餵進 BERT 之類的模型做微調,讓注意力機制自己去找風格線索。

實際測試下來,這三個階段各有勝場。如果資料量小、只需要區分少數幾位風格差異極大的詩人,特徵工程時代的方法又快又準。但如果要處理像《全唐詩》這種規模、而且詩人風格彼此接近(例如大曆十才子之間),預訓練模型搭配韻律特徵的混合方法,表現會明顯勝出。這也呼應了一個常見的經驗:在詩詞這種高度形式化的文本上,手工特徵與神經網路不是替代關係,而是互補關係。

偽作辨識與作者考據

風格辨識最實際的應用,其實是「作者考據」。中國古典詩詞裡存疑的作品非常多,有些是後人偽託,有些是編纂時誤收,有些是異文傳抄造成的混淆。傳統考據靠的是版本比對與文獻互證,NLP 則提供了一個新的角度:用統計方法量化「這首詩的風格距離某位候選作者有多遠」。

這種方法當然不能單獨作為定論,但它可以作為一個有力的輔助證據。當文獻證據模糊、而多個風格模型都指向同一個結論時,考據學者就有理由重新審視既有判斷。反過來說,如果風格模型強烈懷疑某首詩不是某人所作,而文獻上又有明確記載,那就值得進一步檢查是不是有誤收或混入的情況。

五、實戰腦洞:如果唐朝有 AI 詩社

講完技術,讓我們放鬆一點,認真做幾個歷史腦洞。假設唐代真的有一套 NLP 工具鏈,那會怎麼改變當時的詩歌生態?

情境一:科舉考場的即時格律檢查

唐代進士科考詩賦,格律不合是要扣分的。如果考場配備一台「格律檢查機」,考生寫完試帖詩,當場掃描一遍,立刻顯示平仄合律率、韻部、對仗強度。聽起來很方便,但這其實會徹底改變考試的性質——原本考的是「你內化了多少規則」,變成「你會不會用工具驗證」。這跟今天程式設計考試允許不允許用 IDE 是同一種爭論。

比較有趣的是,這種工具很可能催生一批「專攻拗救」的考生。因為機器會明確告訴你哪裡出律、怎麼救,於是原本要靠多年苦練才能掌握的技巧,變成可以速成的技術。詩會不會因此變得更「工整」而更「平庸」?這是一個很值得玩味的問題。

情境二:詩集編纂與偽作鑑定

唐代已經有人編詩集,像殷璠的《河嶽英靈集》、元結的《篋中集》。如果有 NLP 工具,編者就可以在收詩之前先跑一次風格比對,看看這首詩的語言指紋跟作者其他作品差多少。這會讓詩集的可信度提高,但也可能讓某些「風格轉變期」的好作品被誤判出局——畢竟詩人是會變的,杜甫在秦州和成都的風格差異極大,如果模型沒考慮時間因素,可能就把後期的杜甫判成別人。

所以這裡有一個很重要的設計原則:風格辨識系統必須納入「時間維度」。同一位詩人不同時期的作品,應該建立不同的基準模型,或者把時間作為特徵輸入模型。這一點在現代作者辨識研究裡也越來越受到重視。

情境三:詩人排名與「唐詩排行榜」

如果唐朝有資料科學家,很可能會有人做一個「唐詩影響力排行榜」:用引用次數、和作數量、選本收錄率、後世註釋密度等指標,算一個綜合分數。李白杜甫誰第一?這種問題在唐代可能還沒那麼尖銳,但到了宋代就變成文學史的公案了。

用 NLP 做這種排名,最大的好處是可以拆解「影響力」的構成。李白的引用多,但杜甫的和作多、註釋多、選本收錄率高。兩者的影響路徑其實不同:一個是靠名句的傳播力,一個是靠作品整體的典範性。這種拆解用傳統方法也能做,但 NLP 可以做得很細,細到「哪位詩人的哪類作品被引用最多」這種層級。

六、NLP 讀詩的天花板在哪裡?

前面講了很多技術能做到的事,現在該談談它做不到的事了。這一節可能比前面所有技術細節都更重要,因為它決定了我們該怎麼看待這些工具。

意境能不能量化?

「意境」這兩個字,是中國詩學裡最難定義也最常被使用的概念。如果硬要給一個操作型定義,大概可以拆成三層:意象的選取與組合、意象之間的空間關係、由空間關係所引出的情感基調。第一層 NLP 做得不錯,第二層勉強,第三層就開始力不從心了。

問題在於,意境很大程度是「讀者共同體」長期累積的默契。看到「空山」兩個字,受過唐詩訓練的讀者會自動聯想到寂靜、超脫、時間感的拉長,但這個聯想不是字面意義,而是文化約定。模型可以學到「空山」常與「不見人」「鐘聲」共現,但它很難學到「為什麼這兩個字會讓人感到安靜」。

換句話說,NLP 可以量化「意境的語言表徵」,但很難量化「意境本身」。這中間的落差,就是人類讀者的價值所在。

情感計算與「詩無達詁」

情感分析是 NLP 的熱門任務,用在唐詩上卻特別棘手。原因有三:一是唐詩情感往往含蓄,一整個句子沒有一個情感詞;二是同一首詩可以有完全相反的解讀,董仲舒說「詩無達詁」,不是沒有道理;三是唐詩的情感常常是「複合」的,登高望遠可以同時有壯闊、孤獨、思鄉、嘆老。

比較誠實的做法,是把情感分析輸出成「多維向量」而不是單一標籤。一首詩在「壯闊—幽微」「喜—悲」「入世—出世」這些維度上各佔多少,比硬要判成「悲傷」或「豪放」有用得多。但即使是這樣,模型給出的也只是一個統計傾向,不是詩歌情感的全部。

模型會寫詩,但它懂詩嗎?

現在的大型語言模型已經能寫出格式完全正確、甚至乍看有模有樣的唐詩。如果你把一首 AI 寫的七律混進古人作品裡,大部分人第一眼分辨不出來。但這代表模型「懂詩」嗎?

我想答案是否定的。模型掌握的是「唐詩的統計規律」:什麼字常跟什麼字搭配、什麼位置該平該仄、什麼意象常一起出現。但詩的核心在於「詩人所面對的具體處境」——杜甫寫〈茅屋為秋風所破歌〉,是因為那間茅屋真的被風吹破了,那個「安得廣廈千萬間」的呼喊,背後有一個具體的、冷得睡不著覺的夜晚。模型沒有那個夜晚。

這不代表模型寫的詩沒有價值。它可以作為一種新形態的「集句」或「擬作」,也可以作為研究工具,幫助我們理解唐詩的語言機制。但如果把它當成「會寫詩的主體」,那就高估了它,也誤解了詩。

七、結語:讓演算法坐在詩人身邊

回到開頭那個長安的場景。我覺得那台筆記型電腦最理想的位置,不是取代詩人,也不是評判詩人,而是坐在詩人身邊,當一個很有耐心、記憶力很好的助手。

它可以幫詩人檢查格律,讓詩人把腦力留給意象與情感;可以幫編者整理詩集,讓編者把判斷力留給取捨與品味;可以幫學者處理五萬首詩的統計,讓學者把時間留給那些真正需要細讀的十首。它讓「形式的檢查」變成幾乎零成本,於是「內容的創造」就可以得到更多資源。

從這個角度看,NLP 之於唐詩,很像印刷術之於宋代文學:它本身不生產內容,但它改變了內容生產的成本結構,於是內容的樣貌也跟著改變。這種改變是好事還是壞事,很難一概而論,但它一定是深刻的。

所以下次當你讀到「星垂平野闊,月湧大江流」時,不妨想像一下:如果杜甫有 NLP,他大概會先確認這十個字的平仄對不對,然後皺著眉,把其中一個字改掉,再改回來,最後嘆一口氣說:「算了,就這樣吧,機器不懂。」

而我們這些讀者,大概會很慶幸他最後沒有改。

```

🏠 返回首頁