python:spaCy 工业级 NLP 库

spaCy 是 Python 生态中最主流、最适合生产环境的工业级 NLP 库,主打速度快、API简洁、开箱即用,支持分词、词性标注、NER、依存句法、词向量等全套 NLP 能力。


一、核心特点

  • 速度极快:底层 Cython 优化,处理效率远超 NLTK。
  • 开箱即用:内置 70+ 语言预训练模型(含中文),无需从零训练。
  • 统一 APIDoc/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)

三、运行后你会得到:

  1. 分词结果
  2. 每个词的词性
  3. 实体识别(地点、公司、人名、时间)
  4. 自动提取关键词
  5. 自动判断文本类别
  6. 浏览器打开句法树可视化

四、如果你想,我还能帮你做:

  • 批量处理 Excel/CSV 文件
  • 训练自己的 NER 模型
  • 提取新闻中的公司、人物、地址
  • 做情感分析
  • 做文本摘要
相关推荐
Flittly2 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(11)Autonomous Agents (自治智能体)
笔记·python·ai·ai编程
2301_776508722 小时前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
dmlcq2 小时前
一文读懂 PageQueryUtil:分页查询的优雅打开方式
开发语言·windows·python
Mr.Cheng.2 小时前
TOWARDS INTERPRETING VISUAL INFORMATIONPROCESSING IN VISION-LANGUAGE MODELS
人工智能·语言模型·自然语言处理
今儿敲了吗2 小时前
python基础学习笔记第八章——异常
笔记·python·学习
umeelove352 小时前
【Flask】四、flask连接并操作数据库
数据库·python·flask
ProgramHan2 小时前
十大排行榜——后端语言及要介绍
java·c++·python·php
小江的记录本2 小时前
【反射】Java反射 全方位知识体系(附 应用场景 + 《八股文常考面试题》)
java·开发语言·前端·后端·python·spring·面试
Flying pigs~~2 小时前
迁移学习之中文文本分类微调
深度学习·自然语言处理·迁移学习