本文汇总几个Python生态下的NLP库。
fastText
官网,FaceBook开源(GitHub,26.5K Star,4.8K Fork)NLP项目,虽然项目已于24年3月19日归档。
特性:
- 文本分类:最快几分钟搞定,LSTM可能要训练几个小时
- 数据量很小,也能通过字符级n-gram捕捉词形信息,解决生僻词问题
- 多语言:支持157种
- 词向量训练
- 处理生僻词:词由子词构成
- 垃圾邮件过滤
- 情感分析
- 意图识别
- 关键词扩展
局限性
- 不是万能钥匙:对于需要理解长距离依赖、复杂语义的任务(比如机器翻译、文本生成),fastText不如BERT、GPT这些大模型。
- 特征相对简单:主要基于词袋和
n-gram,对词序和深层语义建模有限。 - 需要文本预处理 中文需要先分词,英文最好做小写化等处理。
- 内存使用:虽然模型小,但加载大量词向量时内存占用不小。
实战
安装:pip install fasttext
示例:
py
import fasttext
with open('train.txt', 'w') as f:
f.write('__label__sports 梅西梅开二度 巴萨取胜\n')
f.write('__label__tech 苹果发布新iPhone 搭载A15芯片\n')
f.write('__label__entertainment 新电影上映 票房破纪录\n')
model = fasttext.train_supervised(
input='train.txt',
epoch=25, # 训练轮数
lr=1.0, # 学习率
wordNgrams=2 # 考虑2-gram特征
)
labels, probabilities = model.predict('湖人队夺得总冠军')
print(labels) # ['__label__sports']
print(probabilities) # [0.95] 置信度很高
# 模型只有几MB
model.save_model('news_classifier.bin')
model = fasttext.train_unsupervised(
'wiki.txt', # 纯文本,一行一句话
model='cbow', # 或者'skipgram'
dim=300 # 300维向量
)
# 获取词向量
vector = model.get_word_vector('人工智能')
# 找相似词
model.get_nearest_neighbors('机器学习', k=5)
# 输出: [('深度学习', 0.89), ('人工智能', 0.85), ...]
model = fasttext.train_supervised('spam_data.txt')
# 准确率90%以上,每秒能处理几千封邮件;实时过滤
is_spam = model.predict('免费领取 iPhone 13')[0][0]
# '__label__spam'
sentiment = model.predict('商品质量很好,物流很快')
# ['__label__positive']
intent = model.predict('明天北京的天气怎么样')
# ['__label__weather_query']
similar = model.get_nearest_neighbors('编程', k=10)
# ['代码', '开发', '软件', '计算机', ...]
SentencePiece
Google开源(GitHub,11.7K Star,1.3K Fork)
忘掉"词"这个概念,直接从数据中学习最优的"片段"。把文本当作原始的字符序列,然后用一种称为BPE(字节对编码)或Unigram的算法,从海量文本中统计出哪些字符组合经常出现,这些组合就成"片段"。这些片段可能是一个字、一个词,甚至是一个词的一部分,一切由数据决定。
实战
安装:pip install sentencepiece
示例:
py
import sentencepiece as spm
# 训练分词模型
spm.SentencePieceTrainer.train(
input='input.txt',
model_prefix='my_model',
vocab_size=5000
)
# 加载模型
sp = spm.SentencePieceProcessor(model_file='my_model.model')
text = "自然语言处理有点意思"
tokens = sp.encode_as_pieces(text)
# 反向解码回文本
original = sp.decode_pieces(tokens)
给片段加上▁符号来表示空格或词的开头。
优势:
- 语言无关:支持中文、日文、英文,甚至混合文本。不需要为每种语言找不同的分词工具
- 处理"未知"很优雅:遇到没见过的词时,传统分词器可能直接报错或乱拆。但SentencePiece会把它拆成已知的片段组合。比如训练时没见过"ChatGPT",但它认识"Chat"和"GPT",就能合理处理
- 控制词典大小:可自由设定想要多少个"词"在词典里
- 子词级别的优势:对AI模型来说,"深度"、"学习"、"深度学习"如果是三个独立的词,模型可能学不到它们的关系。但如果"深度学习"能被拆成"深度"+"学习",模型就能建立这种组合关系。
局限性:
- 需要足够的数据来训练(通常至少几万句子)
- 训练需要一些计算资源(虽然比训练模型小得多)
- 对于某些需要严格保持词语边界的任务(如实体识别),可能需要调整使用方式
TextBlob
官方文档,开源(GitHub,9.5K Star,1.2K Fork)工具,基于NLTK和Pattern构建,将NLP常用功能封装成极其简单的API,让开发者能以最少代码完成任务,特别适合快速原型开发。
特性:
- 词性标注(POS Tagging):自动识别文本中每个单词的词性
- 名词短语提取:智能提取文本中的名词短语
- 情感分析:分析文本的情感倾向和主观性
- 分类:支持文本分类任务
- 语言翻译和检测:集成Google翻译API
- 词形变化:支持单词的单复数转换和词形还原
- 拼写纠正:自动纠正拼写错误
N-gram提取:提取文本的n元组- WordNet集成:访问WordNet词汇数据库
首次使用特定功能时会自动下载所需NLTK模型数据包;内置的情感分析是其招牌特性,能快速返回情感极性和主观性指标;能进行基础的语法分析,识别词性并快速提取关键名词短语;集成实用的文本校正和跨语言功能,支持拼写纠正和快速翻译;可轻松将文本分解为单词或句子,并配合标准库进行简单的词频统计。
实战
安装:pip install textblob
下载NLTK语料库:python -m textblob.download_corpora
示例:
py
from textblob import TextBlob
from collections import Counter
essay = TextBlob("""Data science is multi-disciplinary.
Science drives data science. Data enables science.""")
words = essay.words
word_freq = Counter(words.lower() for word in words if len(word) > 2)
print("出现次数大于1的关键词:")
for word, count in word_freq.items():
if count > 1:
print(f" '{word}': {count} 次")
TextBlob提供简洁的方法来实现分词和词性标注。通过创建TextBlob对象,可轻松访问文本的单词列表和句子列表。词性标注功能能够自动识别每个单词在句子中的语法角色,如名词、动词、形容词等。
情感分析,能够自动判断文本的情感倾向。sentiment属性返回一个包含polarity(极性)和subjectivity(主观性)的命名元组。极性值范围从-1(负面)到1(正面),0表示中性;主观性值范围从0(客观)到1(主观)。
名词短语提取功能可以自动识别文本中的名词短语,这些短语通常代表文本的核心主题和关键信息。TextBlob使用内置的名词短语提取器来识别连续的名词组合。例如,在处理新闻文章时,可以快速提取出文章的主要话题和实体。
集成Google翻译API,提供强大的语言翻译和检测功能。translate()方法可将文本翻译成目标语言,detect_language()方法可以自动检测文本的语言类型。
自动拼写纠正功能,可识别并修正文本中的拼写错误。correct()方法基于词频统计来推断正确的拼写,虽然纠正准确率不是100%,但对于常见拼写错误效果很好。
TextBlob支持单词的词形变化操作,包括单复数转换、动词时态变化等。Word对象提供pluralize()和singularize()方法来处理名词的单复数形式,lemmatize()方法可将单词还原为词根形式。这些功能在文本规范化、信息检索、文本匹配等任务中非常重要,可帮助统一不同形式的同一单词。
py
from textblob import TextBlob
text = TextBlob("Python is a powerful programming language. It is easy to learn.")
# 分词
print("单词列表:", text.words)
# 句子分割
print("句子列表:", text.sentences)
# 词性标注
print("词性标注:", text.tags)
# 输出: [('Python', 'NNP'), ('is', 'VBZ'), ('a', 'DT'), ('powerful', 'JJ'), ...]
positive = TextBlob("This product is amazing! I love it.")
print("正面情感:", positive.sentiment)
# 输出: Sentiment(polarity=0.625, subjectivity=0.9)
# 情感极性、主观性
negative = TextBlob("This is terrible. I hate it.")
print("负面情感:", negative.sentiment)
# 输出: Sentiment(polarity=-0.8, subjectivity=0.9)
# 中性文本
neutral = TextBlob("The sky is blue.")
print("中性情感:", neutral.sentiment)
# 输出: Sentiment(polarity=0.0, subjectivity=0.0)
text = TextBlob("Natural language processing is a subfield of artificial intelligence. ","Machine learning algorithms are widely used in NLP tasks.")
# 提取名词短语
print("名词短语:", text.noun_phrases)
# 输出: ['natural language processing', 'artificial intelligence', 'machine learning algorithms', 'nlp tasks']
# 语言检测
text = TextBlob("Bonjour, comment allez-vous?")
print("检测语言:", text.detect_language())
# 输出: 'fr' (法语)
translated = text.translate(to='en')
chinese = TextBlob("Hello, how are you?")
print("中文翻译:", chinese.translate(to='zh-CN'))
# 拼写错误的文本
text = TextBlob("I havv goood speling!")
print("原文:", text)
print("纠正后:", text.correct())
# 单词级别的纠正
from textblob import Word
word = Word('speling')
print("单词纠正:", word.correct())
# 输出: 'spelling'
# 单复数转换
word = Word("octopus")
print("复数形式:", word.pluralize())
# 输出: 'octopi'
word = Word("children")
print("单数形式:", word.singularize())
# 输出: 'child'
# 词形还原
word = Word("running")
print("词根形式:", word.lemmatize("v")) # v表示动词
# 输出: 'run'
总结:相比NLTK和spaCy,TextBlob上手极快、API直观。但功能基础,不适合处理海量文本。适合新手入门或快速验证想法。
aeon
从sktime库分离出来的开源(GitHub,1.4K Star,261 Fork)专业时间序列机器学习工具包,专注于提供高性能的算法实现和统一的API接口。官方文档。
整合深度学习、传统机器学习和统计方法,支持单变量和多变量时间序列处理。更注重计算效率和算法的现代化实现,提供大量经过优化的分类器、回归器和变换器,适用于预测、分类、聚类等多种任务。
特性:
- 丰富的算法库:包含数十种时间序列分类、回归和聚类算法
- 深度学习集成:提供CNN、ResNet、LSTM等现代深度学习模型
- 高性能实现:算法经过优化,执行速度显著快于传统实现
- 统一API设计:遵循scikit-learn风格,学习成本低
- 数据变换工具:支持特征提取、数据增强、降维等预处理操作
- 基准数据集:内置多个标准时间序列数据集,便于算法评估
实战
安装:pip install aeon
时间序列分类是识别序列所属类别的任务,如动作识别、设备状态判断等。使用Aeon的经典分类器ROCKET,通过随机卷积核提取特征后用Ridge分类器预测。ROCKET在多个基准数据集上表现优异且速度快,适合快速建立分类基线模型。
py
from aeon.classification.convolution_based import RocketClassifier
from aeon.datasets import load_arrow_head
import numpy as np
X_train, y_train = load_arrow_head(split="train")
X_test, y_test = load_arrow_head(split="test")
# 训练ROCKET分类器
classifier = RocketClassifier(num_kernels=10000)
classifier.fit(X_train, y_train)
# 预测和评估
accuracy = classifier.score(X_test, y_test)
print(f"分类准确率: {accuracy:.4f}")
回归任务用于预测连续数值,如销量预测、温度估计等。使用基于距离的时间序列回归器KNeighborsTimeSeriesRegressor,通过计算时间序列间的DTW(动态时间规整)距离找到最近邻样本进行预测。
py
from aeon.regression.distance_based import KNeighborsTimeSeriesRegressor
from sklearn.model_selection import train_test_split
import pandas as pd
# 创建示例数据
X = np.random.randn(100, 1, 50) # 100个样本,1个变量,50个时间点
y = np.random.randn(100)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练回归模型
regressor = KNeighborsTimeSeriesRegressor(n_neighbors=5, distance="dtw")
regressor.fit(X_train, y_train)
# 预测和评估
predictions = regressor.predict(X_test)
score = regressor.score(X_test, y_test)
print(f"回归R²分数: {score:.4f}")
聚类用于发现时间序列数据中的隐藏模式和分组,使用TimeSeriesKMeans进行聚类分析,支持多种时间序列距离度量。
py
from aeon.clustering import TimeSeriesKMeans
# 创建时间序列数据
X = np.random.randn(50, 1, 100) # 50个时间序列
# K-means聚类
kmeans = TimeSeriesKMeans(n_clusters=3, metric="euclidean", n_init=10)
cluster_labels = kmeans.fit_predict(X)
print(f"聚类标签: {cluster_labels}")
print(f"各簇样本数: {np.bincount(cluster_labels)}")
# 获取聚类中心
centers = kmeans.cluster_centers_
print(f"聚类中心形状: {centers.shape}")
Aeon集成多种深度学习模型,提供端到端的时间序列分类能力。使用ResNet分类器,采用残差连接架构,能够学习复杂的时间模式。深度学习方法在大规模数据集上通常优于传统方法,但需要更长的训练时间。通过调整网络深度和训练轮数,可以在准确率和计算成本间找到平衡。
py
from aeon.classification.deep_learning import ResNetClassifier
# 使用ResNet深度学习分类器
resnet = ResNetClassifier(n_epochs=100, batch_size=16, verbose=False)
resnet.fit(X_train, y_train)
# 预测和评估
y_pred = resnet.predict(X_test)
accuracy = (y_pred == y_test).mean()
print(f"ResNet准确率: {accuracy:.4f}")
# 获取预测概率
proba = resnet.predict_proba(X_test)
print(f"预测概率形状: {proba.shape}")
Aeon提供多种特征提取变换器,可以将原始序列转换为特征向量。使用Catch22变换器提取22个统计特征,捕捉序列的统计属性、自相关性等信息。
py
from aeon.transformations.collection.feature_based import Catch22
# 特征提取变换器
catch22 = Catch22()
X_features = catch22.fit_transform(X_train)
print(f"原始数据形状: {X_train.shape}")
print(f"提取特征形状: {X_features.shape}")
# 使用提取的特征训练传统分类器
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_features, y_train)
# 对测试集提取特征并预测
X_test_features = catch22.transform(X_test)
rf_accuracy = rf.score(X_test_features, y_test)
print(f"基于特征的分类准确率: {rf_accuracy:.4f}")
集成多个模型通常能获得更好的性能和鲁棒性。HIVE-COTE,时间序列分类领域的顶尖算法之一,集成多种特征表示和分类器。虽然训练时间较长,但在准确率要求高的应用中,HIVE-COTE能够提供业界领先的性能。
py
from aeon.classification.hybrid import HIVECOTEV2
# 使用HIVE-COTE集成分类器
hivecote = HIVECOTEV2(
time_limit_in_minutes=5, # 限制训练时间
n_jobs=1
)
hivecote.fit(X_train, y_train)
# 预测和评估
hive_accuracy = hivecote.score(X_test, y_test)
print(f"HIVE-COTE准确率: {hive_accuracy:.4f}")
# 查看集成中各组件的权重
print("集成组件信息:")
for name, weight in zip(hivecote.estimator_names_, hivecote.weights_):
print(f"{name}: {weight:.4f}")
SpeedML
开源(GitHub,211 Star,31 Fork)Python库,整合pandas、numpy、sklearn、xgboost等常用库,提供一套简洁统一的API,旨在高效完成从数据探索到模型评估的全流程。
实战
安装:pip install speedml
示例:
py
from speedml import Speedml
# 初始化项目(以Titanic数据集为例)
sml = Speedml(
'train.csv',
'test.csv',
target='Survived',
uid='PassengerId'
)
print(f"训练集形状: {sml.train.shape}")
print(f"测试集形状: {sml.test.shape}")
print("训练集前3行:")
print(sml.train.head(3))
print("\n数据统计描述:")
sml.train.describe()
print("\n缺失值情况:")
sml.train.isnull().sum()
# 绘制特征相关性热图
sml.plot.correlate()
# 绘制数值特征分布
sml.plot.distribute()
# 分类特征与目标变量的关系
sml.plot.ordinal('Pclass')
sml.plot.crosstab('Survived', 'Sex')
print("可视化图表已生成")
print("- 相关性矩阵: 识别特征间线性关系")
print("- 分布图: 检查数据偏态和异常值")
print("- 交叉表: 分析分类特征与目标变量的关联")
解读:
- 初始化时会自动加载训练集和测试集,并指定目标变量和唯一标识符
- 调用
sml.eda()方法,自动生成包含10-15条关键洞察的报告,快速理解数据特征 - 内置多种可视化方法,可快速生成相关性热图、分布图等,助力数据洞察
优势:
- 相比Pandas Profiling等纯EDA工具,Speedml覆盖从数据加载到模型评估的完整流程;
- 相比Scikit-learn,API更简洁、编码量减少70%。
不足:
- 灵活性不如原生库,复杂定制场景受限。
建议在竞赛快速原型、教学演示或标准化流程中优先使用,对于深度定制项目,可将其作为辅助工具。