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 成為語法分析的前置階段工具。

另見