摘要:而event_type、role都是離散的類別,argument則是原文中的一個實體,所以官方這樣的評測指標就將這個任務退化爲普通的實體標註問題了,因此可以用常規的序列標註模型來解決,筆者的baseline以及官方的baseline,都是轉化爲序列標註任務給出的。說是說升級,但其實沒有本質變化,我們只需要把predicate和object對應的前綴拼接起來作爲不同的predicate,就退化爲常規的三元組抽取問題了,比如“飾演_@value”、“飾演_inWork”當成兩個不同的predicate分別抽取。

百度的“ 2020語言與智能技術競賽 ”開賽了,今年有五個賽道,分別是機器閱讀理解、推薦任務對話、語義解析、關係抽取、事件抽取。每個賽道中,主辦方都給出了基於PaddlePaddle的baseline模型,這裏筆者也基於 bert4keras 給出其中三個賽道的個人baseline,從中我們可以看到用bert4keras搭建baseline模型的方便快捷與簡練。

地址: https://github.com/bojone/lic2020_baselines

這裏簡單分析一下這三個賽道的任務特點以及對應的baseline設計。

樣本示例:

{
    "context": "這位朋友你好,女性出現妊娠反應一般是從6-12周左右,也就是女性懷孕1個多月就會開始出現反應,第3個月的時候,妊辰反應基本結束。 而大部分女性懷孕初期都會出現噁心、嘔吐的感覺,這些症狀都是因人而異的,除非噁心、嘔吐的非常厲害,才需要就醫,否則這些都是剛懷孕的的正常症狀。1-3個月的時候可以觀察一下自己的皮膚,一般女性懷孕初期可能會產生皮膚色素沉澱或是腹壁產生妊娠紋,特別是在懷孕的後期更加明顯。 還有很多女性懷孕初期會出現疲倦、嗜睡的情況。懷孕三個月的時候,膀胱會受到日益脹大的子宮的壓迫,容量會變小,所以懷孕期間也會有尿頻的現象出現。月經停止也是剛懷孕最容易出現的症狀,只要是平時月>      經正常的女性,在性行爲後超過正常經期兩週,就有可能是懷孕了。 如果你想判斷自己是否懷孕,可以看看自己有沒有這些反應。當然這也只是多數人的懷孕表現,也有部分女性懷孕表現並不完全是這樣,如果你無法確定自己是否懷孕,最好去醫院檢查一下。",
    "qas": [
        {
            "question": "懷孕多久會有反應",
            "id": "f2843cffb845aad0100062841222023e",
            "answers": [
                {
                    "text": "6-12周左右",
                    "answer_start": -1
                },
                {
                    "text": "6-12周",
                    "answer_start": -1
                },
                {
                    "text": "1個多月",
                    "answer_start": -1
                }
            ]
        }
    ]
}

這個baseline其實沒什麼好說的,就是經過BERT之後,接兩個全連接+Softmax分別預測答案的首和尾。有些訓練樣本標註了多個答案,但預測的時候只需要預測一個答案,所以訓練階段每次只隨機選取一個答案進行訓練。

樣本示例:

{
    "text": "謝霆鋒扮演的花無缺2004年由大導演王晶執導的40集電視連續劇《絕代雙驕》的改版《小魚兒與花無缺》上映,小編不是針對導演和演員,這部電視連續劇確實可說是天雷滾滾的魔改版,得虧全部主演憑藉顏值和演技把觀衆拴住了,故事情節改的一塌糊塗",
    "spo_list": [
        {
            "predicate": "導演",
            "object": {
                "@value": "王晶"
            },
            "subject": "小魚兒與花無缺"
        },
        {
            "predicate": "主演",
            "object": {
                "@value": "謝霆鋒"
            },
            "subject": "小魚兒與花無缺"
        },
        {
            "predicate": "主角",
            "object": {
                "@value": "花無缺"
            },
            "subject": "絕代雙驕"
        },
        {
            "predicate": "飾演",
            "object": {
                "inWork": "小魚兒與花無缺",
                "@value": "花無缺"
            },
            "subject": "謝霆鋒"
        }
    ]
}

關係抽取就是去年的三元組抽取,只不過今年做了一些升級。升級的地方在於考慮同一個predicate的多義性,比如“飾演”,有可能是指飾演了哪部電視劇,也有可能指飾演了電視劇中的哪個角色,如果同一個句子中含有多個不同的被飾演的對象(object),那麼要全部抽取出來纔算對。說是說升級,但其實沒有本質變化,我們只需要把predicate和object對應的前綴拼接起來作爲不同的predicate,就退化爲常規的三元組抽取問題了,比如“飾演_@value”、“飾演_inWork”當成兩個不同的predicate分別抽取。筆者baseline模型依然是基於去年的“半指針-半標註”設計,詳情可參考 《基於DGCNN和概率圖的輕量級信息抽取模型》

樣本示例:

{
    "text": "雀巢裁員4000人:時代拋棄你時,連招呼都不會打!",
    "id": "409389c96efe78d6af1c86e0450fd2d7",
    "event_list": [
        {
            "event_type": "組織關係-裁員",
            "trigger": "裁員",
            "trigger_start_index": 2,
            "arguments": [
                {
                    "argument_start_index": 0,
                    "role": "裁員方",
                    "argument": "雀巢",
                    "alias": [
                        
                    ]
                },
                {
                    "argument_start_index": 4,
                    "role": "裁員人數",
                    "argument": "4000人",
                    "alias": [
                        
                    ]
                }
            ],
            "class": "組織關係"
        }
    ]
}

事件抽取是一個比較新的任務,要抽取出事件類型以及描述該事件的一些元素,同一個句子可能有多個事件,同一個實體可以同時描述多個事件(比如“XX月XX日”可能同時是多個事件發生時間)。本身事件抽取是比較複雜的任務,但是這次比賽主辦方只評測(event_type, role, argument) 構成的三元組,也就是這樣的三元組匹配上了,就加1分。而event_type、role都是離散的類別,argument則是原文中的一個實體,所以官方這樣的評測指標就將這個任務退化爲普通的實體標註問題了,因此可以用常規的序列標註模型來解決,筆者的baseline以及官方的baseline,都是轉化爲序列標註任務給出的。

上面三個比賽,本質上都是抽取問題,也就是說輸出的實體都是原文中的片段。但是原始文本經過BERT的tokenizer後,不一定跟原始文本對得上了,存在小幅度的“增”、“刪”、“改”的可能性(比如轉小寫、空格數目變化、部分字符轉寫),這些小幅度的改動對於工程上的評估是無關緊要的,但是對於這種比賽或學術的評測卻是很重要的,因爲如果不同的字符哪怕看起來一樣,都會匹配錯誤。比如讀者可以把下屬代碼複製到python運行一下:

u'à' == u'à'

爲了將分詞後的結果對應回原序列,筆者專門花了點時間,給bert4keras的 Tokenizer 補充了 rematch 方法,只要傳入原始文本和分詞後的結果,那麼將會返回token到原始文本的映射關係,有了這個映射關係,就可以直接在原始文本中切片了。具體操作大家直接看baseline即可。

寫了三個baseline,又水了一篇博客~

轉載到請包括本文地址: https://kexue.fm/archives/7321

更詳細的轉載事宜請參考: 《科學空間FAQ》

如果您還有什麼疑惑或建議,歡迎在下方評論區繼續討論。

如果您覺得本文還不錯,歡迎/本文。打賞並非要從中獲得收益,而是希望知道科學空間獲得了多少讀者的真心關注。當然,如果你無視它,也不會影響你的閱讀。再次表示歡迎和感謝!

相關文章