无需训练NLP模型,如何从CSV自由文本列提取医学检测值?
无需训练NLP模型的解决方案
完全可以不用训练NLP模型,你的检测记录有固定的格式规律,用正则表达式结合常规数据处理工具就能完成提取和转列操作,下面是具体实现步骤:
核心逻辑
你的每条检测记录都遵循「日期 - [可选分组标识] - 检测名称: 数值」的模式,比如:
01/03/2022 - HMG - Plaques: 65000(带分组标识)01/05/2022 - Urea: 50.0(无分组标识)
用正则表达式可以精准捕获日期、检测名称和数值,再通过数据透视转成你需要的列格式。
具体实现(以Python Pandas为例)
这是处理CSV最常用的工具,代码如下:
import pandas as pd import re # 读取CSV文件,注意分隔符是分号,处理引号包裹的内容 df = pd.read_csv('your_medical_data.csv', sep=';', quotechar='"') # 定义正则表达式:匹配每个检测项,捕获日期、检测名称、数值 # (?:.*? - )? 用来匹配可选的中间分组(如"HMG - "),兼容不同格式 pattern = r'(\d{2}/\d{2}/\d{4}) - (?:.*? - )?(.*?): (\d+\.?\d*)' # 遍历每一行,提取所有检测项 extracted_records = [] for _, row in df.iterrows(): patient_id = row['Patient'] # 找到所有匹配的检测项 matches = re.findall(pattern, row['Results']) for date, test_name, value in matches: extracted_records.append({ 'Patient': patient_id, 'Date': date, test_name: float(value) }) # 转换为DataFrame extracted_df = pd.DataFrame(extracted_records) # 转成宽格式:每个检测名称作为单独列 # 这里保留每个患者的每一次检测日期记录 wide_format_df = extracted_df.pivot( index=['Patient', 'Date'], columns=extracted_df.columns.difference(['Patient', 'Date']), values=extracted_df.columns.difference(['Patient', 'Date']) ).reset_index() # 清理列名 wide_format_df.columns = ['Patient', 'Date'] + [col for col in wide_format_df.columns if col not in ['Patient', 'Date']] # 输出结果 print(wide_format_df)
处理重复检测项
如果同一个患者同一检测有多个日期的结果(比如示例中患者1的Plaques有两次记录),上面的代码会保留每一次检测的日期和数值;如果你需要聚合结果(比如取最新日期的数值),可以添加以下步骤:
# 按Patient分组,取最新日期的检测结果 latest_results = extracted_df.sort_values('Date').groupby(['Patient']).last().reset_index() print(latest_results)
内容的提问来源于stack exchange,提问作者Abner Mácola
相关产品推荐
相关产品推荐

