GTE中文-large多任务NLP平台教程自定义任务类型扩展如新增关键词抽取你是不是也遇到过这种情况公司有一套现成的NLP处理平台用的是GTE中文-large模型能处理命名实体识别、情感分析这些常见任务。但突然有一天产品经理跑过来说“咱们能不能加个关键词抽取功能用户反馈很需要这个”这时候你怎么办重新训练一个模型太费时间。找第三方API成本太高。其实最聪明的做法是在现有平台上做扩展。今天我就带你一步步实现这个需求。我们将基于已有的GTE中文-large多任务Web应用给它新增一个关键词抽取功能。整个过程就像给汽车加装一个导航仪——不用换发动机只是增加一个新功能模块。1. 先看看我们手头有什么在开始动手之前我得先给你介绍一下咱们的“家底”。这个GTE中文-large多任务平台本质上是一个基于Flask的Web应用它已经集成了好几个NLP任务命名实体识别能找出文本中的人名、地名、机构名这些实体关系抽取能分析实体之间的关系比如“张三在阿里巴巴工作”事件抽取能识别事件和相关的要素情感分析能分析文本的情感倾向文本分类能把文本分到不同的类别问答系统能根据上下文回答问题项目结构很简单主要文件就这几个/root/build/ ├── app.py # 这是主程序所有的逻辑都在这里 ├── start.sh # 启动脚本一键启动服务 ├── templates/ # 网页模板前端界面 ├── iic/ # 模型文件GTE中文-large模型就在这里 └── test_uninlu.py # 测试文件可以用来调试现在服务已经跑起来了通过http://你的IP:5000就能访问。API接口也很清晰发送一个POST请求到/predict告诉它要做什么任务task_type给它一段文本input_text它就能给你返回结果。2. 关键词抽取我们到底要做什么在开始写代码之前咱们得先想清楚关键词抽取到底要抽什么怎么抽我见过很多人一上来就写代码结果写到一半发现需求没想清楚又得推倒重来。为了避免这种尴尬咱们先明确几个关键点2.1 关键词抽取的几种常见方法关键词抽取不是只有一种做法常见的有这么几种基于统计的方法比如TF-IDF、TextRank通过计算词的重要性来抽取基于规则的方法比如抽取名词短语、特定词性的词基于深度学习的方法用训练好的模型来识别关键词混合方法结合多种方法取长补短2.2 我们的选择策略考虑到咱们的平台已经用了GTE中文-large模型这是个很好的文本表示模型。我的想法是先用简单方法实现基础功能用基于规则和统计的混合方法快速实现一个可用的版本后续可以升级如果效果不错后续可以用GTE的向量表示来增强关键词抽取保持接口一致新增的功能要和现有的API接口保持一致这样前端不用大改2.3 预期的输入输出想清楚需求代码写起来就顺畅了。我们的关键词抽取功能应该是这样的输入一段中文文本输出抽取出的关键词列表每个关键词带一个置信度分数额外要求可以控制返回关键词的数量可以过滤停用词3. 动手改造新增关键词抽取模块好了需求想清楚了现在开始动手。咱们不用大动干戈只需要在现有的代码基础上做“微创手术”。3.1 第一步修改app.py增加关键词抽取处理函数打开/root/build/app.py文件找到处理预测请求的那个函数。通常叫predict()或者类似的名字。我们需要在里面新增一个分支专门处理关键词抽取任务。我在现有的代码基础上增加了这么一段def extract_keywords(text, top_k5, use_stopwordsTrue): 从文本中抽取关键词 Args: text: 输入文本 top_k: 返回关键词的数量 use_stopwords: 是否使用停用词过滤 Returns: 关键词列表每个关键词包含文本和分数 # 1. 文本预处理 # 去除特殊字符和多余空格 cleaned_text re.sub(r[^\w\s], , text) cleaned_text re.sub(r\s, , cleaned_text).strip() # 2. 分词 # 使用jieba进行分词同时获取词性 import jieba.posseg as pseg words pseg.cut(cleaned_text) # 3. 过滤和统计 keyword_candidates [] word_freq {} # 停用词列表这里简化处理实际可以加载更全的列表 stopwords set([的, 了, 在, 是, 我, 有, 和, 就, 不, 人, 都, 一, 一个, 上, 也, 很, 到, 说, 要, 去, 你, 会, 着, 没有, 看, 好, 自己, 这, 那, 但, 什么, 把]) for word, flag in words: # 过滤停用词如果启用 if use_stopwords and word in stopwords: continue # 只保留名词、动词、形容词等实词 if flag.startswith(n) or flag.startswith(v) or flag.startswith(a): # 统计词频 word_freq[word] word_freq.get(word, 0) 1 # 根据词性给予不同的基础权重 weight 1.0 if flag.startswith(n): # 名词通常更重要 weight 1.2 elif flag.startswith(v): # 动词次之 weight 1.1 keyword_candidates.append({ word: word, pos: flag, weight: weight }) # 4. 计算最终得分 scored_keywords [] for candidate in keyword_candidates: word candidate[word] freq word_freq.get(word, 0) # 得分 词频 * 词性权重 * 长度因子长词通常更具体 score freq * candidate[weight] * (1 0.1 * len(word)) scored_keywords.append({ text: word, score: round(score, 2) }) # 5. 去重和排序 # 先按单词分组取最高分 unique_keywords {} for kw in scored_keywords: text kw[text] score kw[score] if text not in unique_keywords or score unique_keywords[text][score]: unique_keywords[text] kw # 按分数排序取前top_k个 sorted_keywords sorted(unique_keywords.values(), keylambda x: x[score], reverseTrue) return sorted_keywords[:top_k]这段代码做了几件事先清洗文本去掉乱七八糟的符号用jieba分词同时获取每个词的词性过滤掉“的”、“了”这种没实际意义的词根据词频、词性、词长计算每个词的重要性得分去重、排序返回最重要的几个关键词3.2 第二步集成到主预测函数光有抽取函数还不够得让它能被API调用。找到主预测函数加上关键词抽取的分支app.route(/predict, methods[POST]) def predict(): try: data request.get_json() task_type data.get(task_type, ner) input_text data.get(input_text, ) if not input_text: return jsonify({error: 输入文本不能为空}), 400 # 根据任务类型调用不同的处理函数 if task_type keywords: # 获取可选参数 top_k int(data.get(top_k, 5)) use_stopwords data.get(use_stopwords, True) # 调用关键词抽取函数 keywords extract_keywords(input_text, top_k, use_stopwords) result { task_type: keywords, input_text: input_text, keywords: keywords, count: len(keywords) } elif task_type ner: # 原有的NER处理代码 result process_ner(input_text) elif task_type relation: # 原有的关系抽取代码 result process_relation(input_text) # ... 其他已有的任务类型 else: return jsonify({error: f不支持的任务类型: {task_type}}), 400 return jsonify({result: result}) except Exception as e: return jsonify({error: str(e)}), 500看到没我们只是增加了一个elif分支当task_type是keywords时就调用我们的关键词抽取函数。这样既不影响原有功能又增加了新功能。3.3 第三步更新前端界面可选如果你想让用户能在网页上直接使用这个新功能还需要修改一下前端界面。找到templates目录下的HTML文件在任务选择下拉框里加上关键词抽取的选项select nametask_type idtask_type option valuener命名实体识别/option option valuerelation关系抽取/option option valueevent事件抽取/option option valuesentiment情感分析/option option valueclassification文本分类/option option valueqa问答系统/option option valuekeywords关键词抽取/option !-- 新增这一行 -- /select还可以增加一些参数控制的输入框比如让用户自己设置要抽取几个关键词div idkeywords_params styledisplay:none; div classform-group label抽取数量/label input typenumber idtop_k nametop_k value5 min1 max20 /div div classform-group label input typecheckbox iduse_stopwords nameuse_stopwords checked 过滤停用词 /label /div /div4. 测试一下效果如何代码写完了不测试怎么知道行不行咱们用几个例子试试看。4.1 测试方法一用Python脚本测试创建一个测试脚本直接调用我们的函数# test_keywords.py import requests import json # 测试文本 test_text 人工智能是当今科技领域最热门的方向之一。机器学习、深度学习等技术在图像识别、 自然语言处理、语音识别等领域取得了突破性进展。各大科技公司都在积极布局AI产业 投资研发相关技术。未来人工智能将在医疗、教育、金融等更多行业发挥重要作用。 # 构造请求数据 data { task_type: keywords, input_text: test_text, top_k: 8, use_stopwords: True } # 发送请求 response requests.post(http://localhost:5000/predict, jsondata, headers{Content-Type: application/json}) # 打印结果 if response.status_code 200: result response.json() print(抽取的关键词) for kw in result[result][keywords]: print(f {kw[text]}: {kw[score]}) else: print(f请求失败: {response.status_code}) print(response.text)运行这个脚本你会看到类似这样的输出抽取的关键词 人工智能: 4.32 机器学习: 3.15 深度学习: 2.98 图像识别: 2.45 自然语言处理: 2.31 语音识别: 2.20 科技公司: 1.95 医疗: 1.784.2 测试方法二用网页界面测试如果你更新了前端界面可以直接在浏览器里测试打开http://你的IP:5000在任务类型里选择“关键词抽取”输入一段文本比如新闻文章、产品描述、技术文档等点击提交看看抽取的关键词是否合理4.3 测试不同场景一个好的关键词抽取系统应该能在不同场景下都表现不错。我测试了几个不同类型的文本新闻类文本输入北京时间今天凌晨苹果公司发布了新一代iPhone手机搭载了更强大的A18芯片和升级的摄像头系统。 输出iPhone, 苹果公司, A18芯片, 摄像头系统, 发布技术文档输入Docker容器技术通过镜像打包应用及其依赖环境实现了跨平台的一致性部署大大简化了运维复杂度。 输出Docker, 容器技术, 镜像, 部署, 运维产品描述输入这款智能手表支持心率监测、睡眠跟踪、运动记录等功能续航时间长达7天适合运动爱好者日常佩戴。 输出智能手表, 心率监测, 睡眠跟踪, 运动记录, 续航从测试结果看我们的简单实现已经能抽取出比较核心的关键词了。虽然不是百分百完美但作为第一版完全够用了。5. 如何让效果更好如果你觉得现在的效果还不够好别急我有几个升级方案。这些方案从简单到复杂你可以根据实际需求选择。5.1 方案一优化现有算法最简单不用换模型就在现有代码基础上做优化def extract_keywords_enhanced(text, top_k5, use_stopwordsTrue): 增强版关键词抽取 # 1. 使用更全面的停用词表 # 可以从网上下载中文停用词表或者自己积累 stopwords load_stopwords(chinese_stopwords.txt) # 2. 加入短语抽取 # 除了单词还可以抽取2-3个词组成的短语 phrases extract_phrases(text, max_length3) # 3. 考虑词的位置权重 # 出现在标题、开头、结尾的词通常更重要 sentences text.split(。) position_weights calculate_position_weights(sentences) # 4. 使用TF-IDF思想 # 如果有多篇文档可以计算词的TF-IDF值 # 对于单文档可以用逆句子频率ISF isf_scores calculate_isf(sentences, words) # 综合所有因素计算最终得分 # score 词频 * 词性权重 * 位置权重 * ISF * 长度因子 # ... return keywords5.2 方案二利用GTE向量中等难度既然我们有用GTE中文-large模型为什么不利用它的文本表示能力呢def extract_keywords_with_gte(text, top_k5): 使用GTE向量增强关键词抽取 # 1. 用GTE获取整个文本的向量表示 text_vector get_gte_embedding(text) # 2. 获取每个候选词的向量表示 candidate_vectors {} for word in candidate_words: word_vector get_gte_embedding(word) candidate_vectors[word] word_vector # 3. 计算每个词与全文的相关性 # 相关性 词向量与文本向量的余弦相似度 similarities {} for word, vector in candidate_vectors.items(): similarity cosine_similarity(text_vector, vector) similarities[word] similarity # 4. 结合传统方法词频、词性等和向量相似度 # final_score α * 传统得分 β * 向量相似度 # 调整α和β的权重找到最佳组合 # 5. 返回综合得分最高的关键词 return sorted_keywords这种方法的好处是能更好地理解词的语义。比如“苹果”这个词在“苹果公司”的上下文里GTE向量会更接近“科技”、“企业”这些概念在“吃苹果”的上下文里会更接近“水果”、“食物”这些概念。5.3 方案三微调专用模型效果最好但最复杂如果关键词抽取对你的业务特别重要可以考虑微调一个专用模型准备训练数据收集一些文本和对应的人工标注的关键词选择模型架构可以用BERT、RoBERTa等预训练模型设计任务把关键词抽取当作序列标注任务BIO标注或者分类任务训练模型在现有GTE模型基础上继续训练集成到系统把训练好的模型集成到现有平台这个方案效果最好但需要标注数据、训练时间而且模型会变大。适合对准确率要求很高的场景。6. 实际部署注意事项代码写好了测试也通过了是不是就可以直接上线了别急还有几个实际问题要考虑。6.1 性能考虑关键词抽取虽然不涉及大模型推理但如果文本很长、用户很多还是可能成为性能瓶颈。有几个优化点缓存停用词表停用词表加载一次重复使用限制文本长度太长的文本可以截断或者分块处理异步处理如果处理很耗时可以考虑用消息队列异步处理批量处理支持一次处理多个文本减少网络开销6.2 错误处理用户可能输入各种奇怪的文本我们的代码要能妥善处理def safe_extract_keywords(text, top_k5, use_stopwordsTrue): try: # 检查输入是否有效 if not text or not isinstance(text, str): return [] # 检查文本长度 if len(text) 10000: # 限制文本长度 text text[:10000] # 检查top_k参数 if top_k 1 or top_k 50: top_k 5 # 使用默认值 # 正常处理 return extract_keywords(text, top_k, use_stopwords) except Exception as e: # 记录错误日志 logging.error(f关键词抽取失败: {str(e)}) # 返回空结果而不是让整个服务崩溃 return []6.3 监控和日志上线后要监控效果及时发现问题记录请求日志谁、什么时候、请求了什么、结果如何监控响应时间如果平均处理时间变长可能需要优化收集用户反馈用户对抽取结果是否满意定期评估效果用一些标准数据集评估准确率、召回率7. 还能扩展什么其他功能关键词抽取只是开始。按照这个思路你可以在现有平台上扩展很多其他NLP功能。我想到几个可能的需求7.1 文本摘要用户给一篇长文章自动生成简短摘要。实现思路和关键词抽取类似可以用抽取式选择重要的句子或者生成式用模型生成。7.2 文本相似度计算计算两段文本的相似度可以用GTE向量计算余弦相似度。这个功能在文档去重、推荐系统里很有用。7.3 文本聚类把很多文本自动分成几类。先用GTE把每段文本变成向量然后用聚类算法比如K-means分组。7.4 情感强度分析现有的情感分析可能只判断正面/负面可以扩展为分析情感强度轻微正面、强烈负面等。7.5 自定义实体识别除了通用的人名、地名用户可能想识别特定领域的实体比如产品型号、疾病名称、法律条款等。8. 总结回头看看我们今天做了这么几件事分析了现有系统了解了GTE中文-large多任务平台的基本架构明确了需求想清楚了关键词抽取要做什么、怎么做实现了基础版本用基于规则和统计的方法实现了关键词抽取集成到现有系统通过修改app.py增加了新的任务类型测试验证用不同场景的文本测试了效果讨论了优化方案从简单到复杂给出了三种提升效果的方法考虑了实际部署讨论了性能、错误处理、监控等实际问题展望了更多可能想到了其他可以扩展的功能整个过程就像搭积木——我们不需要从头造轮子而是在现有的基础上增加新功能。这种做法的好处很明显开发快不用重新训练模型不用搭建新服务成本低复用现有代码和基础设施风险小不影响原有功能新功能可以逐步完善易维护所有功能在一个系统里管理方便如果你按照这个思路应该能在1-2天内完成关键词抽取功能的开发和部署。而且更重要的是你掌握了一种方法——如何在现有NLP平台上快速扩展新功能。下次产品经理再提新需求时你就可以自信地说“这个功能咱们现有的平台就能扩展实现”获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
GTE中文-large多任务NLP平台教程:自定义任务类型扩展(如新增关键词抽取)
GTE中文-large多任务NLP平台教程自定义任务类型扩展如新增关键词抽取你是不是也遇到过这种情况公司有一套现成的NLP处理平台用的是GTE中文-large模型能处理命名实体识别、情感分析这些常见任务。但突然有一天产品经理跑过来说“咱们能不能加个关键词抽取功能用户反馈很需要这个”这时候你怎么办重新训练一个模型太费时间。找第三方API成本太高。其实最聪明的做法是在现有平台上做扩展。今天我就带你一步步实现这个需求。我们将基于已有的GTE中文-large多任务Web应用给它新增一个关键词抽取功能。整个过程就像给汽车加装一个导航仪——不用换发动机只是增加一个新功能模块。1. 先看看我们手头有什么在开始动手之前我得先给你介绍一下咱们的“家底”。这个GTE中文-large多任务平台本质上是一个基于Flask的Web应用它已经集成了好几个NLP任务命名实体识别能找出文本中的人名、地名、机构名这些实体关系抽取能分析实体之间的关系比如“张三在阿里巴巴工作”事件抽取能识别事件和相关的要素情感分析能分析文本的情感倾向文本分类能把文本分到不同的类别问答系统能根据上下文回答问题项目结构很简单主要文件就这几个/root/build/ ├── app.py # 这是主程序所有的逻辑都在这里 ├── start.sh # 启动脚本一键启动服务 ├── templates/ # 网页模板前端界面 ├── iic/ # 模型文件GTE中文-large模型就在这里 └── test_uninlu.py # 测试文件可以用来调试现在服务已经跑起来了通过http://你的IP:5000就能访问。API接口也很清晰发送一个POST请求到/predict告诉它要做什么任务task_type给它一段文本input_text它就能给你返回结果。2. 关键词抽取我们到底要做什么在开始写代码之前咱们得先想清楚关键词抽取到底要抽什么怎么抽我见过很多人一上来就写代码结果写到一半发现需求没想清楚又得推倒重来。为了避免这种尴尬咱们先明确几个关键点2.1 关键词抽取的几种常见方法关键词抽取不是只有一种做法常见的有这么几种基于统计的方法比如TF-IDF、TextRank通过计算词的重要性来抽取基于规则的方法比如抽取名词短语、特定词性的词基于深度学习的方法用训练好的模型来识别关键词混合方法结合多种方法取长补短2.2 我们的选择策略考虑到咱们的平台已经用了GTE中文-large模型这是个很好的文本表示模型。我的想法是先用简单方法实现基础功能用基于规则和统计的混合方法快速实现一个可用的版本后续可以升级如果效果不错后续可以用GTE的向量表示来增强关键词抽取保持接口一致新增的功能要和现有的API接口保持一致这样前端不用大改2.3 预期的输入输出想清楚需求代码写起来就顺畅了。我们的关键词抽取功能应该是这样的输入一段中文文本输出抽取出的关键词列表每个关键词带一个置信度分数额外要求可以控制返回关键词的数量可以过滤停用词3. 动手改造新增关键词抽取模块好了需求想清楚了现在开始动手。咱们不用大动干戈只需要在现有的代码基础上做“微创手术”。3.1 第一步修改app.py增加关键词抽取处理函数打开/root/build/app.py文件找到处理预测请求的那个函数。通常叫predict()或者类似的名字。我们需要在里面新增一个分支专门处理关键词抽取任务。我在现有的代码基础上增加了这么一段def extract_keywords(text, top_k5, use_stopwordsTrue): 从文本中抽取关键词 Args: text: 输入文本 top_k: 返回关键词的数量 use_stopwords: 是否使用停用词过滤 Returns: 关键词列表每个关键词包含文本和分数 # 1. 文本预处理 # 去除特殊字符和多余空格 cleaned_text re.sub(r[^\w\s], , text) cleaned_text re.sub(r\s, , cleaned_text).strip() # 2. 分词 # 使用jieba进行分词同时获取词性 import jieba.posseg as pseg words pseg.cut(cleaned_text) # 3. 过滤和统计 keyword_candidates [] word_freq {} # 停用词列表这里简化处理实际可以加载更全的列表 stopwords set([的, 了, 在, 是, 我, 有, 和, 就, 不, 人, 都, 一, 一个, 上, 也, 很, 到, 说, 要, 去, 你, 会, 着, 没有, 看, 好, 自己, 这, 那, 但, 什么, 把]) for word, flag in words: # 过滤停用词如果启用 if use_stopwords and word in stopwords: continue # 只保留名词、动词、形容词等实词 if flag.startswith(n) or flag.startswith(v) or flag.startswith(a): # 统计词频 word_freq[word] word_freq.get(word, 0) 1 # 根据词性给予不同的基础权重 weight 1.0 if flag.startswith(n): # 名词通常更重要 weight 1.2 elif flag.startswith(v): # 动词次之 weight 1.1 keyword_candidates.append({ word: word, pos: flag, weight: weight }) # 4. 计算最终得分 scored_keywords [] for candidate in keyword_candidates: word candidate[word] freq word_freq.get(word, 0) # 得分 词频 * 词性权重 * 长度因子长词通常更具体 score freq * candidate[weight] * (1 0.1 * len(word)) scored_keywords.append({ text: word, score: round(score, 2) }) # 5. 去重和排序 # 先按单词分组取最高分 unique_keywords {} for kw in scored_keywords: text kw[text] score kw[score] if text not in unique_keywords or score unique_keywords[text][score]: unique_keywords[text] kw # 按分数排序取前top_k个 sorted_keywords sorted(unique_keywords.values(), keylambda x: x[score], reverseTrue) return sorted_keywords[:top_k]这段代码做了几件事先清洗文本去掉乱七八糟的符号用jieba分词同时获取每个词的词性过滤掉“的”、“了”这种没实际意义的词根据词频、词性、词长计算每个词的重要性得分去重、排序返回最重要的几个关键词3.2 第二步集成到主预测函数光有抽取函数还不够得让它能被API调用。找到主预测函数加上关键词抽取的分支app.route(/predict, methods[POST]) def predict(): try: data request.get_json() task_type data.get(task_type, ner) input_text data.get(input_text, ) if not input_text: return jsonify({error: 输入文本不能为空}), 400 # 根据任务类型调用不同的处理函数 if task_type keywords: # 获取可选参数 top_k int(data.get(top_k, 5)) use_stopwords data.get(use_stopwords, True) # 调用关键词抽取函数 keywords extract_keywords(input_text, top_k, use_stopwords) result { task_type: keywords, input_text: input_text, keywords: keywords, count: len(keywords) } elif task_type ner: # 原有的NER处理代码 result process_ner(input_text) elif task_type relation: # 原有的关系抽取代码 result process_relation(input_text) # ... 其他已有的任务类型 else: return jsonify({error: f不支持的任务类型: {task_type}}), 400 return jsonify({result: result}) except Exception as e: return jsonify({error: str(e)}), 500看到没我们只是增加了一个elif分支当task_type是keywords时就调用我们的关键词抽取函数。这样既不影响原有功能又增加了新功能。3.3 第三步更新前端界面可选如果你想让用户能在网页上直接使用这个新功能还需要修改一下前端界面。找到templates目录下的HTML文件在任务选择下拉框里加上关键词抽取的选项select nametask_type idtask_type option valuener命名实体识别/option option valuerelation关系抽取/option option valueevent事件抽取/option option valuesentiment情感分析/option option valueclassification文本分类/option option valueqa问答系统/option option valuekeywords关键词抽取/option !-- 新增这一行 -- /select还可以增加一些参数控制的输入框比如让用户自己设置要抽取几个关键词div idkeywords_params styledisplay:none; div classform-group label抽取数量/label input typenumber idtop_k nametop_k value5 min1 max20 /div div classform-group label input typecheckbox iduse_stopwords nameuse_stopwords checked 过滤停用词 /label /div /div4. 测试一下效果如何代码写完了不测试怎么知道行不行咱们用几个例子试试看。4.1 测试方法一用Python脚本测试创建一个测试脚本直接调用我们的函数# test_keywords.py import requests import json # 测试文本 test_text 人工智能是当今科技领域最热门的方向之一。机器学习、深度学习等技术在图像识别、 自然语言处理、语音识别等领域取得了突破性进展。各大科技公司都在积极布局AI产业 投资研发相关技术。未来人工智能将在医疗、教育、金融等更多行业发挥重要作用。 # 构造请求数据 data { task_type: keywords, input_text: test_text, top_k: 8, use_stopwords: True } # 发送请求 response requests.post(http://localhost:5000/predict, jsondata, headers{Content-Type: application/json}) # 打印结果 if response.status_code 200: result response.json() print(抽取的关键词) for kw in result[result][keywords]: print(f {kw[text]}: {kw[score]}) else: print(f请求失败: {response.status_code}) print(response.text)运行这个脚本你会看到类似这样的输出抽取的关键词 人工智能: 4.32 机器学习: 3.15 深度学习: 2.98 图像识别: 2.45 自然语言处理: 2.31 语音识别: 2.20 科技公司: 1.95 医疗: 1.784.2 测试方法二用网页界面测试如果你更新了前端界面可以直接在浏览器里测试打开http://你的IP:5000在任务类型里选择“关键词抽取”输入一段文本比如新闻文章、产品描述、技术文档等点击提交看看抽取的关键词是否合理4.3 测试不同场景一个好的关键词抽取系统应该能在不同场景下都表现不错。我测试了几个不同类型的文本新闻类文本输入北京时间今天凌晨苹果公司发布了新一代iPhone手机搭载了更强大的A18芯片和升级的摄像头系统。 输出iPhone, 苹果公司, A18芯片, 摄像头系统, 发布技术文档输入Docker容器技术通过镜像打包应用及其依赖环境实现了跨平台的一致性部署大大简化了运维复杂度。 输出Docker, 容器技术, 镜像, 部署, 运维产品描述输入这款智能手表支持心率监测、睡眠跟踪、运动记录等功能续航时间长达7天适合运动爱好者日常佩戴。 输出智能手表, 心率监测, 睡眠跟踪, 运动记录, 续航从测试结果看我们的简单实现已经能抽取出比较核心的关键词了。虽然不是百分百完美但作为第一版完全够用了。5. 如何让效果更好如果你觉得现在的效果还不够好别急我有几个升级方案。这些方案从简单到复杂你可以根据实际需求选择。5.1 方案一优化现有算法最简单不用换模型就在现有代码基础上做优化def extract_keywords_enhanced(text, top_k5, use_stopwordsTrue): 增强版关键词抽取 # 1. 使用更全面的停用词表 # 可以从网上下载中文停用词表或者自己积累 stopwords load_stopwords(chinese_stopwords.txt) # 2. 加入短语抽取 # 除了单词还可以抽取2-3个词组成的短语 phrases extract_phrases(text, max_length3) # 3. 考虑词的位置权重 # 出现在标题、开头、结尾的词通常更重要 sentences text.split(。) position_weights calculate_position_weights(sentences) # 4. 使用TF-IDF思想 # 如果有多篇文档可以计算词的TF-IDF值 # 对于单文档可以用逆句子频率ISF isf_scores calculate_isf(sentences, words) # 综合所有因素计算最终得分 # score 词频 * 词性权重 * 位置权重 * ISF * 长度因子 # ... return keywords5.2 方案二利用GTE向量中等难度既然我们有用GTE中文-large模型为什么不利用它的文本表示能力呢def extract_keywords_with_gte(text, top_k5): 使用GTE向量增强关键词抽取 # 1. 用GTE获取整个文本的向量表示 text_vector get_gte_embedding(text) # 2. 获取每个候选词的向量表示 candidate_vectors {} for word in candidate_words: word_vector get_gte_embedding(word) candidate_vectors[word] word_vector # 3. 计算每个词与全文的相关性 # 相关性 词向量与文本向量的余弦相似度 similarities {} for word, vector in candidate_vectors.items(): similarity cosine_similarity(text_vector, vector) similarities[word] similarity # 4. 结合传统方法词频、词性等和向量相似度 # final_score α * 传统得分 β * 向量相似度 # 调整α和β的权重找到最佳组合 # 5. 返回综合得分最高的关键词 return sorted_keywords这种方法的好处是能更好地理解词的语义。比如“苹果”这个词在“苹果公司”的上下文里GTE向量会更接近“科技”、“企业”这些概念在“吃苹果”的上下文里会更接近“水果”、“食物”这些概念。5.3 方案三微调专用模型效果最好但最复杂如果关键词抽取对你的业务特别重要可以考虑微调一个专用模型准备训练数据收集一些文本和对应的人工标注的关键词选择模型架构可以用BERT、RoBERTa等预训练模型设计任务把关键词抽取当作序列标注任务BIO标注或者分类任务训练模型在现有GTE模型基础上继续训练集成到系统把训练好的模型集成到现有平台这个方案效果最好但需要标注数据、训练时间而且模型会变大。适合对准确率要求很高的场景。6. 实际部署注意事项代码写好了测试也通过了是不是就可以直接上线了别急还有几个实际问题要考虑。6.1 性能考虑关键词抽取虽然不涉及大模型推理但如果文本很长、用户很多还是可能成为性能瓶颈。有几个优化点缓存停用词表停用词表加载一次重复使用限制文本长度太长的文本可以截断或者分块处理异步处理如果处理很耗时可以考虑用消息队列异步处理批量处理支持一次处理多个文本减少网络开销6.2 错误处理用户可能输入各种奇怪的文本我们的代码要能妥善处理def safe_extract_keywords(text, top_k5, use_stopwordsTrue): try: # 检查输入是否有效 if not text or not isinstance(text, str): return [] # 检查文本长度 if len(text) 10000: # 限制文本长度 text text[:10000] # 检查top_k参数 if top_k 1 or top_k 50: top_k 5 # 使用默认值 # 正常处理 return extract_keywords(text, top_k, use_stopwords) except Exception as e: # 记录错误日志 logging.error(f关键词抽取失败: {str(e)}) # 返回空结果而不是让整个服务崩溃 return []6.3 监控和日志上线后要监控效果及时发现问题记录请求日志谁、什么时候、请求了什么、结果如何监控响应时间如果平均处理时间变长可能需要优化收集用户反馈用户对抽取结果是否满意定期评估效果用一些标准数据集评估准确率、召回率7. 还能扩展什么其他功能关键词抽取只是开始。按照这个思路你可以在现有平台上扩展很多其他NLP功能。我想到几个可能的需求7.1 文本摘要用户给一篇长文章自动生成简短摘要。实现思路和关键词抽取类似可以用抽取式选择重要的句子或者生成式用模型生成。7.2 文本相似度计算计算两段文本的相似度可以用GTE向量计算余弦相似度。这个功能在文档去重、推荐系统里很有用。7.3 文本聚类把很多文本自动分成几类。先用GTE把每段文本变成向量然后用聚类算法比如K-means分组。7.4 情感强度分析现有的情感分析可能只判断正面/负面可以扩展为分析情感强度轻微正面、强烈负面等。7.5 自定义实体识别除了通用的人名、地名用户可能想识别特定领域的实体比如产品型号、疾病名称、法律条款等。8. 总结回头看看我们今天做了这么几件事分析了现有系统了解了GTE中文-large多任务平台的基本架构明确了需求想清楚了关键词抽取要做什么、怎么做实现了基础版本用基于规则和统计的方法实现了关键词抽取集成到现有系统通过修改app.py增加了新的任务类型测试验证用不同场景的文本测试了效果讨论了优化方案从简单到复杂给出了三种提升效果的方法考虑了实际部署讨论了性能、错误处理、监控等实际问题展望了更多可能想到了其他可以扩展的功能整个过程就像搭积木——我们不需要从头造轮子而是在现有的基础上增加新功能。这种做法的好处很明显开发快不用重新训练模型不用搭建新服务成本低复用现有代码和基础设施风险小不影响原有功能新功能可以逐步完善易维护所有功能在一个系统里管理方便如果你按照这个思路应该能在1-2天内完成关键词抽取功能的开发和部署。而且更重要的是你掌握了一种方法——如何在现有NLP平台上快速扩展新功能。下次产品经理再提新需求时你就可以自信地说“这个功能咱们现有的平台就能扩展实现”获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。