如何用NLP(NLTK)识别Python DataFrame中的诊断短语组合?
找出最常见的诊断组合解决方案
你不需要用NLTK这类NLP库,因为这本质是结构化数据的组合统计问题,用Python标准库就能高效解决。以下是具体实现步骤:
步骤1:数据预处理(恢复患者-诊断集合)
首先把explode后的表格重新按患者ID分组,去重后得到每个患者的诊断集合(避免同一患者的重复诊断干扰统计):
import pandas as pd import numpy as np from itertools import combinations from collections import Counter # 生成示例数据(和你提供的一致) ids = ['id1', 'id2', 'id3','id4','id5'] diagnosis = ["Broken Wind","Chronic Nosehair","Corrugated Ankles","Discrete Itching"] df = pd.DataFrame({'id': ids}) df['diagnosis'] = df['id'].apply(lambda x: np.random.choice(diagnosis, 5).tolist()) df_exploded = df.explode('diagnosis') # 按ID分组,去重后得到每个患者的诊断集合 patient_diagnoses = df_exploded.groupby('id')['diagnosis'].unique().apply(set).tolist()
步骤2:生成并统计诊断组合
根据需求生成指定长度的组合(比如2元、3元,或所有≥2元的组合),再统计每个组合的出现次数:
示例1:统计所有2元诊断组合
all_2combos = [] for diag_set in patient_diagnoses: # 只处理有至少2种诊断的患者 if len(diag_set) >= 2: # 排序后生成组合,确保(A,B)和(B,A)被算作同一组合 combos = combinations(sorted(diag_set), 2) all_2combos.extend(combos) # 统计频率并降序排序 combo_counts = Counter(all_2combos) sorted_2combos = sorted(combo_counts.items(), key=lambda x: x[1], reverse=True) # 输出前5个最常见的组合 print("Top 5 二元诊断组合:") for combo, count in sorted_2combos[:5]: print(f"{', '.join(combo)}: {count} 次")
示例2:统计所有≥2元的诊断组合
如果需要同时查看2元、3元甚至更多元的组合,可调整代码:
all_combos = [] min_length = 2 # 最小组合长度 for diag_set in patient_diagnoses: diag_list = sorted(diag_set) n = len(diag_list) if n >= min_length: # 生成从min_length到n的所有长度的组合 for length in range(min_length, n+1): combos = combinations(diag_list, length) all_combos.extend(combos) # 统计并排序 combo_counts = Counter(all_combos) sorted_combos = sorted(combo_counts.items(), key=lambda x: x[1], reverse=True) # 输出前10个结果 print("Top 10 诊断组合:") for combo, count in sorted_combos[:10]: print(f"组合({', '.join(combo)}):出现 {count} 次")
关键注意事项
- 去重处理:必须对每个患者的诊断去重,避免同一患者的重复诊断导致组合统计失真
- 组合一致性:生成组合前对诊断排序,确保不同顺序的同一组合被归为一类
- 灵活调整:可根据业务需求修改
min_length参数,或指定固定的组合长度(如只统计3元组合)
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

