You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于上下文的NLP关键词二分类及用户关键词透视表构建求助

一、基于上下文的NLP关键词存在性二分类优化方案

原代码仅检查关键词是否存在,无法识别否定语境导致误判。要实现「关键词存在且上下文未否定」才输出1的逻辑,可通过规则匹配否定词+关键词的方式处理,具体方案如下:

核心思路

  1. 定义临床场景常见否定词列表(如no、not、absent等)
  2. 统一文本与关键词的大小写,避免匹配误差
  3. 对每个关键词,检查其前后固定范围的上下文是否包含否定词,无否定则标记为有效存在

修改后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:40:31