### 开发文档与说明1
#### 一、项目概述
本项目主要介绍了一种基于规则的电子病历命名实体识别方法。该方法结合了模板匹配和字典匹配两种技术手段,旨在从电子病历文本中抽取有意义的医学实体。下面将详细介绍该项目的关键技术点。
#### 二、核心技术点解析
##### 1. **命名实体识别方法**
- **基于模板+字典匹配的方法**:
- **方法简介**:本项目采用了一种基于规则的方法来进行命名实体识别,其中核心组成部分包括模板匹配和字典匹配。
- **模板匹配**:模板用于定义特定实体类型的结构特征,帮助系统识别出符合这些特征的实体。
- **字典匹配**:利用预先构建的医学专业字典,对文本中的词语进行匹配,从而识别出相应的实体。如果不需要字典匹配,可以在`NER.java`中找到相关部分并注释掉。
- **命名实体类别**:命名实体主要分为五类:症状(0NER)、药品(1NER)、疾病(2NER)、检查(3NER)和其他医学实体词汇(4NER)。
- **命名实体的粒度**:项目中提到的命名实体粒度相对较粗,主要集中在上述四种命名实体上,这与其他文献中的研究方法相一致。
##### 2. **文件说明**
- **源数据**:项目中使用的医疗专业相关实体字典来源于网络,并经过一定的数据清洗过程,最终形成了不同命名实体的字典。
- **字典文件**:包括`category`、`relation`和`reserved`三个文件中的数据,分别对应不同的命名实体类别。
- **数据清洗**:通过`KeyWord.java`文件实现了数据的清洗和分类,生成了不同命名实体的字典。
- **分词处理**:为了提高命名实体识别的准确性,项目采用了第三方分词工具Bosonnlp来进行文本的预处理。
- **Bosonnlp工具**:使用Bosonnlp工具进行在线分词,该工具具有较好的中文分词能力,支持在线使用,但需注册获取API token。
- **分词结果文件**:`trainseg.txt`包含了经过分词后的电子病历文本数据,是后续命名实体提取的基础。
- **测试文件**:`test.txt`是一个用于测试的单个病历文件,用户可以通过修改主函数中的输入参数来指定测试文件。
- **GUI程序**:项目还提供了一个基于Java AWT + Swing构建的简单用户界面,便于用户操作和查看结果。需要注意的是,运行该程序时需确保所有必要的资源文件在同一目录下。
##### 3. **项目架构说明**
- **Java项目**:整个项目是以Java语言编写,其中`Main.java`是项目的入口文件。
- **IDE支持**:项目可以使用IntelliJ IDEA或Eclipse等集成开发环境进行编译和运行。
- **IntelliJ IDEA**:直接导入工程即可运行。
- **Eclipse**:需手动复制src下的代码至项目中,并确保相关数据文件位于项目目录中。
##### 4. **命名实体识别测试**
- **测试方法**:项目提供了几种测试方法,包括直接使用内置的小片段进行测试、自定义电子病历文本进行测试等。
- **内置测试案例**:项目内置了一些测试案例,可以直接运行查看命名实体识别的结果。
- **自定义测试**:用户可以自行创建电子病历文本,并通过Bosonnlp工具进行分词处理后,再进行命名实体识别的测试。
- **测试评估**:命名实体识别的效果评价主要取决于所使用的医学名词字典和规则的质量。项目中提到,由于非医学专家编写规则,可能无法覆盖所有情况,因此准确率受到一定限制。
#### 三、采用此方法的原因
项目选择了基于规则的方法,而非基于机器学习的方法,原因在于:
- **缺乏标注数据**:项目缺乏足够的标注数据,而基于机器学习的方法通常需要大量的标注数据才能达到较好的性能。
- **节省成本**:使用基于规则的方法无需大规模的人工标注,减少了时间和成本。
- **灵活性高**:规则易于调整和扩展,可以根据实际情况快速优化算法。
#### 四、总结
本项目提供了一种基于规则的电子病历命名实体识别方法,通过模板匹配和字典匹配的方式识别医学实体。项目还包括了数据预处理、测试案例等多个方面,为用户提供了较为完整的解决方案。尽管这种方法存在一定的局限性,但对于快速构建命名实体识别系统而言,不失为一个实用的选择。