基于Pandas统计关键词频次,实现用户能力等级(初/中/高)划分
首先,这个需求很实际!要根据作者的长文本和给定的关键词列表把他们划分成初级、中级、高级三个能力等级,核心思路是结合关键词的出现频率/覆盖范围,再加上对关键词使用语境的分析。下面是一套可落地的步骤:
一、先明确清晰的分级规则
首先得制定客观的判定标准,要紧扣你的关键词列表和不同能力层级的典型特征:
初级:
- 仅提及1-2种基础语言(比如Python、Java、Visual Basic)
- 关键词总出现次数少(比如小于5次)
- 文本内容聚焦入门问题:比如“如何入门”“基本语法”“安装教程”“新手指南”这类表述
中级:
- 提及3-4种语言(基础+中阶,比如C++、JavaScript、Pascal)
- 关键词总出现次数适中(5-15次)
- 文本内容围绕实际实现:比如“调试”“面向对象”“整合X和Y”“优化简单代码”这类表述
高级:
- 提及5种及以上关键词(包含复杂领域,比如MATLAB、Objective-C、Statistics)
- 关键词总出现次数多(大于15次)
- 文本内容涉及进阶话题:比如“C++内存管理”“统计建模”“MATLAB机器学习”“设计模式”“性能优化”这类表述
二、用Pandas一步步实现
假设你的DataFrame df 包含 author_id(作者唯一标识)和 text(长文本内容)两列,接下来把规则转化为代码:
2.1 预处理文本
先清洗文本,方便后续分析:
import pandas as pd import re from nltk.corpus import stopwords from nltk.tokenize import word_tokenize # 若未下载过nltk资源,先执行以下两行 import nltk nltk.download('stopwords') nltk.download('punkt') def preprocess_text(text): # 转小写 text = text.lower() # 去除标点和特殊字符 text = re.sub(r'[^\w\s]', '', text) # 停用词过滤 stop_words = set(stopwords.words('english')) tokens = word_tokenize(text) filtered_text = ' '.join([word for word in tokens if word not in stop_words]) return filtered_text # 对文本列应用预处理 df['cleaned_text'] = df['text'].apply(preprocess_text)
2.2 计算关键词指标
对每个作者,统计:
- 关键词总出现次数
- 用到的不同关键词数量
searchterms = ['Java language', 'C Language', 'C++', 'Python Language', 'JavaScript', 'Pascal Language', 'Statistics', 'Visual Basic', 'Objective-C', 'MATLAB'] # 关键词转小写,实现大小写不敏感匹配 lower_terms = [term.lower() for term in searchterms] def count_keywords(text): total_count = 0 unique_terms = set() for term in lower_terms: count = text.count(term) if count > 0: total_count += count unique_terms.add(term) return pd.Series([total_count, len(unique_terms)], index=['total_keyword_count', 'unique_keyword_count']) # 按作者分组计算指标(如果一个作者有多条文本,用groupby合并后计算) author_metrics = df.groupby('author_id')['cleaned_text'].apply(lambda x: count_keywords(' '.join(x))).reset_index()
2.3 分析语境关键词
通过统计不同层级的典型表述,增加语境维度的评分:
# 定义各层级的语境短语 beginner_phrases = ['how to start', 'basic syntax', 'install', 'beginner guide', 'learn', 'first program'] intermediate_phrases = ['debug', 'oop', 'integrate', 'optimize code', 'error handling', 'project'] advanced_phrases = ['memory management', 'statistical modeling', 'machine learning', 'design pattern', 'performance optimization', 'low-level'] def count_context_phrases(text, phrases): return sum(text.count(phrase.lower()) for phrase in phrases) # 给作者指标表添加语境计数 author_metrics['beginner_context'] = df.groupby('author_id')['cleaned_text'].apply(lambda x: count_context_phrases(' '.join(x), beginner_phrases)).values author_metrics['intermediate_context'] = df.groupby('author_id')['cleaned_text'].apply(lambda x: count_context_phrases(' '.join(x), intermediate_phrases)).values author_metrics['advanced_context'] = df.groupby('author_id')['cleaned_text'].apply(lambda x: count_context_phrases(' '.join(x), advanced_phrases)).values
2.4 分配能力等级
结合所有指标计算得分,再映射到对应的等级(权重和阈值可以根据你的实际数据调整):
def assign_level(row): # 计算加权得分(权重可根据实际情况调整) score = (row['unique_keyword_count'] * 2) + (row['total_keyword_count'] * 0.5) + \ (row['beginner_context'] * -1) + (row['intermediate_context'] * 1) + (row['advanced_context'] * 3) # 定义得分阈值(根据数据分布微调) if score < 5: return '初级' elif 5 <= score < 20: return '中级' else: return '高级' # 应用等级分配 author_metrics['skill_level'] = author_metrics.apply(assign_level, axis=1)
三、验证与迭代
- 抽样检查:从每个等级里选几个作者,手动查看他们的文本,确认分类是否合理
- 调整阈值:如果出现大量误分类,就修改得分权重或阈值范围
- 优化语境短语:根据你的数据补充/删除语境短语(比如如果高级作者经常提到“编译器优化”,就把它加到高级短语里)
内容的提问来源于stack exchange,提问作者Shivam




