CRF序列標註模型幾個問題的理解

2021-07-16 20:38:54 字數 3427 閱讀 8608

條件隨機場模型(crf)在序列標註問題中得到廣泛應用,並且事實證明crf的效果不錯。本文就以下幾個問題寫下自己的理解:

1、哪些場景適合序列標註模型,哪些場景適合分類器模型?

edwin chen在介紹條件隨機場的博文中,通過乙個有趣的問題,引入條件隨機場序列標註問題,我們這裡不妨拿過來直接用一下:

假設你有一組關於 justin bieber的日常生活照(你可以想像成bieber是個**狂,經常在朋友圈曬**),你想標註一下這些**描繪的活動場景(比如bieber是在吃飯、參加舞會、開車,還是在睡覺呢),你會怎麼做呢?

一種方法是不考慮**的發生先後關係,通過svm、決策樹之類的分類方法,對每張**單獨分類。比如,你有事先標註的關於bieber的乙個月的日常生活照,你可以通過這些標註集訓練乙個分類器,通過這些標註集合,你可能得到乙個這樣的分類器:拍攝於晚上6點之後光線很暗的**是在睡覺,拍攝於晚上燈光閃爍的**是在參加舞會.....

通過上述方法雖然也能解決問題,但是會丟失一些資訊,比如有一張**是bieber嘴的乙個特寫,你怎麼判斷他是在吃法還是在唱歌呢?如果你能知道,這張**的前一張是關於bieber在做飯的**,那這張嘴的特寫照很可能就是在吃飯;反之,前一張**是在參加舞會,那這張特寫就更可能是在唱歌。

因此,為了提高**標註的準確性,我們就需要參考相鄰**的標註,這就是序列標註問題,也是條件隨機場能大顯身手的場景。

當然,你也許會說我在訓練分類器的時候也可以加上跟時間有關的特徵,比如上面的例子,在訓練分類器的時候,可以把標註集按時間排序,然後把每張圖前後的的類別作為分類器特徵,來訓練分類器。但是仔細想下,就會發現其中的問題,你在用這些分類器模型**上面例子中的問題時,你是不知道每張的前後相鄰的類別的,它們也是需要**的;那你可能又說,**出第一張類別後,可以把這個的類別作為特徵**下一張,但是這樣做引入的問題就是如果第一張**錯了,就會影響第二張的**,即引起誤差傳遞。而序列標註模型是把這一組**的類別作為乙個整體來**,是這個整體**準確率最高。

知乎上有人做了一下總結,我覺得總結的不錯:

標註跟分類最大的區別就是:標註採的特徵裡面有上下文分類結果,這個結果你是不知道的,他在「分類」的時候是跟上下文一起"分類的"。因為你要確定這個詞的分類得先知道上乙個詞的分類,所以這個得整句話的所有詞一起解,沒法乙個詞乙個詞解。

而分類是根據當前特徵確定當前類別,分類的時候不需要考慮上下文的分類結果,但可以引入上下文的特徵。

2. crf++的特徵模板怎麼理解

條件隨機場用的最多的應該是開源的crf++,crf++的特徵模板怎麼理解呢?

1)準備模板

上面是crf++官方文件中, base-np chunking task(語快分析)標註的模板檔案。

模板檔案中的每一行是乙個模板。每個模板都是由%x[row,col]來指定輸入資料中的乙個token。row指定到當前token的行偏移(行是相對位置),col指定列位置(列是絕對位置)。

比如以下訓練資料:第一列表示英文單詞,第二例表示詞性,第三列表示標記

由上圖可見,當前token是the這個單詞。%x[-2,1]就就是the的前兩行,1號列的元素(注意,列是從0號列開始的),即為prp。

2)模板型別

crf++有兩種型別的模板,unigram和bigram,

模板型別通過第乙個字元指定。crf模型是乙個鏈式有向無環圖,unigram模板提取的特徵是有向無環圖的點,bigram提取的是特徵是有向無環圖的邊。

第一種是unigram template:第乙個字元是u,這是用於描述unigram feature的模板。每一行%x[#,#]生成乙個crfs中的點(state)函式: f(s, o), 其中s為t時刻的的標籤(output),o為t時刻的上下文.

當給出乙個"u01:%x[0,1]"的模板時,crf++會產生如下的一些特徵函式集合(func1 ... funcn):

這幾個函式我說明一下,%x[0,1]這個特徵到前面的例子就是說,根據詞語(第1列)的詞性(第2列)來**其標註(第3列),這些函式就是反應了訓練樣例的情況,func1反映了「訓練樣例中,詞性是dt且標註是b-np的情況」,func2反映了「訓練樣例中,詞性是dt且標註是i-np的情況」。

模板函式的數量是l*n,其中l是標註集中類別數量,n是從模板中擴充套件處理的字串種類,我理解的是n就是訓練資料中,標記、詞語、詞性這個三元組不同的行數。

第二種是bigram template:第乙個字元是b,每一行%x[#,#]生成乙個crfs中的邊(edge)函式:f(s', s, o), 其中s'為t – 1時刻的標籤.也就是說,bigram型別與unigram大致機同,只是還要考慮到t – 1時刻的標籤.如果只寫乙個b的話,預設生成f(s', s),

這意味著前乙個output token和current token將組合成bigram features。目前看到的例子中bigram都只用了b乙個特徵模板,即只考慮前面乙個標記的影響,可以結合hmm的狀態轉移概率考慮。

bifram的模板會產生l * l * n種不同的特徵。

3.crf是怎麼計算測試資料的標記的?

了解crf的同學肯定都知道crf是判別模型,給定乙個句子s,要求出句子的標記,就是找出乙個標記序列l,使得p(l|s)概率最大,即

這裡n = 所有可能的標記序列數量,以中文切詞為例,假設切分標記為b、e、m、s,待切分的句子長度為m,那標記序列的數量就是4的m次方。

那麼只要我們能求出是每個標記序列l的概率

p(l|s),然後取概率最大的l,也就求出了最終的標記序列。

假設我們在訓練階段已經得到了每個特徵

(公式上第乙個求和對應特徵數,第二個求和對應句子長度)

最終,我們可以通過指數函式和歸一化,將分數轉換成概率,公式如下

上述演算法的很容易理解,但是通過列舉所有可能的標記序列,計算時間長,所以我們在幾乎所有介紹crf的資料上,都是用維特比演算法求解,具體的演算法細節我也沒深入研究過,有興趣的可以看下相關資料。

4.crf可以用哪些特徵

以crf++為例,每一列表示乙個特徵維度,理論上可以使用任意特徵,只需要在預處理階段,提取出這些特徵,放到相應的列上就可以了;具體到專案上,選哪些特徵就需要根據標註任務選擇了。

中文標準標註語料的標註中的幾個問題

想讓機器能夠跟人一些樣非常智慧型地處理自然語言,一直是我們的夢想。實現這個理想涉及到很多領域的技術,不管如何設計,自然語言處理 nlp 技術是必備的一環。而自然語言處理中,想要訓練乙個好的模型,語料是繞不過去的門檻。沒有語料,來的模型?而且語料標註規則是否統 一 自洽是訓練自動處理模型的關鍵。不管專...

幾個問題的

1.寫乙個函式返回引數二進位制中 1 的個數 比如 15 0000 1111 4 個 1 程式原型 int count one bits unsigned int value 解 無符號整型為32位,所以利用迴圈32次,逐個判斷二進位制每一位是不是1 int count one bits unsig...

String的幾個問題

1.已知strcpy的函式原型 char strcpy char strdest,const char strsrc 其中strdest 是目的字串,strsrc 是源字串。不呼叫c c 的字串庫函式,請編寫函式 strcpy。答案 char strcpy char strdest,const ch...