【中文分詞】結構化感知器SP
結構化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出來的,用於解決序列標註的問題。中文分詞工具THULAC、LTP所採用的分詞模型便是基於此。
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}\)
\[ \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這一工具普遍為大家所接受,很多企業也都是利用這一工具來處理涉及中
【NLP】11大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/),其對中文分詞做的比較透徹,而且有一定的可調式性。但是應用到實際開發中的話