当前位置: 首页 > ops >正文

使用BERT/BiLSTM + CRF 模型进行NER进展记录~

使用代码处理数据集,发现了一些问题,以及解决办法~

下载了一组数据集,数据存放在CSV中,GBK格式。如下:

首先对每一列直接进行NER抽取,结果非常不好:

几乎是乱抽取的,解决办法是自己创建了一个词库:

创建词库需要对自己的数据集进行分词,然后对出现次数进行统计,我统计了前1000个:

import pandas as pd
import os
from collections import Counter
import jieba
from tqdm import tqdminput_dir = 'data/chinese_dialogue_medical'
fields = ['title', 'ask', 'answer']
all_text = []# 读取所有csv文件内容
def read_all_text():print("开始读取CSV文件...")csv_files = [f for f in os.listdir(input_dir) if f.endswith('.csv')]for file in tqdm(csv_files, desc="处理CSV文件"):path = os.path.join(input_dir, file)try:df = pd.read_csv(path, encoding='gbk')print(f"成功读取 {file} (GBK编码)")except Exception:try:df = pd.read_csv(path, encoding='gb18030')print(f"成功读取 {file} (GB18030编码)")except Exception as e:print(f"无法读取 {file}: {str(e)}")continuefor field in fields:if field in df.columns:texts = df[field].dropna().astype(str).tolist()all_text.extend(texts)print(f"从 {file} 的 {field} 字段中提取了 {len(texts)} 条文本")# 分词并统计高频词
def stat_terms():print("\n开始分词和统计...")words = []for text in tqdm(all_text, desc="分词处理"):words.extend(list(jieba.cut(text)))print("统计词频...")counter = Counter(words)# 过滤掉长度为1的词和常见无意义词stopwords = set([',', '。', '的', '了', '和', '是', '在', '我', '有', '也', '就', '不', '都', '与', '及', '或', '你', '他', '她', '吗', '啊', '吧', '哦', '呢', '!', '?', '、', ':', ';', '(', ')', '(', ')', '[', ']', '{', '}', ' ', '', '\n'])result = [(w, c) for w, c in counter.most_common() if len(w) > 1 and w not in stopwords]return resultif __name__ == '__main__':read_all_text()print(f"\n总共读取了 {len(all_text)} 条文本")result = stat_terms()print(f"\n统计出 {len(result)} 个高频词")# 输出前300个高频词到txtoutput_file = 'data/auto_medical_terms.txt'with open(output_file, 'w', encoding='utf-8') as f:for w, c in result[:1000]:f.write(f'{w}\t{c}\n')print(f'高频词统计完成,结果已保存到 {output_file}') 

然后将疾病相关的词放到我的词表中去。

基于新的词表进行训练,结果如下:

没有识别出来...解决中。 

然后发现没有正确加载词表,此外词表未加入同义词等内容。解决中。

刚刚代码有问题,修改之后重新识别。首先,我第一次设计的词表非常不完善,后续增加了中国药典、疾病指南之类的官方书籍的目录进去,现在比较全面了。

其次,我刚刚没有使用到实体识别的模型。

http://www.xdnf.cn/news/10304.html

相关文章:

  • LangChain-结合GLM+SQL+函数调用实现数据库查询(三)
  • 机器学习算法-逻辑回归
  • AWS之数据分析
  • Spring Boot 中的 Web 应用与 Reactive Web 应用
  • 上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备
  • 性能优化 - 案例篇:缓存
  • Linux《文件系统》
  • 鸿蒙OS在UniApp中集成Three.js:打造跨平台3D可视化应用#三方框架 #Uniapp
  • 深入理解享元模式:用Java实现高效对象共享
  • LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++
  • 基于Android的跳蚤市场_springboot+vue
  • 【金融基础学习】债券回购方式
  • 鸿蒙OSUniApp开发跨平台AR扫描识别应用:HarmonyOS实践指南#三方框架 #Uniapp
  • 嵌入式硬件篇---蜂鸣器
  • 常见相机的ISP算法
  • 设计模式——观察者设计模式(行为型)
  • NodeJS全栈开发面试题讲解——P5前端能力(React/Vue + API调用)
  • C#语音识别:使用Whisper.net实现语音识别
  • 从0开始学vue:Element Plus详解
  • 【算法应用】虚拟力算法VFA用于WSN覆盖,无人机网络覆盖问题
  • 《深度解构现代云原生微服务架构的七大支柱》
  • PyTorch ——torchvision数据集使用
  • 汽车安全 2030 预测 (功能安全FuSa、预期功能安全SOTIF、网络安全CyberSecurity):成本、效益与行业影响
  • gin 框架
  • C++内存学习
  • JVM学习(六)--垃圾回收
  • 《C++初阶之入门基础》【C++的前世今生】
  • [Android] APK安装器 V20160330-6.0
  • PostgreSQL优化实践:从查询到架构的性能提升指南
  • Java开发中常见的数值处理陷阱与规避方法