ByteBard hanparse

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

概要

hanparse 是一個規則式韓語語法分析器(parser)。在本文撰寫時,已完成 詞法分析器(lexer) 的實作。主程式以 JavaScript 開發。

目的

最初的目標是開發一個可部署於 edge function 的韓語語法分析器。
隨著設計演進,專案逐步轉型為 引導分析器(bootstrap parser),用以建立後續語法處理的基礎。

演算法

從語法特性來看,韓語具有以下特徵:

  • 格驅動:語序並非最重要,句子功能主要由助詞(josa)決定。
  • 謂語優先:句子的核心概念位於謂語(predicate)。
  • 後序修飾:助詞與謂語皆位於詞彙之後。

例如,以下韓語句子:

저는 학생입니다.

可拆解為:

(저, Pronoun, "I")
(는, Particle, "topic marker")
(학생, Noun, "student")
(입니다, Predicate, "copula")
(., Punctuation, "statement marker")

由此可知,韓語句子可視為一種 「內容詞 + 文法詞」 的組合。

基於此結構,斷詞演算法設計如下:

  • 反向掃描:由後向前進行掃描。
  • 最長詞優先:當模式相同時,優先匹配較長的詞。
  • 內建優先順序:依照內建規則匹配,初始設定為 文法詞優先於內容詞。

結果

在本文撰寫時,hanparse 已實作超過 30 條規則,皆針對文法詞。
此外,系統內嵌了一個小型 專有名詞詞典,規模不到 10 個詞條,僅作為 PoC(proof of concept)。

目前,hanparse 能夠分析基本韓語句子,但 coverage 仍然不足:

  • 多數韓語句型尚未實作。
  • 「內容詞 + 文法詞」的假設並非總是成立。

例如,以下句子:

저는 대만 사람이에요.

其中的 대만(Taiwan)屬於專有名詞,因此不符合「內容詞 + 文法詞」的分析假設。

內嵌字典

最初的設計理念是僅處理 文法詞,完全依靠規則來掃描韓語句子。
然而,實際使用 hanparse 後發現,內嵌字典 仍然是必要的。

例如,在本文撰寫時,hanparse 完全無法分析以下名詞片語:

커피 한 잔(a cup of coffee)

因此,分析順序應調整為字典優先於文法詞。
雖然兩者不會同時成立,但若先用字典拆解句子,就能避免誤用文法詞而造成斷詞錯誤。

歧義處理

規則式分析器在 歧義處理 上的表現普遍不佳。
往往需要撰寫大量判斷式,但面對各種 極端案例(corner case) 仍難以妥善處理。

隨著 機械學習 與 深度學習 庫的成熟,規則式分析器的最佳定位逐漸轉向 引導分析器(bootstrap parser)。
其任務在於提供初步結構,待機械學習或深度學習模型完成後續分析,規則式分析器便完成其階段性任務,不再介入句子解析。

使用 JavaScript

這部分算是 技術棧的誤用。
原本的目標是將 hanparse 部署於 edge function 上。
然而,經過實際測試後確認,規則式分析器並不適合作為直接產品,因此以 JavaScript 撰寫並無必要。

由於 hanparse 的定位僅是 前導分析器(bootstrap parser),並非長期使用的程式,重寫也沒有意義。
因此,決定保留現有程式碼,不更換技術棧。

結論

hanparse 作為規則式韓語語法分析器,目前已完成詞法分析器並累積了基本規則。
雖然能處理部分句型,但在 coverage 與 歧義處理 上仍有明顯限制。
因此,hanparse 的最佳定位是 前導分析器(bootstrap parser),用於建立初步結構,後續再交由 機械學習 或 深度學習 模型完成更精確的分析。

未來方向可能包括:

  • 擴充 內嵌字典,提升名詞片語的處理能力。
  • 增加更多 句型規則,改善 coverage。
  • 與 ML/DL 模型結合,讓 hanparse 成為語法分析的前置階段工具。

另見