基于上下文的NLP关键词二分类及用户关键词透视表构建求助
一、基于上下文的NLP关键词存在性二分类优化方案
原代码仅检查关键词是否存在,无法识别否定语境导致误判。要实现「关键词存在且上下文未否定」才输出1的逻辑,可通过规则匹配否定词+关键词的方式处理,具体方案如下:
核心思路
- 定义临床场景常见否定词列表(如no、not、absent等)
- 统一文本与关键词的大小写,避免匹配误差
- 对每个关键词,检查其前后固定范围的上下文是否包含否定词,无否定则标记为有效存在
修改后代码
import re # 配置关键词与否定词 KEYWORDS = ["jaundice","jaundiced","portal hypertension"] NEGATION_WORDS = {"no", "not", "without", "absent", "negative", "lack", "denies"} KEYWORDS_LOWER = [kw.lower() for kw in KEYWORDS] # 编译否定词正则,支持大小写不敏感匹配 NEGATION_PATTERN = re.compile(r'\b(' + '|'.join(NEGATION_WORDS) + r')\b', re.IGNORECASE) def check_valid_keyword(text): text_lower = text.lower() for kw in KEYWORDS_LOWER: if kw not in text_lower: continue # 取关键词前后各50字符的上下文窗口(可根据文本长度调整) kw_pos = text_lower.find(kw) context = text_lower[max(0, kw_pos-50) : kw_pos + len(kw) + 50] # 上下文无否定词则返回1 if not NEGATION_PATTERN.search(context): return 1 return 0 # 应用到DataFrame生成output列 df1['output'] = df1['CLINICAL_DOCUMENT_TEXT'].apply(check_valid_keyword) df_output = df1[['MCN','CLINICAL_DOCUMENT_TEXT','output']] df_output.head()
补充说明
如果需要更精准的否定识别,可改用分词后检查关键词前后n个词的方式,或引入临床NLP专用工具(如spaCy的否定扩展组件),但规则匹配在多数场景下已足够高效。
二、用户关键词透视表异常值修复方案
原代码出现-2147483648异常值,原因是pivot_table默认使用均值作为聚合函数,当同一(MCN, keyword)组合有多条记录时,均值非整数,强制转int时触发溢出(该值为int32类型的最小边界值)。要实现「用户是否出现过该关键词」的0/1标记,需指定正确的聚合逻辑:
修改后代码
def extract_matched_keywords(row): text_upper = row['CLINICAL_DOCUMENT_TEXT'].upper() keywords_list = ["jaundice","jaundiced","portal hypertension"] # 实际75个关键词 # 统一转大写匹配,避免大小写干扰 matched_kws = [kw for kw in keywords_list if kw.upper() in text_upper] return matched_kws # 提取每条文本匹配的关键词 df1['keyword'] = df1.apply(extract_matched_keywords, axis=1) # 展开关键词列并过滤空值 df_exploded = df1.explode('keyword').dropna(subset=['keyword']) # 构建透视表,用lambda确保只要出现过就标记1 df_pivot = df_exploded.pivot_table( index="MCN", columns="keyword", aggfunc=lambda x: 1, # 存在匹配记录则返回1 fill_value=0 ).astype(int).reset_index() # 修复列名层级问题 df_pivot.columns = df_pivot.columns.droplevel(0) df_pivot = df_pivot.rename(columns={'': 'MCN'}) df_pivot.head()
补充说明
- 若需统计用户出现关键词的次数,可将
aggfunc改为'count';若仅需存在性标记,上述方案更贴合需求 - 提前过滤空关键词行,避免无效数据干扰透视表生成
内容的提问来源于stack exchange,提问作者binnie
相关产品推荐
相关产品推荐

