Python常用NLP:fastText、SentencePiece、TextBlob、Aeon、SpeedML

本文汇总几个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)

给片段加上符号来表示空格或词的开头。

优势:

  1. 语言无关:支持中文、日文、英文,甚至混合文本。不需要为每种语言找不同的分词工具
  2. 处理"未知"很优雅:遇到没见过的词时,传统分词器可能直接报错或乱拆。但SentencePiece会把它拆成已知的片段组合。比如训练时没见过"ChatGPT",但它认识"Chat"和"GPT",就能合理处理
  3. 控制词典大小:可自由设定想要多少个"词"在词典里
  4. 子词级别的优势:对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%。

不足:

  • 灵活性不如原生库,复杂定制场景受限。

建议在竞赛快速原型、教学演示或标准化流程中优先使用,对于深度定制项目,可将其作为辅助工具。

相关推荐
放下华子我只抽RuiKe54 小时前
数据炼金术:机器学习背后的“脏活”与特征工程
人工智能·深度学习·elasticsearch·机器学习·搜索引擎·自然语言处理·数据挖掘
AI专业测评16 小时前
2026年AI写作软件底层逻辑横评:长篇网文如何破局“上下文遗忘”与“AI消痕”?
人工智能·自然语言处理·ai写作
2501_9333295518 小时前
舆情监测系统的技术演进:从数据采集到AI中台,Infoseek如何实现“监测+处置”一体化
开发语言·人工智能·自然语言处理·系统架构
小龙报20 小时前
【AI】高效交互的艺术:AI提示工程与大模型对话指南
人工智能·深度学习·神经网络·自然语言处理·chatgpt·交互·语音识别
赋创小助手21 小时前
AMD OpenClaw:本地 AI Agent 运行平台解析,RyzenClaw 与 RadeonClaw 两种架构方案意味着什么?
服务器·人工智能·深度学习·自然语言处理·架构·数据挖掘·openclaw
V搜xhliang02461 天前
自然语言理解与语音识别(ASR)
大数据·人工智能·机器学习·自然语言处理·机器人·语音识别·xcode
2301_764441331 天前
ProjectAIRI:是一个开源的AI虚拟数字人伴侣
人工智能·目标检测·自然语言处理·开源·视觉检测·语音识别
Mr.Cheng.1 天前
【InternVL2-2B】MLLM内部架构学习笔记
笔记·学习·自然语言处理
&Darker1 天前
十四、大语言模型RAG
人工智能·语言模型·自然语言处理