这次我们来看一个偏实战的环境搭建方案Jupyter Notebook Python 虚拟环境专门面向 NLP 和关键词提取任务。这是整个系列的第二篇P2。如果你刚接触 NLP或者经常在多个 Python 项目之间切换、被依赖冲突搞到头大这篇内容会比较对胃口。先直接说这个方案解决什么问题用 venv 把关键词提取相关项目的 Python 依赖隔离起来再用 Jupyter Notebook 作为交互实验界面边写边看分词、TF-IDF、关键词打分的结果。这样不会因为装了别的包把系统 Python 环境搞乱也不会出现“昨天还能跑今天 import 就报错”的情况。这个方案的核心特点有三块环境隔离、Notebook 交互、从实验平滑过渡到脚本和接口。虚拟环境可以避免项目之间包版本互相污染Jupyter Notebook 适合 NLP 这种需要反复查看中间结果的任务关键词提取从单条测试到批量处理再到 API 化整个链路都是通的。本文会带你把环境从零搭起来创建虚拟环境、激活、安装 Jupyter 并注册内核、安装 NLP 和关键词提取依赖、跑通一个文本预处理 关键词提取示例最后再看批量任务和接口化的处理思路。适合准备开始 NLP 项目开发、关键词分析、文本挖掘的 Python 开发者。1. 核心能力速览先给一个整体规格表方便判断这套方案适不适合自己。能力项说明项目类型Python 开发环境 NLP 实验环境搭建核心用途为关键词提取、文本预处理、NLP 实验提供隔离且可复现的 Python 运行环境前端交互Jupyter Notebook / Jupyter Lab环境隔离venv 虚拟环境项目依赖与系统 Python 隔离是否支持批量任务支持Notebook 可转 Python 脚本批量处理文本是否支持接口 API支持可通过 Flask/FastAPI 将抽取逻辑封装成服务需按实际项目调整支持平台Windows / macOS / Linux命令略有差异硬件要求普通开发机即可无显卡门槛主要消耗内存和 CPU推荐前置已安装 Python 3.8 或更高版本熟悉 pip 基础命令主要依赖jupyter / jieba / scikit-learn / pandas 等适合场景NLP 入门实验、关键词提取、文本挖掘、数据分析、模型效果对比这里要强调一点这套方案不依赖 GPU。jieba、scikit-learn 这类传统 NLP 工具基本都是 CPU 计算普通笔记本就能跑。只有在后面引入深度学习模型、向量模型时才需要考虑 CUDA 和显卡显存。所以初期可以放心装在本机上。2. 适用场景与使用边界关于适用场景这套环境方案最适合以下几类人第一是 NLP 初学者。关键词提取是文本挖掘里很经典的入门任务通过 Jupyter Notebook 可以实时看到分词结果、词频统计、TF-IDF 权重变化理解整个处理链路。第二是数据分析师。经常要处理文本类数据比如用户评论、新闻标题、日志文本需要快速提取核心词。第三是多项目管理开发者。手头同时有多个 Python 项目每个项目依赖版本不一样用一个独立虚拟环境隔离比直接往系统环境里装包安全很多。那不适合什么场景如果是超大语料的生产级集群任务比如每天几千万条文本需要做分布式关键词计算那这套本地 Notebook 环境就不合适应该走后端工程化方案。另外如果只是偶尔跑一段脚本、不需要交互查看结果也不必上 Notebook直接用 IDE 跑脚本就够了。使用边界也要讲清楚。本地环境主要面向测试和实验如果处理的是真实业务数据、用户隐私数据需要先做脱敏不能把未授权的数据放到公开平台。关键词提取结果也不是百分百准确用于正式报告或商用时建议加入人工抽检环节。涉及版权文本、内部文档要确认数据来源合法、使用范围合规。3. 环境准备与前置条件环境准备阶段先确认基础条件。核心是 Python 已正确安装并且能通过命令行调用。先在终端里检查 Python 版本python --versionmacOS 或 Linux 下可能是 python3python3 --version输出类似Python 3.12.3如果提示python 不是内部或外部命令说明 Python 没有加入 PATH。Windows 下安装时记得勾选Add Python to PATH或者安装完成后手动把 Python 路径加到环境变量里。接着检查 pip 是否可用python -m pip --version建议先将 pip 升级到最新版本后面安装依赖会更省事python -m pip install --upgrade pip磁盘空间方面Jupyter、jieba、scikit-learn、pandas 这些包加起来占用不大几百 MB 到 1 GB 左右。但考虑到后面可能下载词库、模型文件建议保留 2 GB 以上可用磁盘空间。最后确认网络可以正常访问 Python 包索引。如果下载速度慢后面安装时可以换成国内镜像源这一步在排错部分会展开说明。4. 安装部署与启动方式整个安装过程可以拆成六步创建项目目录、创建虚拟环境、激活虚拟环境、安装 Jupyter、安装 NLP 依赖、注册 Jupyter 内核。4.1 创建项目目录先建一个工作目录用来放 Notebook、脚本和后续的数据文件。mkdir nlp_keyword_env cd nlp_keyword_env4.2 创建虚拟环境在项目目录里执行python -m venv venv这里第一个venv是 Python 模块名第二个venv是虚拟环境目录名可以按习惯改成别的名字比如.venv。创建完成后目录下会多出一个venv文件夹里面包含独立的 Python 解释器和 pip。4.3 激活虚拟环境Windows PowerShell 下激活venv\Scripts\Activate.ps1Windows CMD 下激活venv\Scripts\activate.batmacOS 或 Linux 下激活source venv/bin/activate激活成功后命令行提示符前面会出现(venv)字样。后面所有 pip 安装、python 命令都要在激活状态下执行。如果 PowerShell 提示执行策略限制可以按实际需求调整当前用户的 ExecutionPolicy但要先确认风险后再操作。4.4 安装 Jupyter Notebook激活虚拟环境后先升级 pippython -m pip install --upgrade pip然后安装 Notebookpip install notebook如果想用新版的交互界面可以改用 Jupyter Labpip install jupyterlab两者可以共存不影响。本文后面的示例主要基于 Notebook 操作。为了把虚拟环境注册成 Jupyter 的内核还需要安装 ipykernelpip install ipykernel4.5 安装 NLP 与关键词提取依赖中文关键词提取最常用的组合是 jieba 加 scikit-learn。jieba 负责中文分词、TF-IDF 和 TextRank 关键词抽取scikit-learn 负责把文本转成 TF-IDF 特征矩阵方便做更灵活的特征分析。pandas 用于数据处理和批量读取。可以一次装齐pip install jieba scikit-learn pandas如果后面还要做英文 NLP可以补充pip install nltk但本文演示主线以中文关键词提取为主所以先不急着装。4.6 注册 Jupyter 内核安装完 ipykernel 后把当前虚拟环境注册为 Jupyter 的内核python -m ipykernel install --user --name nlp_keyword_env --display-name Python (nlp-keyword)参数说明--name nlp_keyword_env内核的标识名建议和虚拟环境名保持一致。--display-name Python (nlp-keyword)Jupyter 页面内核选择菜单里显示的名字可以自定义。这样做的意义是以后启动 Jupyter 时可以同时看到系统 Python 内核和当前项目专属内核不会混淆。4.7 启动 Jupyter Notebook激活虚拟环境后直接运行jupyter notebook默认情况下终端会输出一串日志然后自动打开浏览器访问http://localhost:8888。如果端口被占用可以手动指定jupyter notebook --port 8889如果需要在服务器或远程机器上使用可以加参数允许从其他 IP 访问jupyter notebook --no-browser --ip0.0.0.0 --port8888这种情况下要注意访问控制别把未授权访问端口直接暴露在公网。如果想后台启动不占用当前终端Linux 环境下可以nohup jupyter notebook --no-browser --ip0.0.0.0 --port8888 notebook.log 21 日志会写入notebook.log方便排查启动问题。4.8 备选方案conda 环境如果本机已经装了 Anaconda 或 Miniconda也可以直接用 conda 创建环境conda create -n nlp_env python3.11 conda activate nlp_env pip install notebook ipykernel jieba scikit-learn pandas python -m ipykernel install --user --name nlp_env --display-name Python (nlp-env)conda 的优点是自带较多科学计算包但环境体积会大一些。venv 更轻量适合按项目最小化安装。5. 功能测试与效果验证环境装好只是第一步关键要验证它确实能用于 NLP 和关键词提取。下面按测试链路拆开验证。5.1 验证 Jupyter 内核路径打开 Jupyter Notebook 页面点击New选择上面注册的Python (nlp-keyword)内核。在一个 Cell 里执行import sys import jieba print(sys.executable) print(jieba.__version__)如果sys.executable输出的路径指向当前项目的venv目录下的 Python 解释器说明内核注册正确后续import都会使用虚拟环境里的包。如果输出的是系统 Python 路径说明内核没选对需要回到 Jupyter 页面检查内核选择。5.2 中文分词与预处理测试关键词提取不是简单把字符串拆开需要先分词、去掉停用词再计算词的重要性。先看 jieba 分词效果import jieba text 本文介绍如何在 Jupyter Notebook 中使用 Python 虚拟环境进行 NLP 关键词提取与文本挖掘实践。 words jieba.lcut(text) print(words)预期输出[本文, 介绍, 如何, 在, Jupyter, Notebook, 中, 使用, Python, 虚拟环境, 进行, NLP, 关键词, 提取, 与, 文本挖掘, 实践, 。]可以看到中文句子被切成有意义的词语。这一步是后续关键词计算的基础。5.3 关键词提取测试TF-IDFTF-IDF 的思路是一个词在当前文本里出现次数多但在整个语料库里很少出现那它对当前文本更有区分度关键词权重更高。jieba 内置了基于 TF-IDF 的关键词提取接口import jieba.analyse text 本文介绍如何在 Jupyter Notebook 中使用 Python 虚拟环境进行 NLP 关键词提取与文本挖掘实践。 \ 虚拟环境可以隔离不同项目的依赖避免包版本冲突让 NLP 实验环境更干净。Jupyter Notebook 支持交互式编程 \ 方便查看每一步的中间结果是 NLP 文本挖掘常用的开发工具。 keywords jieba.analyse.extract_tags(text, topK10) print(keywords)topK10表示返回权重最高的前 10 个关键词。默认语料库是 jieba 内置的 IDF 文件如果处理的是特定领域文本可以加载自定义 IDF 文件进一步调优。5.4 关键词提取测试TextRankTextRank 是一种基于图排序的关键词抽取方法不需要外部语料统计 IDF更适合单篇文本的快速关键词抽取。jieba 也内置了这个方法keywords_tr jieba.analyse.textrank(text, topK10) print(keywords_tr)TextRank 和 TF-IDF 的抽取结果会有差异这是正常的。实际项目中可以把两种方法的 TopN 结果合并再人工确认。5.5 自定义 TF-IDF 特征验证如果不想用 jieba 内置接口也可以用 scikit-learn 自己构建文本特征矩阵这样后面接分类、聚类任务时能复用同一套特征体系。from sklearn.feature_extraction.text import TfidfVectorizer import jieba # 准备两份示例文本 texts [ 自然语言处理是人工智能的重要方向文本挖掘是其中最常见的应用。, 关键词提取可以用于新闻摘要、标签推荐和内容分类。 ] # 先用 jieba 把每篇文本分词再用空格连接 segmented_texts [ .join(jieba.lcut(t)) for t in texts] print(segmented_texts) # 用 TF-IDF 提取特征 vectorizer TfidfVectorizer() tfidf_matrix vectorizer.fit_transform(segmented_texts) # 输出特征词 print(vectorizer.get_feature_names_out())通过tfidf_matrix可以查看每个词在不同文档里的 TF-IDF 权重矩阵这比直接用 jieba 接口更灵活适合做多篇文档的对比实验。5.6 判断成功的标准完成以上测试后判断环境是否可用的标准如下Notebook 内核路径指向虚拟环境的 Python。jieba.lcut能正确输出中文分词结果。jieba.analyse.extract_tags能返回有实际意义的关键词列表。scikit-learn 的TfidfVectorizer能完成文本向量化。整个过程中没有出现ModuleNotFoundError。如果某个环节失败大概率是依赖没装进当前虚拟环境或者内核选错了。先检查激活状态和内核名称再考虑重装依赖。6. 接口 API 与批量任务Notebook 适合交互实验但正式使用时通常要把实验代码转成脚本再做成批量任务或接口服务。6.1 Notebook 转 Python 脚本Jupyter 自带转换工具可以直接把 Notebook 转成脚本文件jupyter nbconvert --to script keyword_extract.ipynb转换后得到一个keyword_extract.py里面保留代码块和注释去掉输出结果。这样就能脱离 Notebook 环境运行。6.2 批量关键词提取脚本批量处理时可以设计一个输入目录和一个输出目录。每次遍历目录中的文本文件提取关键词后写入结果文件。下面是一个通用模板示例实际使用时需要按自己的目录结构和编码环境调整import os import jieba import jieba.analyse def extract_keywords(text, topK10): 从单段文本中提取关键词 return jieba.analyse.extract_tags(text, topKtopK) def process_file(file_path, output_path, topK10): 处理单个文本文件将关键词写入输出文件 with open(file_path, r, encodingutf-8) as f: text f.read() keywords extract_keywords(text, topKtopK) with open(output_path, w, encodingutf-8) as f: f.write(\n.join(keywords)) def main(): input_dir ./data/input output_dir ./data/output topK 10 os.makedirs(output_dir, exist_okTrue) for filename in os.listdir(input_dir): if not filename.endswith(.txt): continue file_path os.path.join(input_dir, filename) output_path os.path.join(output_dir, filename .keywords.txt) process_file(file_path, output_path, topKtopK) print(fprocessed: {filename}) if __name__ __main__: main()这个脚本的关键点在于输入输出目录分开避免污染原始数据。每处理一个文件就打印日志方便观察进度。输出结果按行保存一个关键词一行后续好做分析。批量任务加入日志和失败重试机制后可以更稳定地处理大量文件。6.3 接口 API 化思路把关键词提取封装成 HTTP 接口后前端、其他后端服务、自动化脚本都可以直接调用。最小实现可以用 Flask先安装依赖pip install flask再写一个小服务示例from flask import Flask, request, jsonify import jieba import jieba.analyse app Flask(__name__) app.config[JSON_AS_ASCII] False app.route(/keywords, methods[POST]) def keywords_api(): data request.get_json() if not data: return jsonify({error: request body must be json}), 400 text data.get(text, ) topK data.get(topK, 10) if not text: return jsonify({error: text is required}), 400 keywords jieba.analyse.extract_tags(text, topKtopK) return jsonify({keywords: keywords}) if __name__ __main__: app.run(host127.0.0.1, port8000)启动服务python keyword_api.py然后可以用 curl 测试curl -X POST http://127.0.0.1:8000/keywords \ -H Content-Type: application/json \ -d {\text\: \这是待提取关键词的测试文本我们在测试关键词提取接口。\, \topK\: 5}也可以写一个简单的 Python 调用端import requests url http://127.0.0.1:8000/keywords payload { text: 这是待提取关键词的测试文本我们在测试关键词提取接口。, topK: 5 } response requests.post(url, jsonpayload, timeout30) print(response.json())这里要说明一点上面的代码只是演示级接口。生产环境还需要考虑请求鉴权、访问频率限制、请求体大小限制、异常日志、超时控制等。如果接口要部署到服务器建议在反向代理层做访问控制不要把未鉴权的服务直接暴露到公网。7. 资源占用与性能观察这套环境的主要资源消耗点是内存和 CPU。Jupyter Notebook 本身会占一部分内存每个打开的 Notebook 内核还会单独占一份内存。如果同时打开多个内核内存会明显上升。观察资源占用的方法很简单Windows 下打开任务管理器找python.exe进程看内存占用。macOS 下打开活动监视器找 Python 相关进程。Linux 下可以用htop或top命令。重点观察几个节点启动 Jupyter 后基础内存占用。第一次执行jieba.lcut时内存会有一次明显上涨因为 jieba 需要加载词典。加载大型自定义词典后内存占用会进一步提高。TfidfVectorizer在特征词很多时内存占用会快速上涨因为要构建稀疏矩阵和词汇表。文本长度对性能影响很大。短文本的关键词提取几乎是毫秒级长文本或大批量文档耗时主要花在分词和特征构建上。传统 NLP 工具基本都是 CPU 计算不依赖 GPU所以暂时不需要考虑显存。降低资源占用的建议有几点不在一个内核里同时持有过多大型 DataFrame处理完及时删除大变量或调用gc.collect()。大批量处理时分批读入文本避免一次性把所有数据加载进内存。暂时不用的 Notebook 内核可以手动重启释放内存菜单栏里有Kernel - Restart。如果同时打开多个项目环境建议用完一个关一个不要全堆在后台。如果要跑深度学习模型比如 BERT 来做关键词抽取或语义表示那才需要关注显存。不同型号显卡显存需求差异很大需要按实际模型大小和 batch size 测试。本文介绍的 jieba scikit-learn 方案完全不需要这个配置。8. 常见问题与排查方法环境搭建过程里最容易遇到下面几类问题整理成排查表可以直接对照处理。问题现象可能原因排查方式解决方案Jupyter Notebook 页面打不开服务未启动、端口被占用、浏览器问题查看终端启动日志确认端口是否被监听换端口启动jupyter notebook --port 8889重启服务创建内核后 Notebook 里找不到内核注册目录不在当前用户下或注册命令未执行成功重新执行 ipykernel 注册命令查看输出确认激活虚拟环境后重新注册内核重启 JupyterNotebook 里 import 包报 ModuleNotFoundError内核选的不是虚拟环境或依赖没装进当前环境在 Cell 里打印 sys.executable检查安装路径切换内核到 nlp-keyword重新在激活的 venv 里 pip installpython 不是内部或外部命令Python 未加入 PATH命令行检查python --versionWindows 安装时勾选 Add Python to PATH或使用完整路径pip 安装速度很慢网络问题或默认源访问慢观察 pip 输出看卡在哪个阶段换清华镜像源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名中文关键词提取结果乱码文件读写编码不一致检查源文件编码格式读写文件时统一使用encodingutf-8PowerShell 激活虚拟环境报错系统执行策略限制脚本运行查看 PowerShell 错误提示了解风险后调整 ExecutionPolicy或在 CMD 里直接激活批量处理时内存持续上涨循环里不断累积大变量或数据加载过多观察任务管理器中的 python.exe 进程分批处理及时释放大变量必要时重启内核端口被占用之前启动的 Jupyter 进程未退出netstat -ano查看端口占用用参数换端口或结束旧进程后再启动先说两个最高频的坑。第一个是内核路径不对。很多人装好包之后在 Notebook 里 import 还是失败原因是 Notebook 用的内核是系统 Python而不是虚拟环境里的 Python。验证方式非常直接在 Cell 里打印sys.executable看路径是否指向venv目录。如果不指向就回到终端重新激活环境、注册内核、重启 Notebook。第二个是包装错环境。Windows 下经常出现 PowerShell 里看着激活了环境但 pip 装包实际装到了系统 Python。稳妥的做法是装完依赖后执行pip list确认包所在环境。再进一步可以用python -m pip install来确保pip指向的就是当前虚拟环境的 Python。9. 最佳实践与使用建议环境搭建完成后后续维护才是重点。这里给一套可以直接抄的工程化建议。第一约定项目目录结构。建议这样组织nlp_keyword_env/ ├── data/ │ ├── input/ │ └── output/ ├── notebooks/ ├── scripts/ ├── venv/ └── requirements.txtdata/input放原始待处理文本。data/output放提取结果。notebooks放实验 Notebook。scripts放批量脚本和 API 服务脚本。venv放虚拟环境一般不提交到代码仓库。第二导出依赖清单。环境运行稳定后用pip freeze记录当前依赖pip freeze requirements.txt换机器或重建环境时直接pip install -r requirements.txt这样可以保证不同电脑上的环境一致避免“在我机器上能跑”的尴尬情况。第三第一次跑全量数据之前先小批量验证。比如批量脚本先处理 3 到 5 个文件确认输出格式、内容质量都符合预期后再放全量数据。这样能显著减少返工时间。第四关键词提取结果要加人工抽检。不管是 TF-IDF 还是 TextRank都是统计和启发式方法可能抽取出无意义的词。批量跑完结果后随手抽几十条看一遍比事后整体返工要省事很多。第五注意隐私和数据合规。处理内部文档或用户内容时先确认这批数据是否可以放在本地环境之外。如果在服务器上部署 API 服务接口要加访问限制避免成为无鉴权的开放代理。第六保留可执行入口。如果团队里有人不熟悉命令行可以在项目根目录放一个启动脚本。Windows 下可以写一个start_notebook.batecho off call venv\Scripts\activate.bat jupyter notebook这样双击即可启动 Notebook不用手动敲命令。这个脚本适合给没有命令行经验的同事使用可以明显降低使用门槛。10. 总结与下一步这套 Jupyter Notebook 虚拟环境 NLP 关键词提取的方案最值得尝试的点就是它把环境隔离、交互实验和批量落地串到了同一条链路里。先是 venv 保证依赖不混乱然后是 Notebook 方便查看分词、特征、权重等中间结果最后再把代码转成脚本处理批量数据还能封装成接口。建议第一步先验证内核路径。打开 Notebook 后马上跑一个sys.executable和jieba.__version__确认当前内核用的是虚拟环境的 Python。这一步通过后面基本不会出大问题。最容易踩的坑就是内核注册到了错误的 Python 环境以及依赖装错了环境。这两个问题本质都是“环境路径不对”排查时优先检查sys.executable。接下来可以扩展的方向有几条把关键词提取结果接入文本分类、主题聚类。加入自定义停用词表和自定义词典提高领域词抽取效果。对比 TF-IDF、TextRank、以及基于词向量的关键词抽取效果。把 API 服务从 Flask 升级到 FastAPI加鉴权、限流、日志做成更完整的内部服务。环境搭好之后后面跑 NLP 实验的节奏会快很多。建议把这套环境配置保存成固定的初始化流程后续每个新项目都按这个模板再来一遍能省下不少时间。