spaCy 是 Python 生态中最主流、最适合生产环境的工业级 NLP 库,主打速度快、API简洁、开箱即用,支持分词、词性标注、NER、依存句法、词向量等全套 NLP 能力。
一、核心特点
- 速度极快:底层 Cython 优化,处理效率远超 NLTK。
- 开箱即用:内置 70+ 语言预训练模型(含中文),无需从零训练。
- 统一 API :
Doc/Token/Span封装所有结果,便于后续处理。 - 可扩展:支持自定义组件、与 PyTorch/TensorFlow/LLM 集成。
- 可视化 :内置
displacy做句法/实体可视化。
二、安装与模型下载(Python 3.7+)
1. 安装 spaCy
bash
# 基础安装
pip install spacy
# 安装可视化工具(可选)
pip install spacy[displacy]
# 国内镜像加速
pip install spacy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip show spacy
Name: spacy
Version: 3.8.13
Summary: Industrial-strength Natural Language Processing (NLP) in Python
Home-page: https://spacy.io
Author: Explosion
Author-email: contact@explosion.ai
License: MIT
Location: D:\Python311\Lib\site-packages
Requires: catalogue, confection, cymem, jinja2, murmurhash, numpy, packaging, preshed, pydantic, requests, setuptools, spacy-legacy, spacy-loggers, srsly, thinc, tqdm, typer, wasabi, weasel
Required-by: fastai
2. 下载预训练模型
bash
# 英文轻量模型(推荐入门)
python -m spacy download en_core_web_sm
# 中文轻量模型(支持分词、NER、词性)
python -m spacy download zh_core_web_sm
# 英文大模型(含词向量,准确率更高)
# python -m spacy download en_core_web_lg
三、基础用法(英文 + 中文示例)
1. 英文示例:分词、词性、NER、依存
python
import spacy
# 加载英文模型
nlp = spacy.load("en_core_web_sm")
text = "Apple is looking at buying U.K. startup for $1 billion."
doc = nlp(text)
# 1. 分词 + 词性 + 依存
print("=== Token 信息 ===")
for token in doc:
print(f"{token.text:10} {token.pos_:6} {token.dep_:8} {token.head.text}")
# 2. 命名实体识别(NER)
print("\n=== 命名实体 ===")
for ent in doc.ents:
print(f"{ent.text:15} {ent.label_:8} {spacy.explain(ent.label_)}")
# 3. 句子拆分
print("\n=== 句子 ===")
for sent in doc.sents:
print(sent.text)
2. 中文示例:分词、词性、NER
python
import spacy
# 加载中文模型
nlp = spacy.load("zh_core_web_sm")
text = "北京是中国的首都,字节跳动总部位于北京海淀区。"
doc = nlp(text)
# 分词 + 词性
print("=== 中文 Token ===")
for token in doc:
print(f"{token.text:4} {token.pos_:6} {token.dep_:8}")
# 实体识别
print("\n=== 中文实体 ===")
for ent in doc.ents:
print(f"{ent.text:6} {ent.label_:8} {spacy.explain(ent.label_)}")
四、核心对象与属性
Doc:处理后的文档,可遍历、切片、访问句子/实体。Token:单个词/标点,常用属性:token.text:原文token.pos_:词性(如NOUN/VERB/PROPN)token.dep_:依存关系(如nsubj/dobj)token.lemma_:词形还原token.ent_type_:实体类型(如GPE/ORG)
Span:连续片段(如doc[0:3]),可用于实体/短语提取。
五、进阶常用功能
1. 词向量(需 lg 模型)
python
nlp = spacy.load("en_core_web_lg")
doc = nlp("cat dog banana")
print(doc[0].vector) # cat 的向量
print(doc[0].similarity(doc[1])) # cat 与 dog 相似度
2. 可视化(displacy)
python
from spacy import displacy
# 实体可视化
displacy.serve(doc, style="ent")
# 句法树可视化
displacy.serve(doc, style="dep")
3. 自定义 pipeline(添加规则/组件)
python
from spacy.language import Language
@Language.component("custom_component")
def custom_component(doc):
# 自定义逻辑:给含 "AI" 的 Token 加标签
for token in doc:
if "AI" in token.text:
token._.set("is_ai", True)
return doc
# 注册并添加到 pipeline
nlp.add_pipe("custom_component", last=True)
六、与 NLTK 对比(快速选型)
| 特性 | spaCy | NLTK |
|---|---|---|
| 定位 | 工业级、生产就绪 | 教学、研究、灵活实验 |
| 速度 | 极快(Cython) | 较慢(纯 Python) |
| API | 简洁统一 | 零散、多模块 |
| 预训练模型 | 丰富、多语言 | 较少、需额外下载 |
| 中文支持 | 较好(zh_core_web_sm) |
需额外工具(如 jieba) |
七、常见问题
- 模型下载慢 :用国内镜像或手动下载
.whl安装。 - 中文分词不准 :可结合
jieba自定义分词器,或使用更大模型。 - 版本冲突 :建议用虚拟环境(
venv/conda)隔离依赖。
这是一份可直接运行的 spaCy 中文 NER + 关键词提取 + 文本分类 完整脚本。
这是一份可复制、可直接运行、中文全功能 spaCy 脚本,包含:
- 中文分词
- 词性标注
- 命名实体识别(NER)
- 关键词提取
- 简单文本分类(基于规则 + 实体)
- 句法依存可视化
- 干净输出格式
你只需要安装依赖就能跑。
一、先安装(复制运行)
bash
pip install spacy
python -m spacy download zh_core_web_sm
二、完整可运行代码(直接复制)
python
import spacy
from spacy import displacy
from collections import Counter
# ======================
# 1. 加载中文模型
# ======================
nlp = spacy.load("zh_core_web_sm")
# ======================
# 2. 测试文本(可自己改)
# ======================
text = """
北京是中国的首都,华为公司总部位于深圳龙岗区。
2025年人工智能技术快速发展,马斯克访问中国并参观了上海特斯拉工厂。
"""
# 处理文本
doc = nlp(text.strip())
# ======================
# 3. 中文分词 + 词性标注
# ======================
print("=" * 50)
print("【分词 & 词性标注】")
print("=" * 50)
for token in doc:
print(f"词语:{token.text:<6} | 词性:{token.pos_:<8} | 依存:{token.dep_}")
# ======================
# 4. 命名实体识别 NER(最常用!)
# ======================
print("\n" + "=" * 50)
print("【命名实体识别 NER】")
print("=" * 50)
for ent in doc.ents:
print(f"实体:{ent.text:<10} | 类型:{ent.label_:<8} | 说明:{spacy.explain(ent.label_)}")
# ======================
# 5. 关键词提取(基于名词/实体)
# ======================
print("\n" + "=" * 50)
print("【关键词提取】")
print("=" * 50)
keywords = []
for token in doc:
# 提取名词、专有名词、实体词
if token.pos_ in ["NOUN", "PROPN"] and token.ent_type_:
keywords.append(token.text)
# 统计高频词
key_count = Counter(keywords)
for word, count in key_count.most_common(10):
print(f"{word} ({count}次)")
# ======================
# 6. 简单文本分类(基于实体)
# ======================
print("\n" + "=" * 50)
print("【智能文本分类】")
print("=" * 50)
labels = []
for ent in doc.ents:
if ent.label_ == "GPE":
labels.append("地理/城市")
if ent.label_ == "ORG":
labels.append("公司/机构")
if ent.label_ == "PERSON":
labels.append("人物")
if ent.label_ == "DATE":
labels.append("时间")
labels = list(set(labels)) # 去重
print(f"这段文本包含类别:{', '.join(labels)}")
# ======================
# 7. 句法可视化(浏览器打开)
# ======================
print("\n正在启动句法可视化...(浏览器自动打开)")
displacy.serve(doc, style="dep", host="127.0.0.1", port=5000)
三、运行后你会得到:
- 分词结果
- 每个词的词性
- 实体识别(地点、公司、人名、时间)
- 自动提取关键词
- 自动判断文本类别
- 浏览器打开句法树可视化
四、如果你想,我还能帮你做:
- 批量处理 Excel/CSV 文件
- 训练自己的 NER 模型
- 提取新闻中的公司、人物、地址
- 做情感分析
- 做文本摘要