條件隨機場 python_用條件隨機場做網絡小說命名實體識別

一直想用統計學習方法來改善撥云搜索,這次先在命名實體上小小嘗試一下。

線性鏈條件隨機場

對于無向圖中的節點,定義一組特征函數,使其狀態僅受鄰近節點和觀測序列的影響。

在標注任務中,節點只有前后兩個鄰近節點,即線性鏈條件隨機場。

按照定義,節點有兩類特征函數:轉移特征函數和狀態特征函數。轉移特征函數表示上一個節點狀態及觀測序列對當前節點的影響,狀態特征函數表示觀測序列對當前節點的影響。每個函數都有個權重,模型經過訓練后,通過函數及其權重即可推算節點狀態。

直觀地看,對于 NER 任務,文本為觀測序列,一個詞對應一個節點,標簽為節點狀態。我們為每個節點定義一組特征函數,因為節點對應的詞不一樣,它們的特征函數也不一樣。經過訓練后,模型通過詞對應的特征函數集合,即可計算出最可能的標簽。

python-CRFsuite

因為要同 python 程序銜接,這里選用 CRFsuite 庫。

與 CRF++晦澀的模板文件不同,CRFsuite 以鍵值對的形式定義特征函數。優點是靈活直觀,缺點嘛就是不太好自定義轉移特征了,不過對本文任務沒影響。

方案設計

此次任務目標是識別小說里的地名、道具、技能、門派及特殊人名等實體。由于文本的特殊性,可以預見通用的訓練語料效果不會太好。所以我用基于規則的方法來標注八本有代表性的小說,以此作為訓練語料。用另外的四本小說來評測,然后與前述規則方法的結果做比較。

訓練語料的八本小說:凡人修仙傳, 問題妹妹戀上我, 輪回劍典, 極品家丁, 雪鷹領主, 武林半俠傳, 儒道之天下霸主, 無限之高端玩家。

評測的四本小說:擇天記,大道爭鋒,魔魂啟臨,俗人回檔。

標簽采用 BMEO 四種狀態,B 實體開始,M 實體中間詞,E 實體結尾詞,O 無關詞。

預期目標

原有的規則識別是在匹配到特殊字詞后,按照特定句式、字詞及詞頻來判定是否命名實體。CRF 在定義特征時,綜合考慮了上下文內容和詞性,預計泛化會更好一點。但是語料標注及分詞詞性本身并不靠譜,估計準確率有所降低。

實現

1. 生成訓練語料

將文本分詞后, 送入原識別程序。然后對結果標注,以 json 格式保存。格式如:

["這是", "r", "O"], ["清", "a", "B"], ["虛", "d", "M"], ["門", "n", "E"], ["的", "uj", "O"], ["飛行", "vn", "O"], ["法器", "n", "O"], ["雪", "n", "O"], ["虹", "n", "O"],

單元里有文字、詞性和標簽 3 個屬性。

2. 定義特征

以當前詞及前后兩個詞的文字和詞性為特征函數。這里都是狀態特征,轉移特征是默認的。

def _word2features(wordlist, i):

""" 返回特征列表 """

features = [

'bias',

'word:'+wordlist[i][0],

'word_attr:'+wordlist[i][1]

]

if i > 0:

features.append('word[-1]:'+wordlist[i-1][0])

features.append('word[-1]_attr:'+wordlist[i-1][1])

if i > 1:

features.append('word[-2]:'+wordlist[i-2][0])

features.append('word[-2,-1]:'+wordlist[i-2][0]+wordlist[i-1][0])

features.append('word[-2]_attr:'+wordlist[i-2][1])

if i < len(wordlist)-1:

features.append('word[1]:'+wordlist[i+1][0])

features.append('word[1]_attr:'+wordlist[i+1][1])

if i < len(wordlist)-2:

features.append('word[2]:'+wordlist[i+2][0])

features.append('word[1,2]:'+wordlist[i+1][0]+wordlist[i+2][0])

features.append('word[2]_attr:'+wordlist[i+2][1])

return features

這里直接把特征屬性組合為名稱, 這樣其值就是函數權重,默認為 1。

3. 訓練模型

默認用 L-BFGS 算法訓練。 參數也并沒有調到最優。

model = pycrfsuite.Trainer(verbose=True)

model.append(train_x, train_y)

model.set_params({

'c1': 1.0, # coefficient for L1 penalty

'c2': 1e-3, # coefficient for L2 penalty

'max_iterations': 100, # stop earlier

'feature.possible_states': True,

# include transitions that are possible, but not observed

'feature.possible_transitions': True,

'feature.minfreq': 3

})

model.train("./test.crf")

4. 評測

tagger = pycrfsuite.Tagger()

tagger.open('./test.crf')

test_y = tagger.tag(test_x)

這里抽選大道爭鋒的標注結果,其他 3 本也差不多,如下:

'少清派', '邪派', '玄門正宗', '正宗玄門', '丹師', '魔宗', '瑩云', '種法術', '蛇出來', '琴楠', '大玄門', '一玄門', '一身皮', '了瑩', '大派', '丹術', '丹三', '紫眉', '丹主', '黑衣道人', '巧巧', '陣圖', '喜歡道士', '

十大玄門', '玄袍道人', '小派', '銅爐', '玄功', '劍招', '十多人', '二島', '世家玄門', '九曲溪宮', ',玄門', '派玄門', '諸多玄門', '丹成功', '劍出來', '了玄門', '責翠', '源劍', '玄門小派', '魔門', '玄門十大派', '棲鷹', '三大玄門', '丹功', '丹境', '于各個玄門', '各大派', '一桿長槍', '丹出來', '陣門', '仙派', '九轉功', '丹爐', '楚玄門', '青云一', '禽鷹', '凝功', '源經', '瑩瑩', '半聲', '祭出來', '了出來', '黑風', '玄族', '可玄門', '師出來', '主宮', '玄門大派'

規則方法結果:

'此陣', '六大魔宗', '女冠', '化形丹', '蓬遠派', '桂從堯', '功德院中', '參神契', '此水', '血魄', '自思', '玄門世家', '廣源派', '一觀', '雙翅', '闖陣', '四象陣', '沉香舟', '瀾云密冊', '討爭', '補天閣', '道姑', '晁掌閣',

'入山', '派中', '玄靈山', '清羽門下', '符書', '元陽派', '大門大派', '觀容師妹', '入陣', '善淵觀', '越真觀', '幽陰重水', '水行真光', '玄光境界', '景管事', '破陣', '寶豐觀中', '劍符', '修道者', '沉香教中', '管事', '萬福一禮', '化

丹修士', '山河童子', 'jī動', '年輕道人', '符謅', '紫眉道人', '斬神陣', '丹鼎院', '太昊派', '敗下陣', '歉然', '此丹', '劍丸', '疑 huò', '此老', '溟滄派', '張衍神色', '甫一', '碭域水國', '血衣修士', '正 sè', '少清派', '兩名老道', '

魔門', '丹煞', '觀中', '師徒一脈', '德修觀', '候伯敘', '魔簡', '入門弟子', '蒼梧山', '老道', '小金丹', '寧沖玄一', '下院入門', '化丹', '小童', '符御卿', '力士', '眾弟子', '中年修士', '文安', '文俊', '老魔', '熬通', '道訣', '丘老道', '手一', '玄光境', '丹鼎院中', '玄門正宗', '天閣', '血魄宗', '南華派', '年輕修士', '拿眼', '陣中', '小派', '北辰派', '太昊門', '化一', '陣門', '風師兄', '道書', '玲兒', '玄功', '琴楠', '儒雅道人', '神梭', '凝丹', '珍茗', '玄門十派', '沉香教', '張衍灑然', '無需多', '中年道人', '魔宗', '凕滄派', '清羽門', '守陣', '魔穴', '解讀道書', '十六派', '九魁妖王', '秀兒', '執事道童', '了聲', '化丹境界', '待張衍', '玄門大派', '陶真人門下', '兩派'

統計結果:

| 項目 | CRF | 規則 |

| ---- | ---- | ---- |

| 實體數量 | 71 | 138 |

| 都有 | 9 | 9 |

| 差異數量 | 62 | 129 |

| 準確數 | 25(35%) | 105(76%) |

| 獨有準確數 | 16(8) | -- |

正確的標準是組合正確,且確實為新實體。有多種組合方案的,都算正確,例如:紫眉和紫眉道人。

獨有準確數括號里的數字去掉了因詞頻按規則方法應拋棄的實體。

可以看出幾點:

規則方法識別的數量比 CRF 要多。這是因為語料偏少,CRF 只訓練了 8 本小說,并沒有學習到所有的規則信息。

兩者的準確率都有問題。例如 CRF 里的“了出來”,“師出來”。規則方式里的“甫一”,“正 sè”。都是錯誤地識別了人名,其原因各有不同,但 CRF 受到了標注語料的影響,有可能將錯誤率放大。

CRF 識別出了超出規則的實體,這是期望的目標。

小結

在不靠譜的訓練語料及不靠譜的評價標準下,CRF 仍然給出了有意義的結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271098.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目開發基礎:常用測試方法介紹

1、集成測試集成測試就是把模塊按照設計說明書的要求組合起來進行測試。1.1、集成測試方法&#xff1a;a、分別測試各個模塊&#xff0c;再把這些模塊組合起來進行整體測試&#xff0c;也就是非增量式集成。特點&#xff1a;可以對模塊進行并行測試&#xff0c;能充分利用人力&…

java 多數據源處理_java – 用于處理多個數據源的Spring事務管理

這可能是一個重復的問題,但我找不到(至少我無法理解)一個滿意的答案,因此再次提問.我正在使用兩個數據源(MySQL和Oracle).以下是執行流程&#xff1a;主方法-A調用方法-B(寫入Oracle DB)然后它(方法-A)調用方法-C(寫入mySQL DB)然后它(方法-A)調用方法-D(寫入Oracle DB) ).如果…

MyBatis Generator

1 <?xml version"1.0" encoding"UTF-8"?>2 <!DOCTYPE generatorConfiguration3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"4 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"&g…

svd奇異值分解_NCL專輯 | 奇異值分解(SVD)

奇異值分解SVD(Singular Value Decomposition)是一種矩陣分解方法&#xff0c;在氣象領域中常用來分析兩個氣象場場之間的關系。NCL的函數庫中與SVD相關的函數包括svd_lapack&#xff0c;svdcov&#xff0c;svdcov_sv&#xff0c;svdstd&#xff0c;svdstd_sv。svd_lapack&…

項目測試基礎:白盒測試相關知識筆記

1、白盒測試概念白盒測試又稱為結構測試&#xff0c;主要是根據程序的內部結構和邏輯來設計測試用例&#xff0c;然后對程序的路徑和過程進行測試&#xff0c;檢查是否滿足設計的需要。2、白盒測試常用的技術介紹白盒測試常用的技術有邏輯覆蓋、循環覆蓋、基本路徑測試。2.1 邏…

java全局變量和局部變量

分類&#xff1a; 變量按作用范圍劃分分為全局變量&#xff08;成員變量&#xff09;和局部變量 成員變量按調用方式劃分分為實例屬性與類屬性 局部變量按定義位置劃分分為形參&#xff0c;方法局部變量&#xff0c;代碼塊局部變量 成員變量&#xff1a; 直接在類中聲明的…

電腦系統知識:Windows原版系統與Ghost系統的區別,你知道嗎?

經常看到有電腦小白的朋友問原版操作系統跟Ghost的區別是什么&#xff0c;該怎么選擇安裝哪種系統&#xff1f;今天在這里就說說它們之間的聯系與區別。Windows原版系統&#xff1a;原版系統就是微軟推送給用戶的原始“干凈”的系統。系統不含第三方的軟件&#xff0c;軟件補丁…

sql server update觸發器_SQL Server 觸發器

T-SQL 觸發器觸發器分為BEFORE觸發器*(SQL Server不支持&#xff0c;Oracle支持)在事件發生時觸發。AFTER觸發器是 SQLServer生成的最初用于自動相應數據修改的機制。在 SQLServer200以前的版本中 AFTER觸發器是唯一的觸發器&#xff0c;因此不用指明 AFTER&#xff0c;也可以用…

iOS 公司開發者賬號申請

對于獨立開發者很有用,收藏起來,以備不時之需! 蘋果開發者賬號分三種。 個人賬號&#xff1a;個人申請用于開發蘋果app所使用的賬號&#xff0c;僅限于個人使用&#xff0c;申請比較容易&#xff0c;$99。 公司賬號&#xff1a;以公司的名義申請的開發者賬號&#xff0c;用于公…

php渲染視圖,Laravel 視圖渲染:Blade 模板引擎

Laravel 視圖渲染&#xff1a;Blade 模板引擎由 學院君 創建于3年前, 最后更新于 2年前版本號 #153378 views27 likes0 collectsBlade 簡介Blade 是由 Laravel 提供的非常簡單但功能強大的模板引擎&#xff0c;不同于其他流行的 PHP 模板引擎&#xff0c;Blade 在視圖中并不約束…

項目管理基礎:系統切換相關知識筆記

1、系統試運行主要任務對新系統進行初始化、補錄各種原始數據記錄記錄系統運行過程中的數據和狀況核對新舊系統輸出結果是否正確對實際系統的輸入方式進行考察主要包括是否方便、效率、可靠性、誤操作保護等方面。對系統實際運行、響應速度進行實際測試&#xff0c;確定是否滿足…

sql 分組統計_leetcode-sql面試題十七篇精講合集

這可能是全網最干貨的sql講解系列文章。全系列共十七講。做了大量的知識點的拓展&#xff0c;涵蓋了sql的方方面面。歡迎關注點贊收藏&#xff0c;正在整理三年數據分析的點點滴滴。包括Excel、python、sql、power BI、各種分析模型框架。保證輸出最干的干貨。涉及知識點包括&a…

實時數據處理插件開發flume+kafka+storm:flume

有時間了再寫。。。。轉載于:https://www.cnblogs.com/wchb/p/5786582.html

項目管理基礎:系統維護相關知識筆記

1、系統的可維護性系統的可維護性就是項目維護人員理解、改正、改動和改進該軟件的難易程度。提高系統的可維護性是開發軟件吸引所有步驟的關鍵目的&#xff0c;系統能否被很好地維護&#xff0c;可用系統的可維護性這一指標來衡量。1.1 系統可維護性的評價指標可理解性&#x…

java ibm 2035,C# java 連接 IBM MQ時出現 2035 或 2013認證錯誤的解決方法

當C# 或 java 連接 IBM MQ 是出現 2035 或 2013的錯誤時java的錯誤提示&#xff1a;com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 為隊列管理器“QM1”提供的安全性認證無效&#xff0c;連接方式為“Client”&#xff0c;主機名為“9.186.105.212(1414)”…

python給兩個列表排序方法_Python連接兩個字符串列表并對其元素排序的最佳方法...

假設我有兩個字符串列表&#xff1a;x[a,b] and b[c,d]我需要的最終結果是&#xff1a;^{pr2}$重要的一點是&#xff0c;我希望對列表元素的字母進行排序。在這里&#xff0c;他們是建設&#xff0c;但在我的實際問題&#xff0c;這不是這樣。所以如果我有“ba”&#xff0c;在…

mac搭建本地svn

1.終端&#xff0c;創建SVN資源文件庫 svnadmin create /Volumes/DATA/SVNTest 2配置權限 上面的語句執行完之后在相應路徑下可以找到該文件夾&#xff0c;打開之后 這里主要是修改conf里面的是三個文件&#xff1a;authz&#xff0c;passwd&#xff0c;scnserve.conf a.authz …