自然语言处理(NLP)是人工智能领域中让计算机理解、处理和生成人类语言的核心技术,小到智能输入法、聊天机器人,大到机器翻译、舆情分析,都离不开NLP的支撑。Python凭借丰富的第三方库(如NLTK、spaCy、jieba)成为NLP开发的首选语言,本文将从环境搭建到实战项目,手把手教你入门Python NLP,适合零基础的编程学习者和数据分析爱好者。
一、Python NLP核心库与环境搭建
在开始NLP实践前,首先要搭建好开发环境,Python的NLP库各有侧重,我们先安装最常用的核心库,并解决安装过程中常见的问题。
1. 基础库安装
推荐使用pip包管理器安装,建议在虚拟环境中操作(避免库版本冲突),以下是必备库的安装命令:
# 安装Python核心数据处理库(后续NLP会用到)
pip install numpy pandas
# 安装英文NLP基础库NLTK
pip install nltk
# 安装高效的工业级NLP库spaCy
pip install spacy
# 安装中文分词库jieba(处理中文的核心库)
pip install jieba
# 安装文本向量化库scikit-learn(用于NLP任务的建模)
pip install scikit-learn
2. 语料库与模型下载
NLP库需要依赖预训练的语料库和模型,比如NLTK的停用词库、spaCy的英文模型:
# 下载NLTK语料库(首次运行需执行,选择所需的语料库,如stopwords、punkt)
import nltk
nltk.download() # 弹出图形界面,选择"stopwords"(停用词)、"punkt"(分句分词)、"averaged_perceptron_tagger"(词性标注)# 下载spaCy的英文小模型(适合入门,体积小)
# 终端执行:python -m spacy download en_core_web_sm
注意:如果nltk.download()下载失败,可手动从NLTK官网下载语料库,解压到C:\nltk_data(Windows)或/usr/share/nltk_data(Linux)目录。
二、NLP基础预处理:让计算机“读懂”文本
计算机无法直接理解自然语言,必须将文本转化为结构化的数字或符号,文本预处理是NLP的第一步,也是最关键的步骤之一,主要包括分词、去停用词、词性标注、词形还原等操作。
1. 分词:把文本拆分成最小单位
分词是将连续的文本拆分成单词、词组(中文)等基本单位,英文分词相对简单(按空格分割),但中文需要专门的分词库(如jieba)。
(1)英文分词(NLTK+spaCy)
# 使用NLTK进行英文分词
from nltk.tokenize import word_tokenizetext_en = "Python is a great programming language for NLP. I love learning NLP with Python!"
# 分词
tokens_nltk = word_tokenize(text_en)
print("NLTK分词结果:", tokens_nltk)# 使用spaCy进行英文分词(更智能,能识别标点和实体)
import spacy
# 加载spaCy英文模型
nlp_spacy = spacy.load("en_core_web_sm")
doc = nlp_spacy(text_en)
# 提取分词结果(排除标点)
tokens_spacy = [token.text for token in doc if not token.is_punct]
print("spaCy分词结果:", tokens_spacy)
(2)中文分词(jieba)
jieba是Python处理中文的主流分词库,支持精准模式、全模式和搜索引擎模式:
import jiebatext_zh = "自然语言处理是人工智能的重要分支,用Python学习NLP非常方便"
# 精准模式(默认,适合常规分词)
tokens_jieba = jieba.lcut(text_zh)
print("jieba精准分词:", tokens_jieba)# 全模式(列出所有可能的分词结果)
tokens_jieba_all = jieba.lcut(text_zh, cut_all=True)
print("jieba全模式分词:", tokens_jieba_all)# 搜索引擎模式(适合搜索引擎分词)
tokens_jieba_search = jieba.lcut_for_search(text_zh)
print("jieba搜索引擎模式:", tokens_jieba_search)
实战技巧:如果需要对专业领域文本(如医疗、金融)分词,可向jieba添加自定义词典,用jieba.load_userdict("user_dict.txt")加载,提升分词准确率。
2. 去停用词:剔除无意义的词汇
停用词是指对文本含义无贡献的词汇(如“的”“是”“a”“the”),剔除后能减少计算量,聚焦核心信息。
# 英文停用词处理(NLTK)
from nltk.corpus import stopwords# 获取英文停用词表
stop_words_en = set(stopwords.words('english'))
# 过滤停用词
filtered_tokens_en = [token for token in tokens_spacy if token.lower() not in stop_words_en]
print("英文去停用词后:", filtered_tokens_en)# 中文停用词处理(自定义停用词表)
# 先准备中文停用词表(可从网上下载通用中文停用词库,保存为stopwords_zh.txt)
def load_stopwords(file_path):with open(file_path, 'r', encoding='utf-8') as f:stopwords = [line.strip() for line in f.readlines()]return set(stopwords)# 加载中文停用词
stop_words_zh = load_stopwords("stopwords_zh.txt")
# 过滤中文停用词
filtered_tokens_zh = [token for token in tokens_jieba if token not in stop_words_zh]
print("中文去停用词后:", filtered_tokens_zh)
3. 词性标注与词形还原
(1)词性标注:判断词汇的语法属性(名词、动词、形容词等)
# NLTK英文词性标注
from nltk import pos_tag# 对英文分词结果标注词性
pos_tags = pos_tag(tokens_nltk)
print("NLTK词性标注:", pos_tags)# spaCy中文词性标注(需加载中文模型,终端执行:python -m spacy download zh_core_web_sm)
nlp_zh = spacy.load("zh_core_web_sm")
doc_zh = nlp_zh(text_zh)
pos_tags_zh = [(token.text, token.pos_) for token in doc_zh]
print("spaCy中文词性标注:", pos_tags_zh)
(2)词形还原:将词汇还原为原形(如“running”→“run”,“better”→“good”)
# spaCy英文词形还原
lemmas = [token.lemma_ for token in doc if not token.is_punct]
print("spaCy词形还原:", lemmas)
三、Python NLP实战:情感分析(文本分类)
情感分析是NLP的经典任务,目标是判断文本的情感倾向(正面/负面),我们以IMDB影评数据集为例,用朴素贝叶斯模型实现情感分析。
1. 数据加载与预处理
IMDB数据集包含5万条影评,分为训练集和测试集,scikit-learn可直接加载:
import pandas as pd
from sklearn.datasets import load_files
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report# 加载IMDB数据集(首次运行会自动下载)
imdb_data = load_files(r"imdb_reviews", categories=['pos', 'neg']) # 若本地无数据,可改用sklearn的fetch_20newsgroups
X, y = imdb_data.data, imdb_data.target# 将文本转化为TF-IDF特征(将文本向量化,是NLP建模的核心步骤)
tfidf = TfidfVectorizer(stop_words='english', max_features=5000) # 只保留5000个高频词
X_tfidf = tfidf.fit_transform([text.decode('utf-8') for text in X])# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_tfidf, y, test_size=0.2, random_state=42)
2. 模型训练与评估
# 训练朴素贝叶斯模型
nb_model = MultinomialNB()
nb_model.fit(X_train, y_train)# 模型预测
y_pred = nb_model.predict(X_test)# 评估模型
print("模型准确率:", accuracy_score(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, target_names=['负面', '正面']))
3. 自定义文本情感预测
# 测试自定义影评
def predict_sentiment(text):# 文本向量化text_tfidf = tfidf.transform([text])# 预测情感result = nb_model.predict(text_tfidf)[0]return "正面" if result == 1 else "负面"# 测试
test_text1 = "This movie is amazing! The plot is very touching and the actors are excellent."
test_text2 = "Worst movie ever! I wasted 2 hours watching it, the story is boring."
print(predict_sentiment(test_text1)) # 输出:正面
print(predict_sentiment(test_text2)) # 输出:负面
四、Python NLP实战:中文关键词提取
关键词提取能快速概括文本核心内容,我们用jieba结合TF-IDF实现中文关键词提取:
from jieba.analyse import extract_tags# 中文文本
text_zh = "人工智能是一门旨在使计算机系统能够模拟、延伸和扩展人类智能的技术科学,它涵盖了机器学习、自然语言处理、计算机视觉等多个领域,Python作为人工智能领域的主流编程语言,被广泛应用于机器学习模型的开发和自然语言处理任务的实现。"# 提取Top5关键词(基于TF-IDF)
keywords = extract_tags(text_zh, topK=5, withWeight=True)
print("中文关键词提取:")
for word, weight in keywords:print(f"{word}: {weight:.4f}")