
自然语言处理(Natural Language Processing, NLP)是人工智能的核心分支,致力于让计算机理解、处理、生成人类语言,搭建人机语言交互的桥梁。从日常使用的语音助手(Siri、小爱同学)、机器翻译(Google 翻译),到智能客服、文本摘要、情感分析,NLP 技术已渗透到生活、工作、科研的方方面面。
本文将从 NLP 的技术基础出发,系统拆解核心算法原理,结合实战代码和可视化图表,全面覆盖 NLP 的关键技术、典型应用和未来趋势,帮助读者从入门到进阶,建立对 NLP 技术体系的完整认知。

图 1:NLP 技术生态图谱(核心技术、工具、应用场景的关联关系)
人类语言具有模糊性(如 “这个苹果很甜” 的 “甜” 无量化标准)、上下文依赖性(如 “他喜欢打篮球,也喜欢看它” 中 “它” 指代篮球)、多义性(如 “银行” 可指金融机构或河岸)、文化关联性(如成语、俚语的理解需结合文化背景)四大特性,这使得 NLP 面临三大核心挑战:
NLP 的核心流程可概括为 “输入→预处理→特征提取→模型训练→输出→应用”,具体框架如图 2 所示:

图 2:NLP 核心技术流程(从原始文本到落地应用的全链路)
其中,每个环节的核心任务的:
在实战中,常用的 NLP 开源工具可大幅提升开发效率,以下是主流工具分类及代表:
工具类型 | 代表工具 | 核心功能 |
|---|---|---|
基础预处理 | NLTK、spaCy、jieba(中文) | 分词、词性标注、句法分析 |
词嵌入工具 | Gensim、FastText | 训练 Word2Vec、FastText 等词向量 |
深度学习框架 | PyTorch、TensorFlow/Keras | 搭建 NLP 深度学习模型 |
预训练模型库 | Hugging Face Transformers | 调用 BERT、GPT、T5 等预训练模型 |
中文 NLP 工具 | 哈工大 LTP、百度飞桨 PaddleNLP | 适配中文的分词、NER、句法分析 |
本文将以 Python 为主要开发语言,结合 jieba、spaCy、Hugging Face Transformers 等工具展开实战。
预处理是 NLP 的基础环节,其质量直接影响后续模型效果。核心目标是去除噪声、提取关键信息,将非结构化文本转换为机器可处理的格式。本节将详细介绍预处理的核心步骤及实战代码。
原始文本中常包含噪声(如特殊字符、标点符号、多余空格、URL 链接、表情符号),需先清洗。例如:
分词是将连续文本拆分为 “词” 或 “子词”(中文无天然分词边界,需特殊处理;英文以空格分隔,相对简单)。例如:
词性标注是为每个词标注语法类别(如名词、动词、形容词),辅助语义理解。例如:
停用词是指在文本中频繁出现但语义贡献小的词(如 “的、是、在、和”),去除后可减少数据维度,提升模型效率。
中文预处理的核心难点是分词和 NER,以下结合 jieba(轻量分词工具)和哈工大 LTP(高精度 NLP 工具)实现完整预处理流程。
# 安装依赖库
pip install jieba ltp pyhanlp pandas numpyimport re
import jieba
import jieba.analyse
from ltp import LTP
import pandas as pd
# 初始化LTP(哈工大中文NLP工具,需下载模型:默认自动下载)
ltp = LTP()
# ---------------------- 1. 文本清洗函数 ----------------------
def clean_text(text):
"""去除噪声,保留中文、英文、数字"""
# 去除URL链接
text = re.sub(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', '', text)
# 去除特殊字符、表情符号(保留中文、英文、数字、空格)
text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s]', '', text)
# 去除多余空格(连续空格转为单个)
text = re.sub(r'\s+', ' ', text).strip()
return text
# ---------------------- 2. 分词函数(jieba + 自定义词典) ----------------------
def segment_text(text, use_custom_dict=True):
"""分词:支持自定义词典提升精度"""
# 自定义词典(添加领域词汇,如NLP术语)
if use_custom_dict:
jieba.load_userdict('custom_dict.txt') # 格式:词汇 词性 词频(可选)
# 分词(精确模式)
words = jieba.lcut(text, cut_all=False)
return words
# ---------------------- 3. 停用词去除函数 ----------------------
def remove_stopwords(words):
"""去除停用词"""
# 加载停用词表(可自定义扩展)
stopwords = set(pd.read_csv('stopwords.txt', sep='\t', header=None)[0].tolist())
# 过滤停用词
filtered_words = [word for word in words if word not in stopwords and len(word) > 1]
return filtered_words
# ---------------------- 4. 词性标注与NER(基于哈工大LTP) ----------------------
def pos_ner_analysis(text):
"""词性标注 + 命名实体识别"""
# LTP处理(分词、词性标注、NER)
outputs = ltp.pipeline([text], tasks=["seg", "pos", "ner"])
seg_result = outputs.seg[0] # 分词结果
pos_result = outputs.pos[0] # 词性标注结果(采用863词性标注集)
ner_result = outputs.ner[0] # NER结果(格式:(实体类型, 起始索引, 结束索引, 实体文本))
# 整理词性标注结果(词-词性映射)
pos_map = dict(zip(seg_result, pos_result))
# 整理NER结果(提取实体类型和文本)
ner_map = []
for ner in ner_result:
ner_type, start, end, ner_text = ner
ner_map.append({"实体类型": ner_type, "实体文本": ner_text})
return pos_map, ner_map
# ---------------------- 5. 完整预处理流程调用 ----------------------
if __name__ == "__main__":
# 原始文本(示例:科技新闻片段)
raw_text = """【NLP技术前沿】百度于2023年发布了ERNIE 4.0大模型,该模型在中文理解、生成任务中表现优异,
支持多轮对话、文本摘要、机器翻译等功能,相关技术论文已发表在AI顶会NeurIPS上。"""
# 步骤1:文本清洗
cleaned_text = clean_text(raw_text)
print("=== 清洗后文本 ===")
print(cleaned_text)
# 输出:NLP技术前沿 百度于2023年发布了ERNIE 4.0大模型 该模型在中文理解 生成任务中表现优异 支持多轮对话 文本摘要 机器翻译等功能 相关技术论文已发表在AI顶会NeurIPS上
# 步骤2:分词
words = segment_text(cleaned_text)
print("\n=== 分词结果 ===")
print("/".join(words))
# 输出:NLP/技术/前沿/百度/于/2023年/发布/了/ERNIE/4.0/大模型/该/模型/在/中文/理解/生成/任务/中/表现/优异/支持/多轮/对话/文本/摘要/机器翻译/等/功能/相关/技术/论文/已/发表/在/AI/顶会/NeurIPS/上
# 步骤3:去除停用词
filtered_words = remove_stopwords(words)
print("\n=== 去除停用词后 ===")
print("/".join(filtered_words))
# 输出:NLP/技术/前沿/百度/2023年/发布/ERNIE/4.0/大模型/模型/中文/理解/生成/任务/表现/优异/支持/多轮/对话/文本/摘要/机器翻译/功能/相关/技术/论文/发表/AI/顶会/NeurIPS
# 步骤4:词性标注与NER
pos_map, ner_map = pos_ner_analysis(cleaned_text)
print("\n=== 词性标注结果 ===")
for word, pos in pos_map.items():
print(f"{word}: {pos}")
# 输出示例:NLP: n(名词)/ 技术: n / 前沿: n / 百度: nt(机构名) / 2023年: t(时间)...
print("\n=== 命名实体识别结果 ===")
for ner in ner_map:
print(f"{ner['实体类型']}: {ner['实体文本']}")
# 输出:ORG: 百度 / TIME: 2023年 / ORG: NeurIPS / MODEL: ERNIE 4.0
图 3:中文预处理效果对比(左:未预处理文本,右:预处理后结构化数据)
在 NLP 中,机器无法直接处理文本,需将其转换为数值向量。词嵌入(Word Embedding)是实现这一转换的核心技术,它将每个词映射到低维稠密向量空间,使语义相似的词在向量空间中距离更近(如 “猫” 和 “狗” 的向量距离小于 “猫” 和 “汽车”)。
词嵌入的发展经历了三个阶段,技术对比见表 2:
技术类型 | 代表方法 | 核心原理 | 优点 | 缺点 |
|---|---|---|---|---|
离散表示 | One-Hot 编码 | 为每个词分配唯一索引,向量中仅索引位置为 1,其余为 0 | 实现简单、计算快 | 维度爆炸(词汇量 10 万时向量维度 10 万)、无语义关联(“猫” 和 “狗” 向量正交) |
统计表示 | TF-IDF、LSA | 基于词频统计或矩阵分解,捕捉词的全局统计信息 | 缓解维度爆炸 | 无法捕捉词的局部上下文、语义关联弱 |
分布式表示 | Word2Vec、GloVe、FastText | 基于神经网络,通过上下文预测学习词向量 | 低维稠密(通常 50-300 维)、捕捉语义关联(如 “国王 - 男人 + 女人 = 女王”) | 静态词向量(一词一向量,无法处理多义性) |
动态词向量 | ELMo、BERT | 基于预训练模型,根据上下文动态生成词向量 | 处理多义性(如 “银行” 在 “去银行存钱” 和 “河边银行” 中向量不同) | 计算复杂度高 |
Word2Vec 是 Google 于 2013 年提出的词嵌入模型,通过 “上下文预测词”(CBOW 模型)或 “词预测上下文”(Skip-gram 模型)训练词向量,是 NLP 领域的里程碑技术。
Word2Vec 的核心思想是 “分布式假设”:上下文相似的词,语义也相似。其两个核心模型:
两者的模型结构如图 4 所示:

图 4:Word2Vec 的 CBOW 和 Skip-gram 模型结构
Word2Vec 通过负采样(Negative Sampling)或层次 Softmax(Hierarchical Softmax)解决传统神经网络训练中 Softmax 计算复杂度高的问题,使模型能处理大规模语料。
以下使用 Gensim 库训练中文词向量,语料采用中文维基百科文本(需提前下载并预处理)。
下载中文维基百科语料:https://dumps.wikimedia.org/zhwiki/,提取文本后进行预处理(清洗