2172 字
11 分钟

Python 自然语言处理入门:从零开始的 NLP 之旅

Python自然语言处理入门:从零开始的NLP之旅#

一、什么是自然语言处理(NLP)?#

自然语言处理(Natural Language Processing, NLP)是人工智能领域的重要分支,它让计算机能够理解、分析和生成人类语言。从智能音箱的语音识别到社交媒体的情感分析,从机器翻译到智能客服,NLP技术已经渗透到我们生活的方方面面。

想象一下,当你对Siri说”今天天气怎么样?“,或者在淘宝上看到”根据你的浏览历史推荐”,这些背后都是NLP技术在发挥作用。NLP的核心挑战在于人类语言的复杂性——歧义性(“苹果”可以是水果也可以是公司)、上下文依赖(“他走了”可能指离开或步行)和非结构化特性(文本是字符序列而非表格数据)。

二、NLP基础任务一览#

NLP包含一系列核心任务,就像我们学习语言时需要先学字母、单词再学句子一样,计算机处理语言也需要循序渐进:

  1. 分词(Tokenization):将连续文本分割成有意义的词语单元
    例:“我爱自然语言处理” → [“我”, “爱”, “自然语言”, “处理”]

  2. 词性标注(POS Tagging):给每个词语标注词性(名词、动词、形容词等)
    例:“他吃苹果” → [(“他”, “代词”), (“吃”, “动词”), (“苹果”, “名词”)]

  3. 命名实体识别(NER):识别文本中的专有名词(人名、地名、组织名等)
    例:“小明在北京大学学习” → 人名:“小明”,组织名:“北京大学”

  4. 情感分析(Sentiment Analysis):判断文本的情感倾向(正面/负面/中性)
    例:“这部电影太精彩了!” → 正面情感

三、必备Python NLP工具库#

3.1 NLTK:自然语言处理的”瑞士军刀”#

NLTK(Natural Language Toolkit) 是最经典的Python NLP库,被称为”NLP教学的标准工具”。它包含50多个语料库和词汇资源,从基础的文本处理到复杂的语义分析都能胜任。

安装与基础配置#

Terminal window
pip install nltk # 安装库
import nltk
# 下载必要数据包(首次使用时)
nltk.download('punkt') # 分词模型
nltk.download('stopwords') # 停用词表(如"的"、"是"等无意义词)
nltk.download('averaged_perceptron_tagger') # 词性标注模型

基础功能示例#

1. 文本分词

from nltk.tokenize import word_tokenize, sent_tokenize
text = "Natural language processing is fascinating! It allows computers to understand human language."
# 句子分词
sentences = sent_tokenize(text)
print("句子分词结果:", sentences)
# 单词分词
words = word_tokenize(text)
print("单词分词结果:", words)

2. 去除停用词

from nltk.corpus import stopwords
# 获取英文停用词表
stop_words = set(stopwords.words('english'))
# 过滤停用词
filtered_words = [w for w in words if w.lower() not in stop_words]
print("过滤后单词:", filtered_words) # 移除了"is", "it", "to"等

3. 词性标注

from nltk.tag import pos_tag
tagged_words = pos_tag(words)
print("词性标注结果:", tagged_words)
# 输出示例:[('Natural', 'JJ'), ('language', 'NN'), ('processing', 'NN'), ...]

NLTK优势:文档丰富(官方教程)、社区支持强大,适合学习原理
NLTK局限:处理速度较慢,不适合大规模文本

3.2 spaCy:工业级NLP引擎#

spaCy 是2025年仍在广泛使用的工业级NLP库,以速度快、准确率高著称。它内置预训练模型,支持70多种语言,开箱即用地完成分词、NER等任务。

安装与模型下载#

Terminal window
pip install spacy # 安装库
python -m spacy download en_core_web_sm # 下载英文小模型(3MB)
# python -m spacy download zh_core_web_sm # 中文模型(需额外下载)

核心功能演示#

1. 命名实体识别

import spacy
# 加载英文模型
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple is looking at buying U.K. startup for $1 billion")
# 提取命名实体
for ent in doc.ents:
print(f"{ent.text}: {ent.label_}")
# 输出:
# Apple: ORG(组织)
# U.K.: GPE(国家/地区)
# $1 billion: MONEY(货币)

2. 依存句法分析

# 可视化句子语法结构(需在Jupyter环境中运行)
from spacy import displacy
displacy.render(doc, style="dep", jupyter=True)

spaCy优势:处理速度比NLTK快10倍(每秒10万字),支持中文,适合生产环境
spaCy局限:预训练模型较大(最小模型3MB,大模型1.5GB)

3.3 工具选择指南#

场景推荐工具理由
学习NLP原理NLTK代码透明,教程丰富
处理中文文本spaCy+中文模型/Jieba专门优化的中文分词
生产环境部署spaCy速度快,内存占用低
教学/科研NLTK支持自定义算法实验

四、从零开始的情感分析项目#

现在我们将结合所学知识,用IMDB电影评论数据集实现一个情感分析系统——自动判断影评是正面还是负面评价。

4.1 项目准备#

1. 下载数据集
IMDB数据集包含5万条标注好的电影评论(2.5万训练/2.5万测试):
http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
下载后解压到本地,得到train/pos(正面评论)、train/neg(负面评论)等文件夹。

2. 安装必要库

Terminal window
pip install nltk pandas scikit-learn

4.2 数据预处理#

import os
import random
import pandas as pd
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
# 读取数据集
def load_imdb_data(data_dir):
texts = []
labels = []
# 遍历正面/负面评论文件夹
for label in ['pos', 'neg']:
folder_path = os.path.join(data_dir, label)
for file in os.listdir(folder_path):
with open(os.path.join(folder_path, file), 'r', encoding='utf-8') as f:
texts.append(f.read())
labels.append(1 if label == 'pos' else 0) # 正面=1,负面=0
# 打乱数据顺序
combined = list(zip(texts, labels))
random.shuffle(combined)
return zip(*combined) # 返回(texts, labels)
# 加载训练集(取前1000条作为演示,完整数据集需去掉切片)
train_texts, train_labels = load_imdb_data('aclImdb/train')
train_texts, train_labels = train_texts[:1000], train_labels[:1000]
# 文本预处理函数
def preprocess_text(text):
# 分词
tokens = word_tokenize(text.lower())
# 去除停用词和非字母字符
stop_words = set(stopwords.words('english'))
tokens = [token for token in tokens if token.isalpha() and token not in stop_words]
return ' '.join(tokens) # 拼接成字符串供特征提取
# 预处理所有文本
processed_texts = [preprocess_text(text) for text in train_texts]

4.3 特征提取与模型训练#

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 将文本转换为数值特征(TF-IDF)
vectorizer = TfidfVectorizer(max_features=5000) # 保留5000个最关键的词汇
X_train = vectorizer.fit_transform(processed_texts)
y_train = train_labels
# 训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)
# 简单测试
test_reviews = [
"This movie was amazing! The acting was superb and the plot was gripping.",
"Terrible film. I walked out after 10 minutes. Waste of money."
]
processed_tests = [preprocess_text(review) for review in test_reviews]
X_test = vectorizer.transform(processed_tests)
predictions = model.predict(X_test)
for review, pred in zip(test_reviews, predictions):
print(f"评论: {review[:50]}...")
print(f"预测情感: {'正面' if pred == 1 else '负面'}\n")

4.4 项目改进方向#

  1. 使用更复杂模型:替换朴素贝叶斯为SVM或深度学习模型(如LSTM)
  2. 优化预处理:添加词形还原(将”running”变为”run”)
  3. 调参:调整TF-IDF的max_features和模型超参数
  4. 中文扩展:使用ChnSentiCorp中文情感数据集替换IMDB

五、2025年NLP学习资源推荐#

入门教程#

免费数据集#

进阶工具#

六、总结与下一步#

恭喜你完成了NLP入门之旅!我们从基础概念出发,学习了NLTK和spaCy两个核心库,并动手实现了情感分析项目。关键收获

  1. NLP是让计算机理解人类语言的技术,包含分词、NER、情感分析等任务
  2. Python提供了强大工具:NLTK适合学习,spaCy适合工业应用
  3. 文本需要经过预处理→特征提取→模型训练的流程才能被计算机处理

下一步学习路径

  1. 深入学习词向量(Word2Vec、GloVe)理解语义相似度
  2. 尝试预训练模型(用Hugging Face实现BERT情感分析)
  3. 探索中文NLP(使用Jieba分词和中文数据集)

记住,NLP是一个实践性很强的领域——最好的学习方法就是找一个感兴趣的项目(如分析微博评论、制作简单聊天机器人),边做边学。祝你在NLP之路上越走越远!


附录:常用NLP术语表

  • 语料库(Corpus):用于训练模型的文本集合
  • 词向量(Word Embedding):将词语映射为数值向量的技术
  • TF-IDF:衡量词语在文档中重要性的指标
  • NER:命名实体识别(识别人名、地名等)
  • 依存句法分析:分析句子中词语之间的语法关系
Python 自然语言处理入门:从零开始的 NLP 之旅
https://freebird2913.tech/posts/sample_nlp/
作者
free bird
发布于
2025-08-13
许可协议
CC BY-NC-SA 4.0