在前天 [Day-10] 繁體中文的 Dependency Parsing 方法 的內容裡有大致提到如何使用 spacy-stanza 的 pipeline 搭配 Stanza 的 GSD 模型,但是依照這樣的 pipeline 設定所產生的結果並不包含 NER 的標註,且 GSD 模型在 POS 標註任務中的動詞標記只有 VERB ,沒有再更近一步細分,所以我打算透過 CKIP Transformers 工具來產生上述兩項標記,並紀錄在 spacy-stanza pipeline 產生的 doc (Python class)當中。
接下來就要分享我的流程:
本範例引用 接手中介法草案?唐鳳:監理業務不屬於數位部 的文字內容
將新聞內容以List[str]
表示:
content = ['媒體關注數位部部長唐鳳對數位中介服務法看法,唐鳳表示,監理業務不屬於數位部範圍,面對大型跨境數位平台,最重要的是要確保現實世界中覺得合理的價值,平台上也應該符合相關的社會價值,遵守常規。',
'唐鳳今天中午接受震傳媒網路節目「新聞不芹菜」的視訊採訪,主持人黃光芹詢問唐鳳對於數位中介服務法(中介法)看法,是否反對立法。',
'唐鳳表示,中介法主要是監理非法言論部份,在數位部揭牌當天就提到,數位部的工作是扮演採油門角色,監理部份並不是數位部業務。',
'唐鳳直言,NCC日前提出數位中介服務法草案,還在NCC對外界徵詢草案的階段,目前NCC也提到會整理相關民間意見、歸零思考,把草案退回到工作小組。草案先前也還沒有提到政院討論,沒有要表態的問題。',
'唐鳳指出,面對跨境大型數位平台時,最重要價值是要確保現實社會覺得合理的價值,在大型數位平台上也應該符合相關的社會價值。',
'唐鳳舉例,監察院會公布競選期間政治獻金花費,選罷法也規範境外者不能給予候選人政治獻金,必須要符合透明度以及不能收國外的錢。前幾年有人透過數位平台下廣告、幫特定候選人打廣告,等於繞過政治獻金法的規範。',
'唐鳳指出,後來也有跟平台溝通,不管在美國是什麼樣的規範,在台灣就是要揭露、不能收國外的錢,不能到平台上就不遵守相關常規。平台後來在2019年做修正,舉這個例子是要說明,還是要從社會怎麼樣合適出發,這些跨境科技平台要配合社會價值,而不是擾亂社會價值、反過來要求配合平台。']
import
相關套件:
import stanza
import spacy_stanza
from ckip_transformers.nlp import CkipPosTagger, CkipNerChunker, CkipWordSegmenter
import spacy
from spacy import displacy
from itertools import chain
下載 GSD 模型並建立 spacy_stanza
pipeline:
from spacy import displacy
nlp = spacy_stanza.load_pipeline("xx", lang='zh-hant')
寫一個可以將 ckip_transformers.nlp 的 NER 結果加到 Spacy doc 的函數:
def add_ner(doc):
ner_driver = CkipNerChunker(model="bert-base")
ner = ner_driver([str(doc)], show_progress=False)
ner_spans = []
for entity in ner[0]:
ner_spans.append(doc.char_span(entity.idx[0], entity.idx[1], label=entity.ner))
orig_ents = list(doc.ents)
doc.ents = orig_ents + ner_spans
寫一個可以將 ckip_transformers.nlp 的 POS 結果加到 Spacy doc 的函數:
def add_ckip_tag(doc):
pos_driver = CkipPosTagger(model="bert-base")
words = [[str(token) for token in doc]]
pos = pos_driver(words, show_progress=False)
for token, ckip_pos in zip(doc, pos[0]):
token.tag_ = ckip_pos
將 content
中的每一段文字內容輸入進 pipeline,並且加上 ckip_transformers.nlp 的 NER 與 POS 標註結果。
下面的程式碼中提供了一個解析的範例(可依照使用情境自定義),用途為找到 ckip_transformer.nlp 的 POS 標記為 VE 動詞的 token,接著找出被此 token 指向的,且 NER 表記為 "PERSON" 或 "ORG" 的 token,如果有找到就按照我定義的格式印出相關資訊。
for doc in nlp.pipe(content):
print(doc)
add_ner(doc)
add_ckip_tag(doc)
for token in doc:
# =================下面這部分需依照使用情境自定義=======================
if token.tag_ == 'VE':
subj = [w for w in chain(token.lefts, token.rights) if w.ent_type_ == "PERSON" or w.ent_type_ == "ORG"]
for s in subj:
print(f"{token}({token.tag_, token.ent_type_}) ---{s.dep_}---> {s}({s.tag_, s.ent_type_}) => {[t for t in s.subtree]}")
# ==================================================================
print()
可得到下面的輸出結果:
媒體關注數位部部長唐鳳對數位中介服務法看法,唐鳳表示,監理業務不屬於數位部範圍,面對大型跨境數位平台,最重要的是要確保現實世界中覺得合理的價值,平台上也應該符合相關的社會價值,遵守常規。
表示(('VE', '')) ---nsubj---> 唐(('Nb', 'PERSON')) => [唐, 鳳]
唐鳳今天中午接受震傳媒網路節目「新聞不芹菜」的視訊採訪,主持人黃光芹詢問唐鳳對於數位中介服務法(中介法)看法,是否反對立法。
唐鳳表示,中介法主要是監理非法言論部份,在數位部揭牌當天就提到,數位部的工作是扮演採油門角色,監理部份並不是數位部業務。
表示(('VE', '')) ---nsubj---> 唐(('Nb', 'PERSON')) => [唐, 鳳]
唐鳳直言,NCC日前提出數位中介服務法草案,還在NCC對外界徵詢草案的階段,目前NCC也提到會整理相關民間意見、歸零思考,把草案退回到工作小組。草案先前也還沒有提到政院討論,沒有要表態的問題。
唐鳳指出,面對跨境大型數位平台時,最重要價值是要確保現實社會覺得合理的價值,在大型數位平台上也應該符合相關的社會價值。
指出(('VE', '')) ---nsubj---> 唐(('Nb', 'PERSON')) => [唐, 鳳]
唐鳳舉例,監察院會公布競選期間政治獻金花費,選罷法也規範境外者不能給予候選人政治獻金,必須要符合透明度以及不能收國外的錢。前幾年有人透過數位平台下廣告、幫特定候選人打廣告,等於繞過政治獻金法的規範。
公布(('VE', '')) ---nsubj---> 院(('Nc', 'ORG')) => [監察, 院]
唐鳳指出,後來也有跟平台溝通,不管在美國是什麼樣的規範,在台灣就是要揭露、不能收國外的錢,不能到平台上就不遵守相關常規。平台後來在2019年做修正,舉這個例子是要說明,還是要從社會怎麼樣合適出發,這些跨境科技平台要配合社會價值,而不是擾亂社會價值、反過來要求配合平台。
從上面這個解析 Spacy 的 Dependency Parsing 的範例中可以看到,用於表示意見的動詞(例如:表示,指出),與人物('PERSON')唐鳳間存在
nsubj
的單向關係,這也許可以幫助我在日後找出意見句中的意見動詞與意見持有者的配對。不過還需要觀察更大量的文章,才知道此關係是否為能用的規則。
這個連結包含範例新聞的 Dependency Parsing 視覺化結果。 (樹狀結構)
注意:下面的 Token 是指
spacy.tokens.token.Token
類型物件
注意:下面的 Token 是指
spacy.tokens.token.Token
類型物件
寫的有些匆忙,如果文章有錯誤,歡迎指正~