国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用Keras+LSTM+CRF的實踐命名實體識別NER

人工智能 深度學習
命名實體識別屬于序列標注任務,其實更像是分類任務,NER是在一段文本中,將預先定義好的實體類型識別出來。

[[339715]]

文本分詞、詞性標注和命名實體識別都是自然語言處理領域里面很基礎的任務,他們的精度決定了下游任務的精度,其實在這之前我并沒有真正意義上接觸過命名實體識別這項工作,雖然說讀研期間斷斷續續也參與了這樣的項目,但是畢業之后始終覺得一知半解的感覺,最近想重新撿起來,以實踐為學習的主要手段來比較系統地對命名實體識別這類任務進行理解、學習和實踐應用。

當今的各個應用里面幾乎不會說哪個任務會沒有深度學習的影子,很多子任務的發展歷程都是驚人的相似,最初大部分的研究和應用都是集中在機器學習領域里面,之后隨著深度學習模型的發展,也被廣泛應用起來了,命名實體識別這樣的序列標注任務自然也是不例外的,早就有了基于LSTM+CRF的深度學習實體識別的相關研究了,只不過與我之前的方向不一致,所以一直沒有化太多的時間去關注過它,最近正好在學習NER,在之前的相關文章中已經基于機器學習的方法實踐了簡單的命名實體識別了,這里以深度學習模型為基礎來實現NER。

命名實體識別屬于序列標注任務,其實更像是分類任務,NER是在一段文本中,將預先定義好的實體類型識別出來。

NER是一種序列標注問題,因此他們的數據標注方式也遵照序列標注問題的方式,主要是BIO和BIOES兩種。這里直接介紹BIOES,明白了BIOES,BIO也就掌握了。

先列出來BIOES分別代表什么意思: 

  1. B,即Begin,表示開始  
  2. I,即Intermediate,表示中間  
  3. E,即End,表示結尾  
  4. S,即Single,表示單個字符  
  5. O,即Other,表示其他,用于標記無關字符 

比如對于下面的一句話:

  1. 姚明去哈爾濱工業大學體育館打球了 

標注結果為: 

  1. 姚明 去 哈爾濱工業大學 體育館 打球 了  
  2. B-PER E-PER O B-ORG I-ORG I-ORG I-ORG I-ORG I-ORG E-ORG B-LOC I-LOC E-LOC O O O 

簡單的溫習就到這里了,接下來進入到本文的實踐部分,首先是數據集部分,數據集來源于網絡獲取,簡單看下樣例數據,如下所示:

train_data部分樣例數據如下所示: 

  1. 當 O  
  2. 希 O  
  3. 望 O  
  4. 工 O  
  5. 程 O  
  6. 救 O  
  7. 助 O  
  8. 的 O  
  9. 百 O  
  10. 萬 O  
  11. 兒 O 
  12. 童 O  
  13. 成 O  
  14. 長 O  
  15. 起 O  
  16. 來 O  
  17. , O  
  18. 科 O  
  19. 教 O  
  20. 興 O  
  21. 國 O  
  22. 蔚 O  
  23. 然 O  
  24. 成 O  
  25. 風 O  
  26. 時 O  
  27. , O  
  28. 今 O  
  29. 天 O  
  30. 有 O  
  31. 收 O  
  32. 藏 O  
  33. 價 O  
  34. 值 O  
  35. 的 O  
  36. 書 O  
  37. 你 O  
  38. 沒 O  
  39. 買 O  
  40. , O  
  41. 明 O  
  42. 日 O  
  43. 就 O  
  44. 叫 O  
  45. 你 O  
  46. 悔 O  
  47. 不 O  
  48. 當 O  
  49. 初 O  
  50. !O 

test_data部分樣例數據如下所示: 

  1. 高 O  
  2. 舉 O  
  3. 愛 O  
  4. 國 O  
  5. 主 O  
  6. 義 O 
  7. 和 O  
  8. 社 O  
  9. 會 O  
  10. 主 O  
  11. 義 O  
  12. 兩 O  
  13. 面 O  
  14. 旗 O  
  15. 幟 O  
  16. , O  
  17. 團 O  
  18. 結 O  
  19. 全 O  
  20. 體 O  
  21. 成 O  
  22. 員 O  
  23. 以 O  
  24. 及 O  
  25. 所 O  
  26. 聯 O  
  27. 系 O  
  28. 的 O  
  29. 歸 O  
  30. 僑 O 
  31. 、 O  
  32. 僑 O  
  33. 眷 O  
  34. , O  
  35. 發 O  
  36. 揚 O  
  37. 愛 O  
  38. 國 O  
  39. 革 O  
  40. 命 O  
  41. 的 O  
  42. 光 O  
  43. 榮 O  
  44. 傳 O  
  45. 統 O  
  46. , O  
  47. 為 O  
  48. 統 O  
  49. 一 O  
  50. 祖 O  
  51. 國 O  
  52. 、 O  
  53. 振 O  
  54. 興 O  
  55. 中 B-LOC  
  56. 華 I-LOC  
  57. 而 O  
  58. 努 O  
  59. 力 O  
  60. 奮 O  
  61. 斗 O  
  62. ;O 

簡單了解訓練集數據和測試集數據結構后就可以進行后面的數據處理,主要的目的就是生成特征數據,核心代碼實現如下所示: 

  1. with open('test_data.txt',encoding='utf-8') as f:  
  2.     test_data_list=[one.strip().split('\t') for one in f.readlines() if one.strip()]  
  3. with open('train_data.txt',encoding='utf-8') as f:  
  4.     train_data_list=[one.strip().split('\t') for one in f.readlines() if one.strip()]  
  5. char_list=[one[0] for one in test_data_list]+[one[0] for one in train_data_list]  
  6. label_list=[one[-1] for one in test_data_list]+[one[-1] for one in train_data_list]  
  7. print('char_list_length: ', len(char_list))  
  8. print('label_list_length: ', len(label_list))  
  9. print('char_num: ', len(list(set(char_list))))  
  10. print('label_num: ', len(list(set(label_list)))) 
  11. char_count,label_count={},{}  
  12. #字符頻度統計  
  13. for one in char_list:  
  14.     if one in char_count:  
  15.         char_count[one]+=1  
  16.     else:  
  17.         char_count[one]=1  
  18. for one in label_list:  
  19.     if one in label_count:  
  20.         label_count[one]+=1  
  21.     else:  
  22.         label_count[one]=1    
  23. #按頻度降序排序  
  24. sortedsorted_char=sorted(char_count.items(),key=lambda e:e[1],reverse=True 
  25. sortedsorted_label=sorted(label_count.items(),key=lambda e:e[1],reverse=True)   
  26. #字符-id映射關系構建  
  27. char_map_dict={}  
  28. label_map_dict={}  
  29. for i in range(len(sorted_char)):  
  30.     char_map_dict[sorted_char[i][0]]=i  
  31.     char_map_dict[str(i)]=sorted_char[i][0]  
  32. for i in range(len(sorted_label)):  
  33.     label_map_dict[sorted_label[i][0]]=i  
  34.     label_map_dict[str(i)]=sorted_label[i][0]  
  35. #結果存儲  
  36. with open('charMap.json','w') as f:  
  37.     f.write(json.dumps(char_map_dict))  
  38. with open('labelMap.json','w') as f:  
  39.     f.write(json.dumps(label_map_dict)) 

代碼實現的很清晰,關鍵的部分也都有對應的注釋內容,這里就不多解釋了,核心的思想就是將字符或者是標簽類別數據映射為對應的index數據,這里我沒有對頻度設置過濾閾值,有的實現里面會過濾掉只出現了1次的數據,這個可以根據自己的需要進行對應的修改。

charMap數據樣例如下所示:

labelMap數據樣例如下所示:

在生成上述映射數據之后,就可以對原始的文本數據進行轉化計算,進而生成我們所需要的特征數據了,核心代碼實現如下所示: 

  1. X_train,y_train,X_test,y_test=[],[],[],[]  
  2. #訓練數據集  
  3. for i in range(len(trainData)):  
  4.     one_sample=[one.strip().split('\t') for one in trainData[i]]  
  5.     char_list=[O[0] for O in one_sample]  
  6.     label_list=[O[1] for O in one_sample]  
  7.     char_vec=[char_map_dict[char_list[v]] for v in range(len(char_list))]  
  8.     label_vec=[label_map_dict[label_list[l]] for l in range(len(label_list))]  
  9.     X_train.append(char_vec)  
  10.     y_train.append(label_vec)  
  11. #測試數據集  
  12. for i in range(len(testData)):  
  13.     one_sample=[one.strip().split('\t') for one in testData[i]] 
  14.     char_list=[O[0] for O in one_sample]  
  15.     label_list=[O[1] for O in one_sample]  
  16.     char_vec=[char_map_dict[char_list[v]] for v in range(len(char_list))]  
  17.     label_vec=[label_map_dict[label_list[l]] for l in range(len(label_list))]  
  18.     X_test.append(char_vec)  
  19.     y_test.append(label_vec)  
  20. feature={}  
  21. feature['X_train'],feature['y_train']=X_train,y_train  
  22. feature['X_test'],feature['y_test']=X_test,y_test  
  23. #結果存儲  
  24. with open('feature.json','w') as f:  
  25.     f.write(json.dumps(feature)) 

到這里我們已經得到了我們所需要的特征數據,且已經劃分好了測試集數據和訓練集數據。

接下來就可以構建模型了,這里為了簡化實現,我采用的是Keras框架,相比于原生態的Tensorflow框架來說,上手門檻更低,核心代碼實現如下所示: 

  1. #加載數據集  
  2. with open('feature.json') as f:  
  3.     F=json.load(f)  
  4. X_train,X_test,y_train,y_test=F['X_train'],F['X_test'],F['y_train'],F['y_test']  
  5. #數據對齊操作 
  6.  X_train = pad_sequences(X_train, maxlen=max_lenvalue=0 
  7. y_train = pad_sequences(y_train, maxlen=max_lenvalue=-1)  
  8. y_train = np.expand_dims(y_train, 2)  
  9. X_test = pad_sequences(X_test, maxlen=max_lenvalue=0 
  10. y_test = pad_sequences(y_test, maxlen=max_lenvalue=-1)  
  11. y_test = np.expand_dims(y_test, 2)  
  12. #模型初始化、訓練  
  13. if not os.path.exists(saveDir):  
  14.     os.makedirs(saveDir)  
  15. #模型初始化  
  16. model = Sequential() 
  17. model.add(Embedding(voc_size, 256, mask_zero=True))  
  18. model.add(Bidirectional(LSTM(128, return_sequences=True)))  
  19. model.add(Dropout(rate=0.5))  
  20. model.add(Dense(tag_size))  
  21. crf = CRF(tag_size, sparse_target=True 
  22. model.add(crf)  
  23. model.summary() 
  24. model.compile('adam', loss=crf.loss_function, metrics=[crf.accuracy])  
  25. #訓練擬合  
  26. history=model.fit(X_train,y_train,batch_size=100,epochs=500,validation_data=[X_test,y_test])  
  27. model.save(saveDir+'model.h5')  
  28. #模型結構可視化  
  29. try: 
  30.      plot_model(model,to_file=saveDir+"model_structure.png",show_shapes=True 
  31. except Exception as e:  
  32.     print('Exception: ', e) 
  33.  #結果可視化  
  34. plt.clf()  
  35. plt.plot(history.history['acc'])  
  36. plt.plot(history.history['val_acc'])  
  37. plt.title('model accuracy')  
  38. plt.ylabel('accuracy')  
  39. plt.xlabel('epochs')  
  40. plt.legend(['train','test'], loc='upper left' 
  41. plt.savefig(saveDir+'train_validation_acc.png')  
  42. plt.clf()  
  43. plt.plot(history.history['loss'])  
  44. plt.plot(history.history['val_loss'])  
  45. plt.title('model loss')  
  46. plt.ylabel('loss')  
  47. plt.xlabel('epochs')  
  48. plt.legend(['train', 'test'], loc='upper left' 
  49. plt.savefig(saveDir+'train_validation_loss.png')  
  50. scores=model.evaluate(X_test,y_test,verbose=0 
  51. print("Accuracy: %.2f%%" % (scores[1]*100))  
  52. modelmodel_json=model.to_json()  
  53. with open(saveDir+'structure.json','w') as f:  
  54.     f.write(model_json)  
  55. model.save_weights(saveDir+'weight.h5')  
  56. print('===Finish====') 

訓練完成后,結構目錄文件結構如下所示:

模型結構圖如下所示:

訓練過程中準確度曲線如下所示:

訓練過程中損失值曲線如下所示:

由于訓練計算資源占用比較大,且時間比較長,我這里只是簡單地設置了20次的迭代計算,這個可以根據自己的實際情況設置更高的或者是更低的迭代次數來實現不同的需求。

簡單的預測實例如下所示:

到這里,本文的實踐就結束了,后面有時間繼續深入研究,希望對您有所幫助,祝您工作順利,學有所成! 

 

責任編輯:龐桂玉 來源: Python中文社區
相關推薦

2017-05-31 12:59:44

神經網絡深度學習

2024-03-18 13:36:36

大型語言模型個人可識別信息

2017-05-25 11:24:18

達觀數據NER系統

2023-06-26 06:55:25

2018-01-04 15:50:44

深度學習自然語言機器學習

2020-05-27 11:10:54

KerasLSTM神經網絡

2022-07-19 14:01:44

阿里達摩院AI

2017-11-20 11:51:40

KerasLSTM深度學習

2021-07-16 08:10:06

識別實體對象

2017-11-10 11:51:39

Python自然語言分析器

2024-04-11 10:20:57

JavaScript前端Web

2017-04-26 09:30:53

卷積神經網絡實戰

2020-03-04 10:51:35

Python算法腳本語言

2021-02-03 13:56:09

KerasAPI深度學習

2020-06-05 18:57:41

BiLSTMCRF算法

2022-02-23 09:03:29

JavaScript開發命名約定

2022-06-17 10:44:49

實體鏈接系統旅游AI知識圖譜攜程

2023-12-06 07:24:42

屬性命名云原生

2023-02-14 10:37:43

API端點版本
點贊
收藏

51CTO技術棧公眾號

在线色视频网| 91精品国产黑色瑜伽裤| 禁久久精品乱码| 亚洲日韩第一页| 亚洲国产精华液| 国产精品香蕉一区二区三区| 成人性生交大片免费看视频直播| 亚洲最新无码中文字幕久久| 午夜a成v人精品| 少妇高潮喷水久久久久久久久久| 亚洲巨乳在线| 国产精品色午夜在线观看| 免费一区二区三区四区| 宅男噜噜噜66国产精品免费| 西野翔中文久久精品字幕| 久久亚洲精品国产精品紫薇| 国产精品久久久久久久电影| 超碰在线最新| 最新精品国产| 玉足女爽爽91| 久久免费高清视频| 国产成人精品免费看在线播放| aa亚洲一区一区三区| 亚洲免费观看高清完整版在线观看 | 香蕉视频网站在线观看| 91丨九色丨尤物| 日韩一区二区三区在线观看 | 欧美mv日韩mv国产网站| 国内精品久久久久久久久| 国产成人在线免费看| 欧美日韩五区| 97精品久久久午夜一区二区三区 | 久久久不卡网国产精品二区| 国产精品日韩高清| 一本久久青青| 韩国v欧美v日本v亚洲| 91精品国产色综合久久不卡粉嫩| 精品偷拍各种wc美女嘘嘘| 欧美高清另类hdvideosexjaⅴ| 337p亚洲精品色噜噜狠狠| 国产一区电影| 欧美日韩亚洲高清一区二区| 国产精品二线| 欧美日韩一级视频| 亚乱亚乱亚洲乱妇| 日韩一区二区三区在线视频| 国产高清在线a视频大全| 亚洲电影在线看| www.youjizz.com在线| 日韩成人激情视频| 日韩av首页| 亚洲欧美另类在线观看| 成人国产一区二区三区精品麻豆| 在线色欧美三级视频| 久久九九精品视频| 国内偷自视频区视频综合| 国产精品久久久久av蜜臀| 91高清在线免费观看| av一区二区在线播放| 亚洲free性xxxx护士白浆| 亚洲视频高清| 宅男噜噜99国产精品观看免费| 久久99国产乱子伦精品免费| 欧美亚洲另类色图| 亚洲黄色片在线观看| 天堂在线中文字幕| 欧美一级日韩免费不卡| 三上悠亚国产精品一区二区三区| 中文字幕亚洲色图| 免费萌白酱国产一区二区三区| 国产精品美乳一区二区免费 | 香蕉成人久久| 日本一区二区不卡高清更新| 国产精品资源站在线| 日本熟妇人妻中出| 亚洲成年人网站在线观看| 成人18在线| 日韩精品一二三四区| 一区二区网站| 91超碰在线免费观看| 美国一区二区三区在线播放| 欧美日韩中文在线视频| 亚洲观看高清完整版在线观看 | 国产欧美精品日韩区二区麻豆天美| 丝袜制服影音先锋| 欧美日韩国产成人在线免费| 亚洲成人av观看| 国产精品视频成人| 精品一区二区三区在线播放视频 | 日本无删减在线| 欧美成人精品激情在线观看| 亚洲91视频| 91免费版看片| 一区二区三区 在线观看视频| 色呦呦久久久| 久久久久中文字幕| 国产精品美女久久久| 国产aaa一级片| 欧美日韩免费一区二区三区视频| 电影一区二区| 国产伦精品一区二区三区照片91 | 中日韩美女免费视频网址在线观看 | 成人久久一区二区三区| 国内外成人在线视频| 男人免费av| 亚洲精品网址在线观看| 国产精品一区二区av交换| 亚洲一区二区免费视频软件合集| 亚洲美女在线国产| 美女100%一区| 成人欧美一区二区| 久久久久9999亚洲精品| 国内精品久久久久久野外| 欧美资源在线观看| 精品系列免费在线观看| 青青草超碰在线| 久久久久久久香蕉网| 蜜臀久久99精品久久久画质超高清| 裸体av在线| 一区二区三区亚洲| 99热精品在线| 久久久精品天堂| 电影av在线| 欧美一级免费视频| 国产乱子轮精品视频| 91成人高清| 91成人在线播放| 高清免费成人av| 国产理论电影在线| 国产福利一区二区三区在线观看| 亚洲欧美日韩国产综合在线| 久久久久久一区二区三区四区别墅| 久久久久se| 欧美三级免费观看| 国产亚洲一卡2卡3卡4卡新区 | 国产激情视频一区二区在线观看| 国产剧情在线观看| 日本精品va在线观看| 久久综合久久综合亚洲| 久久毛片亚洲| 成人手机视频在线| 日韩一区二区三区电影在线观看 | 欧美男女性生活在线直播观看| 国产在线日韩精品| 日韩av片网站| 日韩视频一区在线| 成人午夜视频在线| 欧美色网在线| 天堂а√在线中文在线| 欧美精品一区二区三区四区| 久久精品伊人| 欧美四级在线| 伊人久久婷婷色综合98网| 日韩精品一区二区三区视频播放| 亚洲欧美网站| 黑人精品视频| mm131午夜| 国产亚洲综合久久| 国产成人高清在线| 成人在线观看免费视频| 人妻激情另类乱人伦人妻| 亚洲欧洲成视频免费观看| 国产乱码精品一区二区三区av | 成人性生交大片免费看网站| 欧美日韩在线不卡一区| 4438x亚洲最大成人网| 乱人伦精品视频在线观看| 深夜国产在线播放| 中国老女人av| 久久天天躁狠狠躁老女人| 久久精品无码一区二区三区| 日本一区福利在线| 写真福利理论片在线播放| 91中文字幕一区| 欧美在线视频日韩| 可以免费看不卡的av网站| 亚洲v.com| 波多野结衣家庭教师视频| 91精品国产乱码久久久久久久久| 亚洲伊人色欲综合网| 1024日韩| 欧美极度另类| 日韩精品xxxx| 57pao精品| 色婷婷综合久久久中文一区二区 | 97高清视频| 成人黄色生活片| 日韩女优av电影在线观看| 国产91在线|亚洲| 日韩一区二区三区高清在线观看| 啊啊啊啊啊好爽| 国产美女精品久久久| 日韩精品欧美国产精品忘忧草 | 色青青草原桃花久久综合| 国产丝袜欧美中文另类| 精品一区二区三区在线| 99免在线观看免费视频高清| 无码人妻精品一区二区蜜桃网站| 欧美激情亚洲综合一区| 色老汉一区二区三区|