:::

彙整中文與英文的詞性標註代號:結巴斷詞器與FastTag / Identify the Part of Speech in Chinese and English

image

(圖片來源:e-Tutorial World)

文本分析時常會用到詞性(Part of Speech,簡稱POS)作為判斷依據。現在流行的中文斷詞器結巴(Jieba)具備詞性判斷的功能,這篇將整理56種詞性標記代號的意義,並加上標點符號的自訂詞典以補足結巴無法辨識標點符號的問題。此外,結巴僅會將英文詞性標示為「eng」,這難以用在中英混雜的文本中。因此我又另外找了Node.js上的pos函式庫,這是基於Mark Waston的FastTag詞性標註演算法,能夠為英文字分辨出45種不同的詞性。


中文斷詞器:結巴 / Chinese word Segmentation: Jieba

結巴是目前中文界最流行的斷詞演算法。原本是fxsjy在Python上開發的演算法,但現在廣泛用於各種程式語言,包括Node.js上的NodeJieba或JavaScript上的Jieba-JS,可參考我這篇線上中文斷詞工具:Jieba-JS

雖然結巴原作者使用簡體中文,但也支持正體(繁體)中文的斷詞處理,也能夠使用自定義詞典與停用字詞典,而且是自由的MIT授權。演算法上實作了基於前綴詞典所帶來的高效率詞圖掃描,能夠產生句子中漢字所有可能成詞情況所構成的有向無環圖(DAG)。接著採用動態規劃查找最大機率的路徑,找出基於詞頻的最大斷詞組合。對於未出現在詞典上的未知詞,結巴踩用了基於漢字成詞能力的HMM模型,並使用Viterbi演算法來辨識。

結巴斷詞器提供了四種模式:

  • 精確模式:精準地斷詞,是基礎的斷詞模式。
    輸入「我來到北京清華大學」,產生「我, 來到, 北京, 清華大學」。
  • 新詞辨識:僅找出詞典沒有的詞彙。
    輸入「他來到了網易杭研大廈」,產生「他, 來到, 了, 網易, 杭研, 大廈」。
  • 搜尋引擎模式:找出所有可能的組合,便於搜尋引擎建立關鍵字,也適用於文本分析。(注意底線的部分)
    輸入「小明碩士畢業於中國科學院計算所,後在日本東京大學深造」,產生「小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造」。
  • 全模式:混合以上三種做法的模式。
    輸入「我來到北京清華大學」,產生「我, 來到, 北京, 清華, 清華大學, 華大, 大學」。

值得注意的是,在正體(繁體)中文的使用情境下,請使用有正體(繁體)中文詞典的dict.txt.big。Python切換詞典用法請看如何使用 JIEBA 結巴中文分詞程式

    結巴的詞性標註 / Ports of Speech in Jieba

    結巴提供了詞性標註,而詞性標註方法與ICTCLAS漢語詞性標註集兼容。但結巴的詞性標註多達56種,比ICTCLAS的39種更多。我們有必要好好來看看這些詞性到底是什麼。以下詞性代碼中有標註「*」的,表示是結巴特有的詞性標註,不在ICTCLAS的範圍內。

    然而結巴的詞性標註實在太多,有時候反而不好應用。於是我又參考現代漢語詞性所定義的12種:名詞(n)、動詞(v)、形容詞(adj)、數詞(m)、量詞(q)、代詞(pron)、副詞(adv)、介詞(prep)、連詞(conj)、助詞(u)、嘆詞(int)、擬聲詞(o),嘗試將結巴的56種詞性標註對應到主要的12種。在文本分析時,比較重要的可能會是名詞(n)動詞(v)形容詞(adj)這三種詞性。附帶一提,許多詞性都是屬於語素(Morpheme),這是只最小的語法單位,是最小的語音語義結合體。

    以下是我整理結巴詞性標註的表格檔案:

    許多詞性的對應是我個人的判斷,不一定準確。請多多指教。

    詞性代碼 現代漢語詞性 詞性名稱 詞性代碼的命名方式與補充說明 舉例
    a 形容詞 形容詞 取英語形容詞adjective的第1個字母。 大, 好, 新
    ag 形容詞 形語素 形容詞性語素。形容詞代碼為a,語素代碼g前面置以a。 奇, 私, 秀
    ad 形容詞 副形詞 直接作狀語的形容詞。形容詞代碼a和副詞代碼d並在一起。 完全, 突然, 直接
    an 形容詞 名形詞 具有名詞功能的形容詞。形容詞代碼a和名詞代碼n並在一起。 安全, 困難, 矛盾
    b 形容詞 區別詞 取漢字“別”的聲母。 主要, 副, 總
    c 連詞 連接詞 取英語連詞conjunction的第1個字母。 和, 而, 但
    d 副詞 副詞 取adverb的第2個字母,因其第1個字母已用於形容詞。 不, 也, 就
    dg 副詞 副語素 副詞性語素。副詞代碼為d,語素代碼g前面置以d。只有兩個。 俱, 輒
    df * 動詞 能願動詞: 不要 專指不要 不要
    e 嘆詞 嘆詞 取英語嘆詞exclamation的第1個字母。 嗯, 哎, 咦
    eng * 外語 外語
    f 動詞 方位詞(趨向動詞) 取漢字“方”的聲母。 上, 中, 後
    g (難以判斷) 語素 絕大多數語素都能作為合成詞的“詞根”,取漢字“根”的聲母。 浠, 僭, 涔
    h 副詞 前接成分 取英語head的第1個字母。只有兩個。 非, 超低
    i 形容詞 成語 取英語成語idiom的第1個字母。 一口氣, 大吃一驚, 九曲迴腸
    j 名詞 簡稱略語 取漢字“簡”的聲母。 法, 人大, 漢
    k 代詞 後接成分 只有四個。 們, 者, 型, 式
    l (難以判斷) 慣用語 慣用語尚未成為成語,有點“臨時性”,取“臨”的聲母。 發言人, 是不是, 沒想到
    m 數詞 數詞 取英語numeral的第3個字母,n,u已有他用。 年, 一, 月, 多
    mg * 名詞 干支 只有兩個。 巳, 寅
    mq * 代詞 指示代詞 布丁註:不太確定。 這件, 這場, 一方面
    n 名詞 名詞 取英語名詞noun的第1個字母。 人, 時, 國家
    ng 名詞 名語素 名詞性語素。名詞代碼為n,語素代碼g前面置以n。 子, 身, 師, 眾
    nr 名詞 人名 名詞代碼n和“人(ren)”的聲母並在一起。 連, 王, 楊
    nrfg * 名詞 完整人名 明確可以辨別為人名的詞。 李自成, 張居正, 康熙
    nrt * 名詞 外國名詞 布丁註:不太確定。 二人, 闖王, 崇禎
    ns 名詞 地名 名詞代碼n和處所詞代碼s並在一起。 臺灣, 美國, 日本
    nt 名詞 機構團體 “團”的聲母為t,名詞代碼n和t並在一起。 國務院, 外交部
    nz 名詞 其他專名 “專”的聲母的第1個字母為z,名詞代碼n和z並在一起。 百科, 和平, 英語
    o 擬聲詞 擬聲詞 取英語擬聲詞onomatopoeia的第1個字母。 哈哈, 砰, 嗚, 嘿嘿
    p 介詞 介詞 取英語介詞prepositional的第1個字母。 在, 為, 對
    q 量詞 量詞 取英語quantity的第1個字母。 道, 個, 家
    r 代詞 代詞 取英語代詞pronoun的第2個字母,因p已用於介詞。 他, 我, 這
    rg * 代詞 只有一個。
    rr * 代詞 多數代詞 只有三個。 其他人, 妳們, 偺們
    rz * 代詞 這位 只有一個。 這位
    s 名詞 處所詞 (方位名詞) 取英語space的第1個字母。 心中, 國內, 身上
    t 副詞 時間詞 取英語time的第1個字母。 當, 現在, 當時
    tg 名詞 時語素 時間詞性語素。時間詞代碼為t,在語素的代碼g前面置以t。 現, 晚, 春
    u 助詞 助詞 取英語助詞auxiliary的第2個字母,因a已用於形容詞。 等, 之, 來說
    ud * 助詞 結構助詞: 得 只有一個。
    uj * 助詞 結構助詞: 的 只有一個。
    uv * 助詞 結構助詞: 地 只有一個。
    ug * 助詞 動態助詞: 過 只有一個。
    ul * 助詞 動態助詞: 了 只有一個。
    uz * 助詞 動態助詞: 著 只有一個。
    v 動詞 動詞 取英語動詞verb的第一個字母。 是, 有, 說
    vg 動詞 動語素 動詞性語素。動詞代碼為v。在語素的代碼g前面置以V。 喝, 言, 怒
    vd 動詞 副動詞 直接作狀語的動詞。動詞和副詞的代碼並在一起。只有三個。 持續, 狡辯, 逆勢
    vi * 動詞 不及物動詞(內動詞) 只有四個。 等同於, 徜徉於, 沉溺於, 沉緬於
    vn 動詞 名動詞 指具有名詞功能的動詞。動詞和名詞的代碼並在一起。 發展, 工作, 研究
    vq * 動詞 完成動詞 只有四個。 去過, 去淨, 唸過, 捱過
    w (標點符號) 標點符號 布丁註:結巴並沒有內建標點符號詞性。
    x (未知詞) 非語素字 非語素字只是一個符號,字母x通常用於代表未知數、符號。 榪, 姆, 灞
    y 助詞 語氣詞(語氣助詞) 取漢字“語”的聲母。 呢, 吧, 嗎
    z 形容詞 狀態詞 取漢字“狀”的聲母的前一個字母。 涓, 優良, 最佳
    zg * 副詞 副狀態詞 布丁註:不太確定。 很, 此, 較

    其中值得注意的是,結巴預設會將標點符號標示為「x」,而不是「w」。而且英文會被標示為「eng」。所以我們得要為此想其他辦法。標點符號的部分,我們可以用結巴自訂詞典的功能來擴充。至於被標示為「eng」的英文,我打算再轉交給FastTag來處理。


    標點符號的自訂詞典 / User dictionary for punctuations

    因為結巴並沒有為標點符號的詞性標註「w」加入任何設定,所以這個部分我們得要自行設定才行。在文本分析的時候,比較常會用到的有對話分析的括弧,以及表示情感跟不確定性的驚歎號與問號 (請參考文本探勘分析器這篇),因此我們有必要把這些符號區隔開來。

    標點符號的部分參考了教育部《重訂標點符號手冊》修訂版The Punctuation Guide。我依照結巴自訂詞典的格式,做了一個標點符號的詞性字典供大家參考,請從下面網址下載:

    內容如下:

    . 99999 w-PERIOD
    。 99999 w-PERIOD
    , 99999 w-COMMA
    , 99999 w-COMMA
    、 99999 w-BACK-SLOPING-COMMA
    ; 99999 w-PARENTHESES-SEMICOLON
    ; 99999 w-PARENTHESES-SEMICOLON
    : 99999 w-PARENTHESES-COLON
    : 99999 w-PARENTHESES-COLON
    “ 99999 w-PARENTHESES-QUOTATION-LEFT
    ” 99999 w-PARENTHESES-QUOTATION-RIGHT
    「 99999 w-PARENTHESES-QUOTATION-LEFT
    」 99999 w-PARENTHESES-QUOTATION-RIGHT
    『 99999 w-PARENTHESES-QUOTATION-LEFT
    』 99999 w-PARENTHESES-QUOTATION-RIGHT
    [ 99999 w-PARENTHESES-SQUARE-BRACKET-LEFT
    ] 99999 w-PARENTHESES-SQUARE-BRACKET-RIGHT
    { 99999 w-PARENTHESES-BRACE-LEFT
    } 99999 w-PARENTHESES-BRACE-RIGHT
    ( 99999 w-PARENTHESES-LEFT
    ) 99999 w-PARENTHESES-RIGHT
    ( 99999 w-PARENTHESES-LEFT
    ) 99999 w-PARENTHESES-RIGHT
    ? 99999 w-QUESTION
    ? 99999 w-QUESTION
    ! 99999 w-EXCTAMATION
    ! 99999 w-EXCTAMATION
    - 99999 w-DASH
    — 99999 w-DASH
    ~ 99999 w-DASH
    —— 99999 w-DASH
    … 99999 w-ELLIPSIS
    …… 99999 w-ELLIPSIS
    ﹏﹏ 99999 w-GUILLEMET
    《 99999 w-GUILLEMET-LEFT
    》 99999 w-GUILLEMET-RIGHT
    〈 99999 w-GUILLEMET-LEFT
    〉 99999 w-GUILLEMET-RIGHT
    _ 99999 w-GUILLEMET-RIGHT
    . 99999 w-SEPARATION-DOT
    / 99999 w-SLASH
    \ 99999 w-FORWARD-SLASH

    許多文本分析的教學都會直接過濾標點符號。但如果我們分析的是字數較少的短文,像是社群媒體的留言、討論區的內容。那標點符號就會是分析的重點之一。舉例來說,光是分析討論區中誰用問號最多,就能找出討論區中的主要發問人。


    英文的詞性標註:FastTag / Ports of Speech in English: FastTag

    FastTagMark Watson開發的詞性標註工具,詞性是來自於基於Eric Brill彙整的英文字典與規則。Percy Wegmann把FastTag移植到Node.js,成為pos-js套件。雖然Wastson最新的FastTag v2有59種詞性標註,但移植後的pos-js只有45種。

    儘管如此,pos-js的45種詞性也還是太多了。我參考了維基百科的Part of speech條目中的英文的詞性定義WordsGo的英文八大詞性說明,再將英文詞性分成9種主要詞性分類,包括名詞(noun, n.)、動詞(verb, v.)、形容詞(adjective, adj.)、副詞(adverb, adv.)、代名詞(pronoun, pron.)、介系詞(preposition, prep.)、連接詞(conjunction, conj.)、感嘆詞(interjection, int.)、冠詞(article, determiner)。不在主要詞性分類中的詞性,我加上括號來區別。跟中文一樣的,在文本分析上,名詞(n)動詞(v)形容詞(adj)這三種也可能會是比較重要的詞性。

    以下是我整理pos-js詞性標註的表格檔案:

    讓我們來看看移植FastTag的pos-js可以辨別那些詞性吧:

    詞性代碼 主要詞性分類 詞性說明 例子
    CC 連接詞 連接詞(Coord Conjuncn) and,but,or
    CD 名詞 數字(Cardinal number) one,two
    DT 冠詞 冠詞(Determiner) the,some
    EX 名詞 存在詞(Existential there) there
    FW (外語) 外語(Foreign Word) mon dieu
    IN 介系詞 介詞(Preposition) of,in,by
    JJ 形容詞 形容詞(Adjective) big
    JJR 形容詞 形容詞,比較級(Adj., comparative) bigger
    JJS 形容詞 形容詞,最高級(Adj., superlative) biggest
    LS 標點符號 列點標示(List item marker) 1,One
    MD 動詞 助動詞(Modal) can,should
    NN 名詞 名詞,單數或不可數(Noun, sing. or mass) dog
    NNS 名詞 名詞,複數(Noun, plural) dogs
    NNP 名詞 專有名詞,單數(Proper noun, sing.) Edinburgh
    NNPS 名詞 專有名詞,複數(Proper noun, plural) Smiths
    POS 介系詞 名詞所有格的完結(Possessive ending) Õs
    PDT 形容詞 前限定詞(Predeterminer) all, both
    PP$ 代名詞 所有代名詞(Possessive pronoun) my,oneÕs
    PRP 代名詞 人稱代名詞(Personal pronoun) I,you,she
    RB 副詞 助動詞(Adverb) quickly
    RBR 副詞 助動詞,比較級(Adverb, comparative) faster
    RBS 副詞 助動詞,最高級(Adverb, superlative) fastest
    RP 介系詞 虛詞(Particle) up,off
    SYM 標點符號 符號(Symbol) +,%,&
    TO 介系詞 to to
    UH 感嘆詞 感嘆詞(Interjection) oh, oops
    URL 名詞 網址(URL) http://blog.pulipuli.info/
    VB 動詞 動詞,原型(verb, base form) eat
    VBD 動詞 動詞,過去式(verb, past tense) ate
    VBG 動詞 動詞,現在進行式(verb, gerund) eating
    VBN 動詞 動詞,過去完成式(verb, past part) eaten
    VBP 動詞 動詞,現在式(Verb, present) eat
    VBZ 動詞 動詞,現在式第三人用(Verb, present) eats
    WDT 名詞 Wh開頭的限定詞(Wh-determiner) which,that
    WP 代名詞 Wh代名詞(Wh pronoun) who,what
    WP$ 代名詞 Wh所有格(Possessive-Wh) whose
    WRB 副詞 Wh助動詞(Wh-adverb) how,where
    , (標點符號) 逗點符號(Comma) ,
    . (標點符號) 句子完結符號(Sent-final punct) . ! ?
    : (標點符號) 句子中間符號(Mid-sent punct.) : ; Ñ
    $ (標點符號) 金錢符號(Dollar sign) $
    # (標點符號) 英鎊符號(Pound sign) #
    " (標點符號) 括號(quote) "
    ( (標點符號) 左括弧(Left paren) (
    ) (標點符號) 右括弧(Right paren) )

    小結 / Conclusion

    我在做碩士論文時就有用中研院的CKIP來做詞性分析。但是因為外部呼叫CKIP速度過慢,而且無法自訂詞彙,跟可自行建置的結巴斷詞器相比,方便性落了一大截。

    後來在使用結巴斷詞器的時候,赫然發現許多詞性代號都無法讓人一目瞭然。接著又發現結巴把外文詞彙通通只被標示為「eng」,而且標點符號沒有標示詞性。這些種種讓我索性乾脆捲起袖子,好好地把結巴斷詞器的詞性、pos-js的詞性、標點符號全部整理一下,就完成這一篇了。

    不過,光是整理完詞性標註,詞性辨識的工作還不算完成。現在的問題是要如何把結巴斷詞器的搜尋引擎模式、詞性標註模式跟pos-js的詞性標註整合在一起。我還得花點時間來想想怎麼把它們都在一起,這篇就先到此為止吧。


    這篇對中文與英文詞性標註的整理就到這裡為止。當然,我並不是語言學家,對於詞性的判斷上可能會有錯誤。歡迎大家在下面留言處提出指教,我會虛心檢討。如果你也跟我一樣對結巴的詞性代號煩惱已久,那這篇可能可以對你有些幫助。如果你覺得我整理的不錯的話,請幫我在AddThis分享工具按讚、將這篇分享到Facebook等社群媒體吧!感謝你的耐心閱讀,讓我們下一篇見。

    總共9 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

    1. 結巴跟pos-js的詞性對到主要詞性的對應表:
      https://docs.google.com/spreadsheets/d/1pH5odD3H7IuqhtqCbOGan3YPzdxomJkbT3cZv1JZg5M/edit?usp=sharing

      adj 形容詞
      adv 副詞
      conj 連接詞
      int 感嘆詞
      m 數詞 (結巴獨有)
      n 名詞
      o 擬聲詞
      prep 介系詞,介詞
      pron 代詞,代名詞
      punc 標點符號
      q 量詞
      u 助詞,結巴獨有
      unknown 未知詞
      v 動詞

      如果要做文本分析的話,我們比較注重的是 n 名詞、 v 動詞 、 adj 形容詞
      供大家參考。

      回覆刪除
      回覆
      1. 如果要將這個對應表插入資料庫,可以用我寫的CSV to SQL Table
        http://blog.pulipuli.info/2017/11/csv-to-sql-tablecsv-import-csv-file.html

        刪除
      2. adj
        adv
        conj
        int
        m
        n
        o
        prep
        pron
        punc
        q
        u
        unknown
        v

        刪除
      3. 繪製成表格了
        https://docs.google.com/spreadsheets/d/1pwCzYQ_8UIiYgsUvwk3Ei8P9-HetS9BEXoa5izh7F1E/edit?usp=sharing

        刪除
    2. Jieba在詞性上最大的問題在於一個詞僅能有個詞性,且這個詞性是字典給什麼就是什麼,例如,"預期巨大(9921)下季營收將有巨大的成長動能",Jieba並無法依語意給出適當的詞性。

      回覆刪除
      回覆
      1. 是的,所以詞性辨識仍有許多有待改善的空間
        如果您有比較推薦的詞性標註工具,還請您不吝分享喔

        刪除
    3. 今天在分析時,赫然發現多了一種詞性標註「yg」

      有這樣標註的文字有:
      複/yg 臺/yg 係/yg 製/yg 鬆/yg 迴/yg 釐/yg

      這些詞都有各自的詞性,實在很難全部直接歸類...
      不過我看大部分被分出來的詞都有名詞的屬性,所以我就把它對應到n名詞了

      回覆刪除
    4. 太了不起了,我正因為dict.txt裡有許多不明的詞性而困擾

      回覆刪除
      回覆
      1. To まろ(Maro Huang),

        能幫得上忙就好

        不過還是要確認一下,你的斷詞器是結巴嗎?
        其他斷詞器可能會用不同的代號喔

        刪除