彙整中文與英文的詞性標註代號:結巴斷詞器與FastTag / Identify the Part of Speech in Chinese and English
(圖片來源: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
FastTag是Mark 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等社群媒體吧!感謝你的耐心閱讀,讓我們下一篇見。
結巴跟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 形容詞
供大家參考。
如果要將這個對應表插入資料庫,可以用我寫的CSV to SQL Table
刪除http://blog.pulipuli.info/2017/11/csv-to-sql-tablecsv-import-csv-file.html
adj
刪除adv
conj
int
m
n
o
prep
pron
punc
q
u
unknown
v
繪製成表格了
刪除https://docs.google.com/spreadsheets/d/1pwCzYQ_8UIiYgsUvwk3Ei8P9-HetS9BEXoa5izh7F1E/edit?usp=sharing
Jieba在詞性上最大的問題在於一個詞僅能有個詞性,且這個詞性是字典給什麼就是什麼,例如,"預期巨大(9921)下季營收將有巨大的成長動能",Jieba並無法依語意給出適當的詞性。
回覆刪除是的,所以詞性辨識仍有許多有待改善的空間
刪除如果您有比較推薦的詞性標註工具,還請您不吝分享喔
今天在分析時,赫然發現多了一種詞性標註「yg」
回覆刪除有這樣標註的文字有:
複/yg 臺/yg 係/yg 製/yg 鬆/yg 迴/yg 釐/yg
這些詞都有各自的詞性,實在很難全部直接歸類...
不過我看大部分被分出來的詞都有名詞的屬性,所以我就把它對應到n名詞了
太了不起了,我正因為dict.txt裡有許多不明的詞性而困擾
回覆刪除To まろ(Maro Huang),
刪除能幫得上忙就好
不過還是要確認一下,你的斷詞器是結巴嗎?
其他斷詞器可能會用不同的代號喔