今天不小心寫程式到忘我了,有些問題看來今天解決不了要留到明天。今天主要在設法將昨天( [Day-09] 從政治新聞中提取人物意見的方法構想)的「從政治新聞中提取人物意見的方法構想」實作出來,不過遇到不少困難所以進度有些拖到。
在昨天的文章( [Day-09] 從政治新聞中提取人物意見的方法構想) 有提及預計會使用到 CKIP CoreNLP 這一個由中研院的中文詞庫小組 所提供的繁體中文自然語言工具,此工具包含了以下功能:
上述功能中最讓我看中的是 Constituency Parsing,昨天的構想是透過分析「將新聞片段進行 Constituency Parsing 後所得的樹狀結構」,來判斷此新聞片段中是否存在意見句以及意見句的範圍。但是不知道為什麼今天 CKIP CoreNLP 在我的電腦上一直跑不出結果,讓我完全摸不著頭緒(之前我有過一陣子的使用經驗,所以感到更納悶)。在時間的壓力下,我今天內又想了一個新的替代方案。此替代方案會使用到下列工具:
由於暫時無法使用 CKIP 的服務產生 Constituency Parsing 的結果,也沒找到其他現成的繁體中文 Constituency Parsing 工具,所以我決定嘗試改用之前沒試過的 Dependency Parsing 作為暫時性替代,如果後續順利能用於判斷新聞片段中是否存在意見句以及意見句的範圍的話,就會作為正式的方案。我目前選用的 Dependency Parsing 工具出自 Stanford NLP Group 的 Stanza。
接下來將介紹如何用上方列出的自然語言處理工具,產生繁體中文新聞片段的 Dependency Parsing 樹狀結構。
在 Available UD Models 的頁面中可以找到繁體中文的套件 — gsd,其包含了 Universal Dependencies (UD) 模型,預先在 Universal Dependencies v2.8 datasets 訓練過,覆蓋的功能包含:
用下面的指令安裝 Stanza:
pip install stanza
下面的 Python 程式用於下載 gsd 模型:
stanza.download("zh-hant")
之所以沒有直接使用 Stanza 的 pipline 來導入模型,是因為之後希望能借助 Spacy 的視覺化功能,分析 Dependency Parsing 的樹狀結構。 spacy-stanza 能在模型輸出結果不變的情況下,使用支援 Stanza 的模型搭配 Spacy 的資料結構。雖然 Spacy 也有提供可以產出 Dependency Parsing 結果的中文模型,不過我在初步嘗試時發現其預設的斷詞效果明顯不及 gsd。
用下面的指令安裝 spacy-stanza 和 Spacy:
pip install spacy
pip install spacy-stanza
下面的 Python 程式用於導入 gsd 模型:
nlp = spacy_stanza.load_pipeline("xx", lang='zh-hant')
已下面的新聞片段為例:
媒體關注數位部部長唐鳳對數位中介服務法看法,唐鳳表示,監理業務不屬於數位部範圍,面對大型跨境數位平台,最重要的是要確保現實世界中覺得合理的價值,平台上也應該符合相關的社會價值,遵守常規。 取自中央社新聞專題 — 「數位仲介服務法」的其中一篇報導。
執行下面的 Python 程式碼,讓新聞片段經過 pipline 的步驟處理:
p = "媒體關注數位部部長唐鳳對數位中介服務法看法,唐鳳表示,監理業務不屬於數位部範圍,面對大型跨境數位平台,最重要的是要確保現實世界中覺得合理的價值,平台上也應該符合相關的社會價值,遵守常規。"
doc = nlp(p)
用來儲存結果的 doc 結構由多個 token 所組成,每個 token 帶有下列資訊:
token.text
: The original token text.token.dep_
: The syntactic relation connecting child to head.token.head.text
: The original text of the token head.token.head.pos_
: The part-of-speech tag of the token head.token.children
: The immediate syntactic dependents of the token.可以利用下方的程式碼將上述資訊一一印出:
for token in doc:
print(token.text, token.dep_, token.head.text, token.head.pos_,
[child for child in token.children])
執行下面的 Python 程式碼,將經過 pipline 所輸出結果中的 Dependency Parsing 部分視覺化:
displacy.render(doc, style="dep", minify=True)
可以得到如下的圖形輸出:
下為同樣圖形的局部放大:
明天的任務就是要分析 Dependency Parsing 的樹狀結構,嘗試制定方法來判斷新聞片段中是否存在意見句以及意見句的範圍。
那今天的內容就先到這,明天繼續加油,時間允許的話會補充今天跳過的細節。
寫的有些匆忙,如果文章有錯誤,歡迎指正~