何老师:
您好,拜读完了您的《自然语言处理入门》,在使用过程中出现的一个小问题,还望抽空指教。
我根据规则整理了一份自己的语料库,大概内容如下:
发现/v 颈部/boy 肿物/sym [1月/t 余/nr]/date
发现/v [左/f 腹部/n]/boy 肿物/sym [1月/t 余/nr]/date
这样的语料大概有3千条(实际上几万条,但是为了识别“肿物”,抽取了只有“肿物”的样本)。
根据这些语料,我进行了词性模型训练和命名实体识别模型训练,最后,对句子:“反复发热10余天,发现颈部肿物10天” 进行预测。发热,颈部和10天都能正确的预测出自定义词性,唯独“肿物”不行。我不太清楚为什么出现这种情况。
具体代码如下:
train_pos.py
POSTrainer = JClass('com.hankcs.hanlp.model.perceptron.POSTrainer')
corpus_path = os.path.join(ner_dir, 'train_corpus_3.txt')
pos_model = os.path.join(ner_dir, 'train.pos.bin')
trainer = POSTrainer()
model = trainer.train(corpus_path, pos_model) # 训练
train_ner.py
# 命名实体识别器
NERTrainer = JClass('com.hankcs.hanlp.model.perceptron.NERTrainer')
trainer = NERTrainer()
trainer.tagSet.nerLabels.clear() # 不识别nr、ns、nt
# 目标是识别 sym
trainer.tagSet.nerLabels.add("sym")
trainer.tagSet.nerLabels.add("boy")
trainer.tagSet.nerLabels.add("date")
corpus_path = os.path.join(ner_dir, 'train_corpus_3.txt')
corpus_model = os.path.join(ner_dir, 'train.ner.bin')
model = trainer.train(corpus_path, corpus_model).getModel()
然后,使用包装类进行包装,执行预测:
perdict.py
# 预测-分析
model_path = root_path + '/dictionary/ner/train.ner.bin'
recognizer = PerceptronNERecognizer(model_path)
pos_model = root_path + '/dictionary/ner/train.pos.bin'
pos_tagger = PerceptronPOSTagger(pos_model) # 加载
analyzer = PerceptronLexicalAnalyzer(PerceptronSegmenter(), pos_tagger, recognizer)
还望,何老师指点下。万分感谢~~