这次我们来看一个偏实战的环境搭建方案: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 下可能是 python3:
python3 --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
激活虚拟环境后,先升级 pip:
python -m pip install --upgrade pip然后安装 Notebook:
pip install notebook如果想用新版的交互界面,可以改用 Jupyter Lab:
pip install jupyterlab两者可以共存,不影响。本文后面的示例主要基于 Notebook 操作。
为了把虚拟环境注册成 Jupyter 的内核,还需要安装 ipykernel:
pip 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 --ip=0.0.0.0 --port=8888这种情况下要注意访问控制,别把未授权访问端口直接暴露在公网。
如果想后台启动不占用当前终端,Linux 环境下可以:
nohup jupyter notebook --no-browser --ip=0.0.0.0 --port=8888 > notebook.log 2>&1 &日志会写入notebook.log,方便排查启动问题。
4.8 备选方案:conda 环境
如果本机已经装了 Anaconda 或 Miniconda,也可以直接用 conda 创建环境:
conda create -n nlp_env python=3.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-IDF
TF-IDF 的思路是:一个词在当前文本里出现次数多,但在整个语料库里很少出现,那它对当前文本更有区分度,关键词权重更高。jieba 内置了基于 TF-IDF 的关键词提取接口:
import jieba.analyse text = "本文介绍如何在 Jupyter Notebook 中使用 Python 虚拟环境进行 NLP 关键词提取与文本挖掘实践。" \ "虚拟环境可以隔离不同项目的依赖,避免包版本冲突,让 NLP 实验环境更干净。Jupyter Notebook 支持交互式编程," \ "方便查看每一步的中间结果,是 NLP 文本挖掘常用的开发工具。" keywords = jieba.analyse.extract_tags(text, topK=10) print(keywords)topK=10表示返回权重最高的前 10 个关键词。默认语料库是 jieba 内置的 IDF 文件,如果处理的是特定领域文本,可以加载自定义 IDF 文件进一步调优。
5.4 关键词提取测试:TextRank
TextRank 是一种基于图排序的关键词抽取方法,不需要外部语料统计 IDF,更适合单篇文本的快速关键词抽取。jieba 也内置了这个方法:
keywords_tr = jieba.analyse.textrank(text, topK=10) 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, topK=10): """从单段文本中提取关键词""" return jieba.analyse.extract_tags(text, topK=topK) def process_file(file_path, output_path, topK=10): """处理单个文本文件,将关键词写入输出文件""" with open(file_path, "r", encoding="utf-8") as f: text = f.read() keywords = extract_keywords(text, topK=topK) with open(output_path, "w", encoding="utf-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_ok=True) 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, topK=topK) print(f"processed: {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, topK=topK) return jsonify({"keywords": keywords}) if __name__ == "__main__": app.run(host="127.0.0.1", port=8000)启动服务:
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, json=payload, timeout=30) 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 注册命令,查看输出 | 确认激活虚拟环境后重新注册内核,重启 Jupyter |
| Notebook 里 import 包报 ModuleNotFoundError | 内核选的不是虚拟环境,或依赖没装进当前环境 | 在 Cell 里打印 sys.executable,检查安装路径 | 切换内核到 nlp-keyword;重新在激活的 venv 里 pip install |
| python 不是内部或外部命令 | Python 未加入 PATH | 命令行检查python --version | Windows 安装时勾选 Add Python to PATH,或使用完整路径 |
| pip 安装速度很慢 | 网络问题或默认源访问慢 | 观察 pip 输出,看卡在哪个阶段 | 换清华镜像源:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名 |
| 中文关键词提取结果乱码 | 文件读写编码不一致 | 检查源文件编码格式 | 读写文件时统一使用encoding="utf-8" |
| PowerShell 激活虚拟环境报错 | 系统执行策略限制脚本运行 | 查看 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.bat:
@echo 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 实验的节奏会快很多。建议把这套环境配置保存成固定的初始化流程,后续每个新项目都按这个模板再来一遍,能省下不少时间。