Writing
NLP (6) — Named Entity Recognition
Why named entity recognition is needed, with a medical-domain example covering annotation, model configuration, deployment, and optimization.
Why Named Entity Recognition Is Needed
General tools like HanLP and HTP cannot recognize domain-specific proper nouns, so dedicated NER algorithms are required. Below we use the medical domain as an example.
Annotation
-
Manual annotation
-
Machine annotation via bootstrapping — e.g. given “apple” in text about fruit, the system auto-labels “peach”, “plum”, etc. (Baidu)
-
Medical annotation example: imaging such as “head CT”; “lacunar infarction” as disease; relation: test confirms disease.

First boundary detection, then category assignment. Medical entity types include disease, disease type, symptom, test, treatment, plus modifiers for disease and symptom. English labels: (Disease), (Disease Type), (Symptom), (Test), (Treatment).
关系抽取研究主要关注这六类实体关系的抽取: 治疗和疾病之间的关系, 比如治疗施 加于疾病;
治疗和症状之间的关系, 比如为缓解症状而施加的治疗; 检查和疾病之间的关系, 比如检查证实疾 病;
检查和症状之间的关系, 比如检查发现症状; 疾病和症状之间的关系, 比如疾病导致症状;
疾病和疾病诊 断分类之间的关系, 该关系表示疾病的进展程度。
关系抽取研究主要关注这六类实体关系的抽取: 治疗和疾病之间的关系, 比如治疗施 加于疾病;
治疗和症状之间的关系, 比如为缓解症状而施加的治疗; 检查和疾病之间的关系, 比如检查证实疾 病;
检查和症状之间的关系, 比如检查发现症状; 疾病和症状之间的关系, 比如疾病导致症状;
疾病和疾病诊 断分类之间的关系, 该关系表示疾病的进展程度。
- Modifiers: absent, family (not the patient), present, conditional, possible, hypothetical, occasional
中文电子病历命名实体和实体关系标注体系及语料库构建 9 在是否发生患者本人这个方面有两个修饰:
(1)否认: 患者主动否认、或肯定不发生于患者身上。 比如: 各瓣膜区未闻及病理性杂音。 全腹无压痛、反跳痛及肌紧张。 腹壁静脉曲张: 无
(2)非患者本人: 发生于患者家属, 该种修饰可能和“否认”重叠, 若发生此种情况, 选择否认。 比如: 其父母均患有糖尿病 在发生于患者本人的确定程度这个方面有五个修饰:
(3)当前的: 肯定发生或正在发生于患者本人的疾病和症状。 比如: 头晕、呕吐伴右下肢无力。 自诉有冠心病史。 头CT示:双侧多发腔梗。
(4)有条件的: 当前不一定发生, 在某种条件具备的情况下, 才发生。 比如: 该患者于入院前3个月开始出现阵发性胸闷、心慌, 常于饮酒后出现。
(5)可能的: 不确定当前会发生, 需要进一步的证据才能确定。 比如: 不排除缺血性疾病。 右肺中下叶考虑创伤性湿肺。 临床初步诊断: 脑梗死、高血压病、糖尿病。
(6)待证实的: 当前不会发生, 但预期会发生。 比如: 手术一周后会有局部瘙痒 多在皮疹出现后1~4周左右出现血尿和 (或) 蛋白尿。
(7)偶有的: 指症状或者疾病当前不经常出现, 或者出现的频率较低。 比如: 病程中患者走路不稳, 偶有头晕。 大便偶有一过性发白。 时有胸闷气短。
- Annotation schema
3.1疾病 DIS,DISEASE
疾病必须是能够治疗的,其语义范围包括:疾病或者综合征、受伤或中毒、先天性畸形、病毒细菌、病理功能、细胞或分子功能障碍、获得性异常、解剖异常、肿瘤进程、精神或行为障碍等。
1。1。1 疾病诊断分型 DT, DISEASE TYPE
疾病的具体分类,表示疾病的进展程度,疾病诊断分类一般出现在诊断里。如:
1)失代偿期 DT
2)III期DT
3)II型 DT
3.2 症状
症状是能够被改善或治愈的,并且能够被否定词修饰,为疾病的表现。包括患者向医生陈述的不适感觉(症状)和医生观察到的(体征)或者检查结果,如:
3.2.1患者向医生陈述的不适感觉(症状) SYM,SYMPTOM
1)疼痛时伴有右下肢活动受限。(“疼痛“ 、”右下肢活动受限”);
2)伴活动后心慌气短。(“心慌”、“气短”)
3.2.2医生观察到的(体征)ST
1)双肺听诊可闻及少量痰鸣音。(“痰鸣音”)
2)自带胸片示左下肺症病变。(“左下肺症病变”)
3)双肺听诊无著征。(“著征”)
3.3 检查 TES,TEST
检查是为了发现、证实疾病或症状,找到更多关于疾病或症状的信息而施加给患者的检查项目,包括:化验过程,诊断过程等。如:
1)头CT显示脑实质内高密度灶。(“CT”)
2)血压最高达到180/130mmHg。(“血压”)
3)双肺听诊无著征。(“听诊”)
4)自带胸片示左下肺症病变。(“胸片”)
3.4 治疗
治疗是能够治疗疾病或者缓解症状而施加给患者的手段,包括手术、药品、措施等。本标注语义类型包括:药物、手术。如:
3.4.1药品 DRU,DRUG
1)奥扎格雪、脑蛋白水解物等静点 (药物“奥扎格雪”和“脑蛋白水解物”)。
3.4.2手术 SUR,SURGERY
1)4年前行胆囊切除术。(手术“胆囊切除术”)
2)鼻内镜下行双筛、双上颌窦。(手术“鼻内镜”)
3.4.3措施(非手术,非药品的治疗) PRE,precaution
3.5实体修饰词标注
3.5.1 否认词(AT,,absent)标注:
各瓣膜区未闻及病理性杂音
全腹无压痛、反跳痛及肌紧张
3.5.2条件词(CL,conditional)标注:
在某种条件具备的情况下才发生的词。
比如:该患者于入院前3个月开始出现阵发性胸闷、心慌,常于饮酒后出现。
再如:吃红薯后血糖升高
3.5.3既往信息词(PT,past)
明确表示患者过去有过的治疗史或疾病症状,比如:
有多年心脏病史。
该患者于入院前3个月开始出现阵发性胸闷、心慌,常于饮酒后出现。
3.5.4时间标注统一标为TE
该患者于入院前3个月开始出现阵发性胸闷、心慌,常于饮酒后出现。
3.5.5!!可能性词:
不确定当前会发生,需要进一步的证据确认的词。如:
不排除缺血性疾病。/右肺中下叶考虑创伤性湿肺
待证实词:当前不会发生,但预期会发生。比如:
手术一周后会有局部瘙痒
3.5.6程度词标注(AM,AMOUNT),非量化的数量描述词,如大小、多少、程度(明显等)等
双肺听诊可闻及少量痰鸣音。
3.5.7解剖位置
器官(REG,REGION)
部位词(ORG,ORGEN)
3.5.8频率词 (FW,Frequency Word)
患者走路不稳,偶有头晕。时有胸闷气短。
反复胸闷,憋气,持续时间长短不等。
Annotation format: 突发 AM 头晕 SYM 伴 O 恶心 SYM 呕吐 SYM 3小时 TE
Encoding Label IDs
Use BIESO for boundaries: Begin, Inside, End, Single, Other. BIO is also common.

Annotating Data
Split into training and test sets.

Configuration Parameters
{
"model_type": "idcnn",特征抽取的模型
"num_chars": 3538,语料库的实体数目
"char_dim": 100,每个字的维度,embedding,把3538维度进行降维
"num_tags": 51,标记的种类数目
"seg_dim": 20,把边界BIOES增维,变成20维,上采样,所以每个字是120维度,使得边界信息更加丰富
"lstm_dim": 100,120维度,卷积之后的通道数
"batch_size": 20,
"emb_file": "/usr/zxy/NER_IDCNN_CRF/data/vec.txt",
"clip": 5,防止梯度爆炸
"dropout_keep": 0.5,
"optimizer": "adam",
"lr": 0.001,
"tag_schema": "iobes",
"pre_emb": true,预序列嵌入,embeding文件
"zeros": true,
"lower": false字母小写
}
Model Save Location and Files

Backend Deployment
Use Flask; for high concurrency with many simultaneous users, Django is an option.
from flask import jsonify
from flask import Flask
from flask import request
@app.route('/', methods=['POST','GET'])
def get_text_input():
#http://127.0.0.1:5002/?inputStr="神经病"
#如果遇到显示问题:下载QQ浏览器,将编码设置为utf-8
text=request.args.get('inputStr')
#if len(text.strip())>0:
from flask import jsonify
if text:
aa=model.evaluate_line(sess, input_from_line(text, char_to_id), id_to_tag)
print(aa)
Dilated Convolution
Multiple dilated convolutions extract features with fewer parameters.

#膨胀卷积:插入rate-1个0 这里三层{1,1,2}相当于前两个没有膨胀
conv = tf.nn.atrous_conv2d(layerInput,w,rate=dilation,padding="SAME")
Challenges and Tips
-
Labels: extract high-quality samples from massive data for labeling — cover all categories and diverse vocabulary (“good and different”). Check SimHash at word level for textual repetition; prefer low SimHash for broader coverage. Optionally classify text before SimHash, then SimHash across classes. Build dictionaries (internal or crawled, cleaned); split train/test/validation (12:2:1); train character vectors; preprocess; design model; validate; deploy.
-
How to improve accuracy
-
Some tokens are very long
-
Some categories have few examples
-
English characters, digits, and special symbols — often matched with regex
-
Training pipeline: (1) preprocessing — load, convert to IOBES, char-to-id and tag-to-id maps, format conversion and feature extraction; (2) iterative model updates
Model Optimization
-
Rewrite model: replace bidirectional LSTM with dilated convolution — better for long domain-specific names. Stack conv2d×2, dilated conv, dropout, conv, softmax.
-
Learning rate
-
Initialization
-
Dropout
-
L2 regularization
-
Batch size (relatively minor effect)
Applications
-
First step in knowledge graph construction
-
After NER, extract attributes and relations — e.g. symptom causes disease, drug worsens disease
-
Search applications — e.g. Dianping search for “Quanjude”