前言:自然語言處理入門(何晗著)第8章 識別專門領域中的命名實體
一 自定義命名實體操作流程:
1.建立專門領域命名實體識別語料庫
a.收集該領域的文本,作為標注語料庫的原料,稱為生語料
b.標注生語料,形成熟語料
2.訓練領域模型
3.利用模型進行預測
模型預測流程:
1.對句子分詞
2.對分詞好了之后的句子,進行詞性標注
3.識別命名體,再把命名實體標注出來
二 相關代碼解析
from pyhanlp import * import os from pyhanlp.static import download, remove_file, HANLP_DATA_PATH import zipfile NERTrainer = JClass('com.hankcs.hanlp.model.perceptron.NERTrainer') AbstractLexicalAnalyzer = JClass('com.hankcs.hanlp.tokenizer.lexical.AbstractLexicalAnalyzer') PerceptronSegmenter = JClass('com.hankcs.hanlp.model.perceptron.PerceptronSegmenter') CWSTrainer = JClass('com.hankcs.hanlp.model.perceptron.CWSTrainer') PerceptronPOSTagger = JClass('com.hankcs.hanlp.model.perceptron.PerceptronPOSTagger') PerceptronNERecognizer = JClass('com.hankcs.hanlp.model.perceptron.PerceptronNERecognizer') POSTrainer = JClass('com.hankcs.hanlp.model.perceptron.POSTrainer') PLANE_ROOT = 'C:\\Users\\DELL\\Desktop\\NL' PLANE_CORPUS = os.path.join(PLANE_ROOT, 'test_ner.txt') PLANE_MODEL = os.path.join(PLANE_ROOT, 'model.bin') if __name__ == '__main__': #訓練模型並保存模型 trainer = NERTrainer()#命令實體分詞器 trainer.tagSet.nerLabels.clear() # 不識別nr、ns、nt trainer.tagSet.nerLabels.add("purchaser") # 目標是識別purchase trainer.train(PLANE_CORPUS, PLANE_MODEL).getModel() #生成命令實體分詞模型,並保存 # #加載模型 recognizer = PerceptronNERecognizer(os.path.join(PLANE_ROOT, 'model.bin')) #加載命令實體分詞模型
##分詞訓練 在NER預測前,需要一個分詞器,最好訓練自同源語料庫 CWS_CORPUS= 'C:\\Users\\DELL\\Desktop\\NL\\test_ner.txt' PLANE_EMPTY_MODEL='C:\\Users\\DELL\\Desktop\\NL\\cws.bin' CWS_MODEL = CWSTrainer().train(CWS_CORPUS,PLANE_EMPTY_MODEL).getModel() #普通分詞器訓練后得到的分詞模型並保存模型 CWS_MODEL = os.path.join(PLANE_ROOT, 'cws.bin')#分詞模型保存路徑 # 詞性訓練 corpus = 'C:\\Users\\DELL\\Desktop\\NL\\test_pos.txt' POS_MODEL = 'C:\\Users\\DELL\\Desktop\\NL\\pos.bin' trainer = POSTrainer() POSMODEL = trainer.train(corpus, POS_MODEL).getModel() # 標注訓練並保存文件 POSMODEL = 'C:\\Users\\DELL\\Desktop\\NL\\pos.bin' # 詞性模型文件保存路徑 analyzer = AbstractLexicalAnalyzer(PerceptronSegmenter(CWS_MODEL), PerceptronPOSTagger(POSMODEL), recognizer).enableCustomDictionary(True) print(analyzer.analyze("2、采購人名稱:;福建福州人民醫院;")) #print(analyzer.analyze("F-22橫空出世。"))