1. 程式人生 > >【中文分詞】結構化感知器SP

【中文分詞】結構化感知器SP

結構化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出來的,用於解決序列標註的問題。中文分詞工具THULACLTP所採用的分詞模型便是基於此。

1. 結構化感知器

模型

CRF全域性化地以最大熵準則建模概率\(P(Y|X)\);其中,\(X\)為輸入序列\(x_1^n\)\(Y\)為標註序列\(y_1^n\)。不同於CRF建模概率函式,SP則是以最大熵準則建模score函式:

\[ S(Y,X) = \sum_s \alpha_s \Phi_s(Y,X) \]

其中,\(\Phi_s(Y,X)\)為本地特徵函式\(\phi_s(h_i,y_i)\)

的全域性化表示:

\[ \Phi_s(Y,X) = \sum_i \phi_s(h_i,y_i) \]

那麼,SP解決序列標註問題,可視作為:給定\(X\)序列,求解score函式最大值對應的\(Y\)序列:

\[ \mathop{\arg \max}_Y S(Y,X) \]

為了避免模型過擬合,保留每一次更新的權重,然後對其求平均。具體流程如下所示:

因此,結構化感知器也被稱為平均感知器(Average Perceptron)。

解碼

在將SP應用於中文分詞時,除了事先定義的特徵模板外,還用用到一個狀態轉移特徵\((y_{t-1}, y_t)\)。記在時刻\(t\)的狀態為\(y\)的路徑\(y_1^{t}\)

所對應的score函式最大值為

\[ \delta_t(y) = \max S(y_1^{t-1},X,y_t=y) \]

則有,在時刻\(t+1\)

\[ \delta_{t+1}(y) = \max_{y'} \ \{ \delta_t(y') + w_{y',y} + F(y_{t+1}=y,X) \} \]

其中,\(w_{y',y}\)為轉移特徵\((y',y)\)所對應的權值,\(F(y_{t+1}=y,X)\)\(y_{t+1}=y\)所對應的特徵模板的特徵值的加權之和。

2. 開源實現

張開旭的minitools/cws(THULAC的雛形)給出了SP中文分詞的簡單實現。首先,來看看定義的特徵模板:

def gen_features(self, x):  # 列舉得到每個字的特徵向量
    for i in range(len(x)):
        left2 = x[i - 2] if i - 2 >= 0 else '#'
        left1 = x[i - 1] if i - 1 >= 0 else '#'
        mid = x[i]
        right1 = x[i + 1] if i + 1 < len(x) else '#'
        right2 = x[i + 2] if i + 2 < len(x) else '#'
        features = ['1' + mid, '2' + left1, '3' + right1,
                    '4' + left2 + left1, '5' + left1 + mid, '6' + mid + right1, '7' + right1 + right2]
        yield features

共定義了7個特徵:

  • \(x_iy_i\)
  • \(x_{i-1}y_i\)
  • \(x_{i+1}y_i\)
  • \(x_{i-2}x_{i-1}y_i\)
  • \(x_{i-1}x_{i}y_i\)
  • \(x_{i}x_{i+1}y_i\)
  • \(x_{i+1}x_{i+2}y_i\)

將狀態B、M、E、S分別對應於數字0、1、2、3:

def load_example(words):  # 詞陣列,得到x,y
    y = []
    for word in words:
        if len(word) == 1:
            y.append(3)
        else:
            y.extend([0] + [1] * (len(word) - 2) + [2])
    return ''.join(words), y

訓練語料則採取的更新權重:

for i in range(args.iteration):
    print('第 %i 次迭代' % (i + 1), end=' '), sys.stdout.flush()
    evaluator = Evaluator()
    for l in open(args.train, 'r', 'utf-8'):
        x, y = load_example(l.split())
        z = cws.decode(x)
        evaluator(dump_example(x, y), dump_example(x, z))
        cws.weights._step += 1
        if z != y:
            cws.update(x, y, 1)
            cws.update(x, z, -1)
    evaluator.report()
    cws.weights.update_all()
    cws.weights.average()

Viterbi演算法用於解碼,與HMM相類似:

def decode(self, x):  # 類似隱馬模型的動態規劃解碼演算法
    # 類似隱馬模型中的轉移概率
    transitions = [[self.weights.get_value(str(i) + ':' + str(j), 0) for j in range(4)]
                   for i in range(4)]
    # 類似隱馬模型中的發射概率
    emissions = [[sum(self.weights.get_value(str(tag) + feature, 0) for feature in features)
                  for tag in range(4)] for features in self.gen_features(x)]
    # 類似隱馬模型中的前向概率
    alphas = [[[e, None] for e in emissions[0]]]
    for i in range(len(x) - 1):
        alphas.append([max([alphas[i][j][0] + transitions[j][k] + emissions[i + 1][k], j]
                           for j in range(4))
                       for k in range(4)])
    # 根據alphas中的“指標”得到最優序列
    alpha = max([alphas[-1][j], j] for j in range(4))
    i = len(x)
    tags = []
    while i:
        tags.append(alpha[1])
        i -= 1
        alpha = alphas[i][alpha[1]]
    return list(reversed(tags))

3. 參考資料

[1] Collins, Michael. "Discriminative training methods for hidden markov models: Theory and experiments with perceptron algorithms." Proceedings of the ACL-02 conference on Empirical methods in natural language processing-Volume 10. Association for Computational Linguistics, 2002.
[2] Zhang, Yue, and Stephen Clark. "Chinese segmentation with a word-based perceptron algorithm." Annual Meeting-Association for Computational Linguistics. Vol. 45. No. 1. 2007.
[3] Kai Zhao and Liang Huang, Structured Prediction with Perceptron: Theory and Algorithms.
[4] Michael Collins, Lecture 4, COMS E6998-3: The Structured Perceptron.

相關推薦

中文結構感知SP

結構化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出來的,用於解決序列標註的問題。中文分詞工具THULAC、LTP所採用的分詞模型便是基於此。 1. 結構化感知器 模型 CRF全域性化地以最大熵準則建模概率\(P(Y|X)\);其中,\(X\)為

中文隱馬爾可夫模型HMM

Nianwen Xue在《Chinese Word Segmentation as Character Tagging》中將中文分詞視作為序列標註問題(sequence tagging problem),由此引入監督學習演算法來解決分詞問題。 1. HMM 首先,我們將簡要地介紹HMM(主要參考了李航老師的《

中文簡單高效的MMSeg

最近碰到一個分詞匹配需求——給定一個關鍵詞表,作為自定義分詞詞典,使用者query文字分詞後,是否有詞落入這個自定義詞典中?現有的大多數Java系的分詞方案基本都支援新增自定義詞典,但是卻不支援HDFS路徑的。因此,我需要尋找一種簡單高效的分詞方案,稍作包裝即可支援HDFS。MMSeg分詞演算法正是完美地契合

中文二階隱馬爾可夫模型2-HMM

在前一篇中介紹了用HMM做中文分詞,對於未登入詞(out-of-vocabulary, OOV)有良好的識別效果,但是缺點也十分明顯——對於詞典中的(in-vocabulary, IV)詞卻未能很好地識別。主要是因為,HMM本質上是一個Bigram的語法模型,未能深層次地考慮上下文(context)。對於此,

中文最大熵馬爾可夫模型MEMM

Xue & Shen '2003 [2]用兩種序列標註模型——MEMM (Maximum Entropy Markov Model)與CRF (Conditional Random Field)——用於中文分詞;看原論文感覺作者更像用的是MaxEnt (Maximum Entropy) 模型而非MEM

中文條件隨機場CRF

之前介紹的MMEM存在著label bias問題,因此Lafferty et al. [1] 提出了CRF (Conditional Random Field). BTW:比較有意思的是,這篇文章的二作與三作同時也是MEMM的作者。 1. 前言 本節將遵從tutorial [2] 的論文結構,從概率模型(Pr

中文系列 8 更好的新詞發現演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Hadoop學習之自己動手做搜尋引擎網路爬蟲+倒排索引+中文

一、使用技術 Http協議 正則表示式 佇列模式 Lucenne中文分詞 MapReduce 二、網路爬蟲 專案目的 通過制定url爬取介面原始碼,通過正則表示式匹配出其中所需的資源(這裡是爬取csdn部落格url及部落格名),將爬到的資源存

中文系列 5. 基於語言模型的無監督

轉載:https://spaces.ac.cn/archives/3956/ 迄今為止,前四篇文章已經介紹了分詞的若干思路,其中有基於最大概率的查詞典方法、基於HMM或LSTM的字標註方法等。這些都是已有的研究方法了,筆者所做的就只是總結工作而已。查詞典方法和字

中文之HMM模型詳解

實現 含義 jieba 順序 清晰 bsp 中國 matrix 統計 關於HMM模型的介紹,網上的資料已經爛大街,但是大部分都是在背書背公式,本文在此針對HMM模型在中文分詞中的應用,講講實現原理。 盡可能的撇開公式,撇開推導。結合實際開源代碼作為例子,爭取做到雅俗共賞,

《數學之美》讀書記錄思維導圖記錄:第四章,談談中文

post IT .cn splay top style title mage blog 《數學之美》讀書記錄【思維導圖記錄】:第四章,談談中文分詞

NLP中文之jieba

宣告:本文參考jieba官方文件而成,官方連結:https://github.com/fxsjy/jieba 【一】jieba安裝 pip install jieba 【二】jieba簡介 簡介可見jieba官方說明:https://pypi.org/project/jieba/

NLP學習筆記中文

分詞通俗的講就是如何將一個句子劃分成詞語,大多數情況下不同的劃分方式會導致不同的語義。 分詞方法分類 自動分詞主要分為三個流派:規則分詞、統計分詞和混合分詞(規則+統計) 1、規則分詞 通過維護一個詞典,在切分語句時,將語句的每個字串與表中的詞進行逐一匹配,找到

Python中文並過濾停用

中文分詞並過濾停用詞,python程式碼如下。 #coding=utf-8 import jieba input_path='../data/train_pos_100.txt' output_path='../data/train_pos_100_seg.txt' st

Apache Solr系列使用IKAnalyzer中文以及自定義字典

之前寫的Apache Solr只介紹了簡單的搭建以及匯入資料等功能,最近由於專案要求,新增索引分詞和搜尋分詞功能;分詞的專案有包括好幾個:smartcn、ictclas4j、IK、jeasy、庖丁、mmseg4j; 以上幾種分詞器各有優缺點,根據不同場景可分可定製和不可定

python 走進NLP利用jieba技術中文並寫入txt

簡單介紹: 近年來,隨著NLP自然語言處理技術的日益成熟,開源實現的分詞工具也越來越多,比如NLTK:其在英文分詞較為成熟,分詞效果較好,在處理中文分詞方面則顯得力不足;在處理中文分詞時,Jieba這一工具普遍為大家所接受,很多企業也都是利用這一工具來處理涉及中

NLP11大Java開源中文的使用方法和效果對比

本文的目標有兩個: 1、學會使用11大Java開源中文分詞器 2、對比分析11大Java開源中文分詞器的分詞效果 本文給出了11大Java開源中文分詞的使用方法以及分詞結果對比程式碼,至於效果哪個好,那要用的人結合自己的應用場景自己來判斷。 11大Java開源中文分詞器,不同的分詞器

資料彙編結巴中文官方文件和原始碼分析系列文章

作者:白寧超 2016年11月23日16:49:36 摘要:結巴中文分詞的特點如下:支援三種分詞模式:(精確模式,試圖將句子最精確地切開,適合文字分析;全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合

結巴資料彙編結巴中文原始碼分析(2)

如下演算法實現分詞: 1. 基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG); 作者這個版本中使用字首字典實現了詞庫的儲存(即dict.txt檔案中的內容),而棄用之前版本的trie樹儲存詞庫,想想也是,python中實現的trie樹是基於dict型

原創中文系統 ICTCLAS2015 的JAVA封裝和多執行緒執行(附程式碼)

  本文針對的問題是 ICTCLAS2015 的多執行緒分詞,為了實現多執行緒做了簡單的JAVA封裝。如果有需要可以自行進一步封裝其它介面。   首先ICTCLAS2015的傳送門(http://ictclas.nlpir.org/),其對中文分詞做的比較透徹,而且有一定的可調式性。但是應用到實際開發中的話