之前在做 NLP 项目的过程中,最头疼的往往不是模型本身,而是环境折腾:本地 Python 版本混乱、依赖包互相冲突、Jupyter Notebook 里 import 的包和命令行里不是同一套,甚至在换了电脑之后整个项目直接跑不起来。如果只做一两个脚本,这些问题还不明显;一旦涉及 NLP 这种重依赖的领域,环境管理就成了一件必须先做好的事。
本篇文章是 Jupyter Notebook 与 Python 虚拟环境系列的第二部分(P2),主要围绕 NLP 与关键词提取场景,系统讲解如何搭建一套干净、可复用的 Python 开发环境。内容覆盖虚拟环境创建、Jupyter 内核绑定、NLP 常用库安装、关键词提取实战,以及高频报错的排查思路。
这套流程适用于以下读者:
- 刚开始接触 NLP,想用 Jupyter Notebook 做文本分析的新手。
- 本地 Python 版本混乱,经常出现“装了这个包另一个项目就用不了”的开发者。
- 需要快速完成中文分词、TF-IDF、TextRank 关键词提取的同学。
- 想在团队中统一 Python 开发环境,提高项目可复现性的工程师。
学完本文,你将能够从零搭建一个独立的 NLP 虚拟环境,并在 Jupyter Notebook 中使用该环境完成中文和英文文本的关键词提取。
1. 背景与核心概念
1.1 Jupyter Notebook 在 NLP 项目中的作用
Jupyter Notebook 是一个基于 Web 的交互式开发工具,它把代码、 Markdown 说明、运行结果和图表集合在一个文档中,非常适合做数据分析、机器学习实验和 NLP 文本探索。
在 NLP 项目里,Jupyter Notebook 的核心价值体现在以下几个方面:
- 交互式调试:可以逐行执行分词、清洗、向量化等操作,每步都能立刻看到输出结果,方便理解中间过程。
- 可视化展示:配合 matplotlib、wordcloud 等库,可以快速生成词云、词频图,直观观察文本分布。
- 文档化记录:代码和解释文字放在同一个 notebook 中,方便后续复盘,也便于和团队成员分享实验思路。
- 分段执行:处理大文本时,不需要每次都从头运行,可以将预处理、建模、评估拆成多个单元,按需执行。
不过 Jupyter Notebook 本身只是前端编辑环境,真正执行代码的是它背后的“内核(Kernel)”。内核本质上是某个 Python 解释器进程。如果我们在命令行用 pip 安装了 jieba、scikit-learn,但 Jupyter Notebook 使用的内核对应的是另一个 Python 环境,就会出现ModuleNotFoundError。这也是很多初学者最容易踩坑的地方。
1.2 Python 虚拟环境解决什么问题
Python 虚拟环境(Virtual Environment)是一种将项目依赖隔离到独立目录的机制。每个虚拟环境有自己独立的 site-packages 目录,互不干扰。
举几个真实场景:
- 项目 A 需要
scikit-learn==1.2.x,项目 B 因为兼容性需要scikit-learn==1.0.x,如果都装在全局环境,必然冲突。 - NLP 项目依赖 pandas、jieba、nltk 等体积较大的包,如果全部装进系统 Python,不仅臃肿,还会拖慢启动速度。
- 升级某个包时,可能影响其他项目。有了虚拟环境,每个项目都可以独立升级、独立回滚。
本文使用 Python 内置的venv模块来创建虚拟环境。相比conda,venv更轻量,不依赖额外的大型软件,适合绝大多数本地 NLP 项目。
1.3 NLP 与关键词提取简介
NLP(Natural Language Processing,自然语言处理)是计算机科学和人工智能的交叉领域,目标是让计算机理解、处理和生成人类语言。
关键词提取是 NLP 中的一个基础任务,它要从一段文本中自动找出最能代表文本主题的词或短语。常见方法包括:
- TF-IDF:词频(Term Frequency)和逆文档频率(Inverse Document Frequency)的乘积,衡量一个词对当前文档的重要程度。
- TextRank:基于 PageRank 的图排序算法,把词看成节点,词共现关系看成边,迭代计算词的重要性。
- 词频统计:最简单的统计方法,统计每个词在文档中出现的次数,适合快速探索。
关键词提取虽然不直接等价于“理解语义”,但在搜索、推荐、新闻摘要、文本分类等场景中非常实用。
2. 环境准备与版本说明
2.1 操作系统与 Python 版本
本文示例适用于 Windows、macOS、Linux 三大主流操作系统。由于不同系统的命令略有差异,我会在关键步骤处分别说明。
Python 版本建议使用 3.8 及以上版本。当前主流 NLP 库对新版 Python 支持较好,但个别库在 Python 3.12+ 下可能没有预编译包,所以如果你的项目对某些库有强依赖,建议优先选择 Python 3.9 到 3.11 之间的版本。
你可以用下面的命令确认当前 Python 版本:
python --version如果系统提示找不到python命令,在 Windows 上可以尝试:
py --version在 macOS/Linux 上可以尝试:
python3 --version注意:本文不会写死具体的依赖版本号,因为不同平台的安装包发布情况不同。重点演示的是环境配置思路,你在实际操作时,请以 pip 实际解析到的版本为准。
2.2 需要安装的依赖库
在开始之前,需要确保本机已安装 Python 和 pip。安装完成后,后续所有第三方依赖都会安装到虚拟环境中,不污染全局环境。
本文实战部分会用到以下库:
| 库名 | 用途 |
|---|---|
| jupyter | Jupyter Notebook 主程序 |
| ipykernel | 将虚拟环境注册为 Jupyter 内核 |
| jieba | 中文分词和关键词提取 |
| nltk | 英文文本处理 |
| scikit-learn | TF-IDF 特征提取 |
| pandas | 数据处理 |
| matplotlib | 可视化 |
| wordcloud | 词云图(可选) |
如果系统提示pip不是内部命令或找不到 pip,可以先在 Python 官网完成基础安装,再继续后面的步骤。
2.3 项目目录结构建议
为了保持项目整洁,建议先创建一个项目根目录,例如:
nlp-keyword-extraction/ ├── data/ # 存放原始文本数据 ├── notebooks/ # 存放 Jupyter Notebook 文件 ├── scripts/ # 存放 Python 脚本 └── requirements.txt # 依赖清单先用命令创建目录:
mkdir -p nlp-keyword-extraction/{data,notebooks,scripts}在 Windows PowerShell 中,上面的花括号展开语法不可用,可以分多次创建:
mkdir nlp-keyword-extraction mkdir nlp-keyword-extraction\data mkdir nlp-keyword-extraction\notebooks mkdir nlp-keyword-extraction\scripts3. 虚拟环境创建与配置
3.1 创建虚拟环境
进入项目根目录,执行以下命令创建虚拟环境。我习惯把虚拟环境命名为venv,也可以根据项目名命名,例如nlp-env。
在 Windows 或 macOS/Linux 中执行:
cd nlp-keyword-extraction python -m venv venv命令执行后,项目目录下会多出一个venv文件夹,里面包含独立的 Python 解释器、pip 和包管理目录。
3.2 激活虚拟环境
激活虚拟环境是切换 Python 运行环境的关键一步。激活后,终端命令行前的提示符会发生变化,通常会出现(venv)前缀。
Windows(Command Prompt):
venv\Scripts\activateWindows(PowerShell):
venv\Scripts\Activate.ps1如果 PowerShell 提示“无法加载文件,因为在此系统上禁止运行脚本”,可以尝试先执行一次:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUsermacOS / Linux:
source venv/bin/activate激活成功后,命令行提示符变为:
(venv) nlp-keyword-extraction$此时运行的python和pip都是虚拟环境内的程序。
3.3 安装虚拟环境工具包
激活虚拟环境后,先升级 pip,再安装 Jupyter 和 ipykernel:
python -m pip install --upgrade pip pip install jupyter ipykernel由于 Jupyter 依赖较多,安装可能需要几分钟,请耐心等待。
安装完成后,可以在虚拟环境中直接启动 Jupyter:
jupyter notebook但这里有一个关键问题:如果你用的是一个已另外安装的全局 Jupyter 启动器,它可能不会自动识别当前虚拟环境里的包。更稳妥的做法是把这个虚拟环境“注册”成 Jupyter 的一个内核,这样不管从哪个 Jupyter 入口启动,都能选择到该环境。
4. Jupyter Notebook 内核配置与使用
4.1 注册虚拟环境为 Jupyter 内核
在虚拟环境激活状态下,执行:
python -m ipykernel install --user --name nlp-env --display-name "Python (NLP)"参数含义如下:
--user:将内核配置写入当前用户的 Jupyter 数据目录,不需要管理员权限。--name:内核的内部名称,不能包含空格和特殊字符。--display-name:Jupyter 界面上显示的名称,可以写中文或空格。
执行成功后,输出类似:
Installed kernelspec nlp-env in /home/yourname/.local/share/jupyter/kernels/nlp-env4.2 启动 Jupyter Notebook
在虚拟环境激活状态下,再次启动:
jupyter notebook默认会在浏览器中打开 Jupyter 主页。如果没有自动打开,终端会输出本地访问地址,例如:
http://localhost:8888/tree复制到浏览器即可访问。
在 Jupyter 主页面新建 Notebook 时,点击右上角的New,你会看到刚才注册的Python (NLP)内核选项。选择该内核后,Notebook 内运行的代码就使用虚拟环境中的 Python 解释器和依赖包。
4.3 Jupyter Notebook 与 JupyterLab 的区别
不少读者会问:Jupyter Notebook 和 JupyterLab 到底有什么区别?简单来说,JupyterLab 是 Jupyter 的下一代交互式界面,功能更丰富,支持多标签页、拖拽式布局、终端集成等。
两者的内核机制完全一致。你可以把 JupyterLab 理解为一个更现代的“外壳”,而 Notebook 文件格式.ipynb是通用的。
如果你没有特殊偏好,推荐直接使用 JupyterLab:
jupyter lab本文的示例代码在两种界面下都可以运行。
4.4 在指定浏览器打开 Jupyter
很多 Windows 用户默认浏览器可能是 IE 或某个不兼容的内置浏览器,导致 Jupyter 打开后空白。此时可以手动指定浏览器。
方法一:在启动命令中指定。
jupyter notebook --browser "C:\Program Files\Google\Chrome\Application\chrome.exe"方法二:修改 Jupyter 配置文件。
jupyter notebook --generate-config生成的配置文件通常位于~/.jupyter/jupyter_notebook_config.py,用文本编辑器打开后,找到并修改:
c.NotebookApp.browser = "C:/Program Files/Google/Chrome/Application/chrome.exe"Windows 下路径中的反斜杠建议写成正斜杠或双反斜杠,避免转义问题。
如果你安装的是新版 JupyterLab,也可以使用自带设置界面切换浏览器,但命令行方式依然最稳妥。
5. NLP 关键词提取实战
接下来进入核心实战环节。我会先准备一段中文文本和一段英文文本,分别演示分词、清洗、TF-IDF 和 TextRank 关键词提取过程。
5.1 安装 NLP 依赖库
在虚拟环境激活状态下,执行:
pip install jieba nltk scikit-learn pandas matplotlib wordcloud安装完成后,建议先验证一下关键包是否能正常导入:
import jieba import sklearn import pandas as pd print("jieba 版本:", jieba.__version__) print("scikit-learn 版本:", sklearn.__version__) print("pandas 版本:", pd.__version__)如果每一步都正常输出,说明环境配置成功。
5.2 准备测试文本
在notebooks目录下新建一个 Notebook,选择Python (NLP)内核,写入以下示例文本。
# 中文示例文本 chinese_text = """ 自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。 它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 自然语言处理是一门融语言学、计算机科学、数学于一体的科学。 关键词提取是自然语言处理中的一个基础任务,广泛应用于文本分类、信息检索、自动摘要等领域。 """# 英文示例文本 english_text = """ Natural language processing is a subfield of linguistics, computer science, and artificial intelligence. It focuses on the interactions between computers and human language. Keyword extraction is an important task in NLP that aims to identify the most relevant terms in a document. """5.3 中文分词与词频统计
Jieba 是 Python 中最常用的中文分词库,支持精确模式、全模式和搜索引擎模式。关键词提取前,一般先分词,再去除停用词和单字。
import jieba # 精确模式分词 seg_list = jieba.cut(chinese_text, cut_all=False) tokens = [token.strip() for token in seg_list if token.strip()] print("/".join(tokens))输出示例:
自然语言/处理/是/计算机科学/领域/与/人工智能/领域/中/的/一个/重要/方向/。/...去停用词和标点后,统计词频:
import re # 定义简单的停用词集合 stopwords = set(["的", "是", "一个", "中", "与", "和", "在", "了", "。", ","]) # 清洗:保留中文字符 filtered_tokens = [] for token in tokens: token = token.strip() if not token: continue if token in stopwords: continue if not re.search(r"[\u4e00-\u9fa5]", token): continue filtered_tokens.append(token) # 词频统计 from collections import Counter word_count = Counter(filtered_tokens) print(word_count.most_common(10))这里用正则表达式[\u4e00-\u9fa5]匹配中文字符,可以过滤掉英文和纯标点符号。
5.4 使用 jieba.analyse 提取关键词
Jieba 自带关键词提取接口,支持 TF-IDF 和 TextRank 两种算法,使用非常方便。
import jieba.analyse # TF-IDF 关键词提取 print("TF-IDF 关键词:") for keyword, weight in jieba.analyse.extract_tags(chinese_text, topK=10, withWeight=True): print(f"{keyword}: {weight:.4f}")# TextRank 关键词提取 print("TextRank 关键词:") for keyword, weight in jieba.analyse.textrank(chinese_text, topK=10, withWeight=True): print(f"{keyword}: {weight:.4f}")5.5 使用 scikit-learn 实现英文 TF-IDF
Scikit-learn 提供了完整的 TF-IDF 向量化工具,适合处理英文文本,也可用于中文的基于词向量的文本表示。
from sklearn.feature_extraction.text import TfidfVectorizer # 将英文文本拆分成句子作为文档集合 documents = [ "Natural language processing is a subfield of computer science.", "Keyword extraction is an important task in NLP.", "NLP focuses on the interactions between computers and human language.", ] vectorizer = TfidfVectorizer(stop_words="english", max_features=20) tfidf_matrix = vectorizer.fit_transform(documents) # 查看特征词 print("特征词列表:") print(vectorizer.get_feature_names_out())执行后,你会得到每个文档的 TF-IDF 特征矩阵。其中,stop_words="english"会自动去除英文停用词,max_features限制保留的最大特征数量,避免矩阵过于稀疏。
如果想查看第一句话的关键词权重:
feature_names = vectorizer.get_feature_names_out() first_doc_vector = tfidf_matrix[0].toarray().flatten() # 输出权重最高的前 5 个词 top_indices = first_doc_vector.argsort()[-5:][::-1] for idx in top_indices: print(f"{feature_names[idx]}: {first_doc_vector[idx]:.4f}")5.6 绘制词云图
词云可以直观展示文本中的高频词。在 Notebook 中,使用wordcloud库绘制中文词云时,需要指定中文字体,否则会出现乱码。
from wordcloud import WordCloud import matplotlib.pyplot as plt # 拼接分词结果 text_for_cloud = " ".join(filtered_tokens) # 生成词云,注意指定中文字体路径 # Windows 常见字体 font_path = "C:/Windows/Fonts/simhei.ttf" wordcloud = WordCloud( font_path=font_path, width=800, height=400, background_color="white" ).generate(text_for_cloud) # 显示词云 plt.figure(figsize=(10, 5)) plt.imshow(wordcloud, interpolation="bilinear") plt.axis("off") plt.show()macOS 下字体路径可能是/System/Library/Fonts/PingFang.ttc,Linux 下常用/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc。如果你的系统没有可用的中文字体,可以安装wqy-microhei等开源字体,或者先跳过词云部分。
5.7 完整函数封装
为了便于复用,可以将上面的流程封装成函数。下面是一个简化版的关键词提取工具函数。
import re from collections import Counter import jieba import jieba.analyse # 默认停用词 DEFAULT_STOPWORDS = { "的", "了", "是", "一个", "在", "和", "与", "及", "等", "或", "并", "我", "你", "他", "她", "它", "我们", "你们", "他们", "。", ",", "、", "!", "?", ";", ":", "“", "”", "'", '"' } def clean_text(text: str) -> list: """清洗文本并返回中文分词结果.""" tokens = jieba.lcut(text) result = [] for token in tokens: token = token.strip() if not token: continue if token in DEFAULT_STOPWORDS: continue if not re.search(r"[\u4e00-\u9fa5]", token): continue result.append(token) return result def extract_keywords_by_tfidf(text: str, top_k: int = 10): """使用 jieba TF-IDF 提取关键词.""" return jieba.analyse.extract_tags(text, topK=top_k, withWeight=True) def extract_keywords_by_textrank(text: str, top_k: int = 10): """使用 jieba TextRank 提取关键词.""" return jieba.analyse.textrank(text, topK=top_k, withWeight=True)调用测试:
keywords_tfidf = extract_keywords_by_tfidf(chinese_text) print("TF-IDF 提取结果:") for kw, w in keywords_tfidf: print(f"{kw}: {w:.4f}") keywords_tr = extract_keywords_by_textrank(chinese_text) print("TextRank 提取结果:") for kw, w in keywords_tr: print(f"{kw}: {w:.4f}")6. 常见问题与排查思路
搭建环境和运行代码时,难免遇到各种问题。下面将高频问题整理成排查清单。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| Jupyter Notebook 打开后空白 | 浏览器兼容问题/dashboard 未加载 | 更换 Chrome/Firefox,或指定 --browser 参数 |
| import jieba 提示 ModuleNotFoundError | Notebook 内核使用的不是当前虚拟环境 | 检查内核名称,重新注册 ipykernel |
| pip 安装慢或超时 | 网络原因或默认源不稳定 | 使用国内镜像源,例如-i https://pypi.tuna.tsinghua.edu.cn/simple |
| 虚拟环境激活失败 | Windows PowerShell 执行策略限制 | 以管理员身份运行 Set-ExecutionPolicy 命令 |
| 中文词云出现乱码 | wordcloud 缺少中文字体 | 指定 font_path 为中文字体文件 |
| jupyter 命令找不到 | Jupyter 未安装在当前环境中 | 确认已经激活虚拟环境,并执行 pip install jupyter |
| 端口 8888 被占用 | 上次运行的 Jupyter 未关闭 | 指定其他端口,如jupyter notebook --port 8889 |
| 内核一直显示 “Connecting” | 内核进程启动失败 | 在终端启动 jupyter 查看报错信息,或重启 kernel |
6.1 如何确认 Notebook 当前使用的 Python 环境
在 Notebook 单元格中执行以下代码,可以看到当前内核对应的解释器路径:
import sys print(sys.executable)如果输出路径是/path/to/your/venv/bin/python或venv\Scripts\python.exe,说明虚拟环境绑定成功。如果输出的是系统 Python 路径,说明内核选错了。
6.2 requirements.txt 导出与复现
当你的项目依赖确定后,建议导出依赖清单,方便其他人复现环境:
pip freeze > requirements.txt在另一台机器或新环境中安装:
pip install -r requirements.txt需要注意的是,pip freeze会列出所有包以及精确版本号。如果只是给项目使用,也可以先用pip list查看,手动整理出核心依赖,避免把一些无关包也带进清单。
7. 最佳实践与工程建议
7.1 环境隔离是 NLP 项目的第一步
NLP 项目涉及大量第三方库,版本敏感度比较高。建议每个项目都创建独立的虚拟环境,并在项目根目录保留requirements.txt。这不仅能避免“本机可运行,别人运行报错”的尴尬,也方便自己在一段时间后重新构建环境。
7.2 明确虚拟环境、内核和 Notebook 的关系
有的人在虚拟环境里安装包后,发现 Jupyter 里依然导入失败,本质原因就是虚拟环境和内核不一致。请记住:
- 虚拟环境是包的容器。
- 内核是 Notebook 与 Python 解释器之间的桥梁。
- 每个虚拟环境只能通过注册后的内核被 Jupyter 使用。
绑定流程只需要一次:
pip install ipykernel python -m ipykernel install --user --name nlp-env --display-name "Python (NLP)"7.3 使用 .gitignore 忽略虚拟环境
如果你使用 Git 管理代码,不要把venv目录和 Jupyter 的.ipynb_checkpoints目录提交到仓库。建议在项目根目录创建.gitignore:
venv/ __pycache__/ .ipynb_checkpoints/ *.pyc .DS_Store这就避免了团队协作时把无用文件提交上去。
7.4 Notebook 代码尽量模块化
Notebook 适合做实验和探索,但不适合长期维护大型逻辑。建议把可复用的函数放到scripts/目录下的.py文件中,在 Notebook 里通过from scripts import keyword_utils方式导入。这样既保留了 Notebook 的交互性,也保证了代码可维护性。
7.5 数据处理时注意内存与性能
处理大规模文本时,建议分批读取数据,不要一次性把所有文本都加载到内存。例如用 pandas 按块读取 CSV,或使用 Python 生成器逐行处理文件。对于 TF-IDF 矩阵,max_features参数可以控制特征数量,避免矩阵过大导致内存溢出。
7.6 保存关键运行结果
Notebook 单元格输出默认只保留在浏览器会话中。如果运行结果很重要,建议用以下方式持久化保存:
# 将关键词结果保存为 CSV import csv import pandas as pd df_keywords = pd.DataFrame(keywords_tfidf, columns=["keyword", "weight"]) df_keywords.to_csv("../data/keywords_tfidf.csv", index=False, encoding="utf-8-sig")使用utf-8-sig编码可以避免 Excel 打开 CSV 时出现中文乱码。
8. 下一步学习方向
环境搭好、关键词提取跑通之后,你可以继续往这些方向深入:
- 文本向量化:除了 TF-IDF,还可以尝试 Word2Vec、BERT 等预训练模型,将文本转换为语义向量。
- 主题模型:使用 LDA(Latent Dirichlet Allocation)发现文档中的隐藏主题。
- 文本分类:基于关键词特征或词向量,训练朴素贝叶斯、SVM、随机森林等分类器。
- 摘要生成:从“关键词提取”升级到“关键句提取”,做抽取式文本摘要。
- 可视化:用 pyLDAvis 做主题可视化,用 networkx 做共现网络图。
这些方向都建议在已经搭好的虚拟环境中继续尝试。新建 Notebook 时选择同一个内核,就可以直接复用已安装的库。
建议你也把这篇笔记中的环境配置流程整理成一个自己的“新项目启动模板”,以后每做一个 NLP 项目就按这个流程走:建目录、建虚拟环境、装 Jupyter、注册内核、装依赖、开始实验。这种方式前期看起来多花了几分钟,后期能省下大量排错时间。如果过程中遇到其他问题,欢迎在评论区记录你的报错信息和解决过程,互相参考。