本文汇总几个Python生态下的NLP库。fastText论文官网FaceBook开源GitHub26.5K Star4.8K Fork、HTML、C、JavaScript等语言开发的NLP项目值得深入学习虽然项目已于24年3月19日归档。特性文本分类最快几分钟搞定LSTM可能要训练几个小时数据量很小也能通过字符级n-gram捕捉词形信息解决生僻词问题多语言支持157种词向量训练处理生僻词词由子词构成垃圾邮件过滤情感分析意图识别关键词扩展局限性不是万能钥匙对于需要理解长距离依赖、复杂语义的任务比如机器翻译、文本生成fastText不如BERT、GPT这些大模型。特征相对简单主要基于词袋和n-gram对词序和深层语义建模有限。需要文本预处理 中文需要先分词英文最好做小写化等处理。内存使用虽然模型小但加载大量词向量时内存占用不小。实战安装pip install fasttext示例importfasttextwithopen(train.txt,w)asf:f.write(__label__sports 梅西梅开二度 巴萨取胜\n)f.write(__label__tech 苹果发布新iPhone 搭载A15芯片\n)f.write(__label__entertainment 新电影上映 票房破纪录\n)modelfasttext.train_supervised(inputtrain.txt,epoch25,# 训练轮数lr1.0,# 学习率wordNgrams2# 考虑2-gram特征)labels,probabilitiesmodel.predict(湖人队夺得总冠军)print(labels)# [__label__sports]print(probabilities)# [0.95] 置信度很高# 模型只有几MBmodel.save_model(news_classifier.bin)modelfasttext.train_unsupervised(wiki.txt,# 纯文本一行一句话modelcbow,# 或者skipgramdim300# 300维向量)# 获取词向量vectormodel.get_word_vector(人工智能)# 找相似词model.get_nearest_neighbors(机器学习,k5)# 输出: [(深度学习, 0.89), (人工智能, 0.85), ...]modelfasttext.train_supervised(spam_data.txt)# 准确率90%以上每秒能处理几千封邮件实时过滤is_spammodel.predict(免费领取 iPhone 13)[0][0]# __label__spamsentimentmodel.predict(商品质量很好物流很快)# [__label__positive]intentmodel.predict(明天北京的天气怎么样)# [__label__weather_query]similarmodel.get_nearest_neighbors(编程,k10)# [代码, 开发, 软件, 计算机, ...]SentencePieceGoogle开源GitHub11.7K Star1.3K Fork忘掉“词”这个概念直接从数据中学习最优的“片段”。把文本当作原始的字符序列然后用一种称为BPE字节对编码或Unigram的算法从海量文本中统计出哪些字符组合经常出现这些组合就成“片段”。这些片段可能是一个字、一个词甚至是一个词的一部分一切由数据决定。实战安装pip install sentencepiece示例importsentencepieceasspm# 训练分词模型spm.SentencePieceTrainer.train(inputinput.txt,model_prefixmy_model,vocab_size5000)# 加载模型spspm.SentencePieceProcessor(model_filemy_model.model)text自然语言处理有点意思tokenssp.encode_as_pieces(text)# 反向解码回文本originalsp.decode_pieces(tokens)给片段加上▁符号来表示空格或词的开头。优势语言无关支持中文、日文、英文甚至混合文本。不需要为每种语言找不同的分词工具处理“未知”很优雅遇到没见过的词时传统分词器可能直接报错或乱拆。但SentencePiece会把它拆成已知的片段组合。比如训练时没见过“ChatGPT”但它认识“Chat”和“GPT”就能合理处理控制词典大小可自由设定想要多少个“词”在词典里子词级别的优势对AI模型来说“深度”、“学习”、“深度学习”如果是三个独立的词模型可能学不到它们的关系。但如果“深度学习”能被拆成“深度”“学习”模型就能建立这种组合关系。局限性需要足够的数据来训练通常至少几万句子训练需要一些计算资源虽然比训练模型小得多对于某些需要严格保持词语边界的任务如实体识别可能需要调整使用方式TextBlob官方文档开源GitHub9.5K Star1.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示例fromtextblobimportTextBlobfromcollectionsimportCounter essayTextBlob(Data science is multi-disciplinary. Science drives data science. Data enables science.)wordsessay.words word_freqCounter(words.lower()forwordinwordsiflen(word)2)print(出现次数大于1的关键词:)forword,countinword_freq.items():ifcount1: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()方法可将单词还原为词根形式。这些功能在文本规范化、信息检索、文本匹配等任务中非常重要可帮助统一不同形式的同一单词。fromtextblobimportTextBlob textTextBlob(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), ...]positiveTextBlob(This product is amazing! I love it.)print(正面情感:,positive.sentiment)# 输出: Sentiment(polarity0.625, subjectivity0.9)# 情感极性、主观性negativeTextBlob(This is terrible. I hate it.)print(负面情感:,negative.sentiment)# 输出: Sentiment(polarity-0.8, subjectivity0.9)# 中性文本neutralTextBlob(The sky is blue.)print(中性情感:,neutral.sentiment)# 输出: Sentiment(polarity0.0, subjectivity0.0)textTextBlob(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]# 语言检测textTextBlob(Bonjour, comment allez-vous?)print(检测语言:,text.detect_language())# 输出: fr (法语)translatedtext.translate(toen)chineseTextBlob(Hello, how are you?)print(中文翻译:,chinese.translate(tozh-CN))# 拼写错误的文本textTextBlob(I havv goood speling!)print(原文:,text)print(纠正后:,text.correct())# 单词级别的纠正fromtextblobimportWord wordWord(speling)print(单词纠正:,word.correct())# 输出: spelling# 单复数转换wordWord(octopus)print(复数形式:,word.pluralize())# 输出: octopiwordWord(children)print(单数形式:,word.singularize())# 输出: child# 词形还原wordWord(running)print(词根形式:,word.lemmatize(v))# v表示动词# 输出: run总结相比NLTK和spaCyTextBlob上手极快、API直观。但功能基础不适合处理海量文本。适合新手入门或快速验证想法。aeon从sktime库分离出来的开源GitHub1.4K Star261 Fork专业时间序列机器学习工具包专注于提供高性能的算法实现和统一的API接口。官方文档。整合深度学习、传统机器学习和统计方法支持单变量和多变量时间序列处理。更注重计算效率和算法的现代化实现提供大量经过优化的分类器、回归器和变换器适用于预测、分类、聚类等多种任务。特性丰富的算法库包含数十种时间序列分类、回归和聚类算法深度学习集成提供CNN、ResNet、LSTM等现代深度学习模型高性能实现算法经过优化执行速度显著快于传统实现统一API设计遵循scikit-learn风格学习成本低数据变换工具支持特征提取、数据增强、降维等预处理操作基准数据集内置多个标准时间序列数据集便于算法评估实战安装pip install aeon时间序列分类是识别序列所属类别的任务如动作识别、设备状态判断等。使用Aeon的经典分类器ROCKET通过随机卷积核提取特征后用Ridge分类器预测。ROCKET在多个基准数据集上表现优异且速度快适合快速建立分类基线模型。fromaeon.classification.convolution_basedimportRocketClassifierfromaeon.datasetsimportload_arrow_headimportnumpyasnp X_train,y_trainload_arrow_head(splittrain)X_test,y_testload_arrow_head(splittest)# 训练ROCKET分类器classifierRocketClassifier(num_kernels10000)classifier.fit(X_train,y_train)# 预测和评估accuracyclassifier.score(X_test,y_test)print(f分类准确率:{accuracy:.4f})回归任务用于预测连续数值如销量预测、温度估计等。使用基于距离的时间序列回归器KNeighborsTimeSeriesRegressor通过计算时间序列间的DTW动态时间规整距离找到最近邻样本进行预测。fromaeon.regression.distance_basedimportKNeighborsTimeSeriesRegressorfromsklearn.model_selectionimporttrain_test_splitimportpandasaspd# 创建示例数据Xnp.random.randn(100,1,50)# 100个样本1个变量50个时间点ynp.random.randn(100)X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2)# 训练回归模型regressorKNeighborsTimeSeriesRegressor(n_neighbors5,distancedtw)regressor.fit(X_train,y_train)# 预测和评估predictionsregressor.predict(X_test)scoreregressor.score(X_test,y_test)print(f回归R²分数:{score:.4f})聚类用于发现时间序列数据中的隐藏模式和分组使用TimeSeriesKMeans进行聚类分析支持多种时间序列距离度量。fromaeon.clusteringimportTimeSeriesKMeans# 创建时间序列数据Xnp.random.randn(50,1,100)# 50个时间序列# K-means聚类kmeansTimeSeriesKMeans(n_clusters3,metriceuclidean,n_init10)cluster_labelskmeans.fit_predict(X)print(f聚类标签:{cluster_labels})print(f各簇样本数:{np.bincount(cluster_labels)})# 获取聚类中心centerskmeans.cluster_centers_print(f聚类中心形状:{centers.shape})Aeon集成多种深度学习模型提供端到端的时间序列分类能力。使用ResNet分类器采用残差连接架构能够学习复杂的时间模式。深度学习方法在大规模数据集上通常优于传统方法但需要更长的训练时间。通过调整网络深度和训练轮数可以在准确率和计算成本间找到平衡。fromaeon.classification.deep_learningimportResNetClassifier# 使用ResNet深度学习分类器resnetResNetClassifier(n_epochs100,batch_size16,verboseFalse)resnet.fit(X_train,y_train)# 预测和评估y_predresnet.predict(X_test)accuracy(y_predy_test).mean()print(fResNet准确率:{accuracy:.4f})# 获取预测概率probaresnet.predict_proba(X_test)print(f预测概率形状:{proba.shape})Aeon提供多种特征提取变换器可以将原始序列转换为特征向量。使用Catch22变换器提取22个统计特征捕捉序列的统计属性、自相关性等信息。fromaeon.transformations.collection.feature_basedimportCatch22# 特征提取变换器catch22Catch22()X_featurescatch22.fit_transform(X_train)print(f原始数据形状:{X_train.shape})print(f提取特征形状:{X_features.shape})# 使用提取的特征训练传统分类器fromsklearn.ensembleimportRandomForestClassifier rfRandomForestClassifier(n_estimators100)rf.fit(X_features,y_train)# 对测试集提取特征并预测X_test_featurescatch22.transform(X_test)rf_accuracyrf.score(X_test_features,y_test)print(f基于特征的分类准确率:{rf_accuracy:.4f})集成多个模型通常能获得更好的性能和鲁棒性。HIVE-COTE时间序列分类领域的顶尖算法之一集成多种特征表示和分类器。虽然训练时间较长但在准确率要求高的应用中HIVE-COTE能够提供业界领先的性能。fromaeon.classification.hybridimportHIVECOTEV2# 使用HIVE-COTE集成分类器hivecoteHIVECOTEV2(time_limit_in_minutes5,# 限制训练时间n_jobs1)hivecote.fit(X_train,y_train)# 预测和评估hive_accuracyhivecote.score(X_test,y_test)print(fHIVE-COTE准确率:{hive_accuracy:.4f})# 查看集成中各组件的权重print(集成组件信息:)forname,weightinzip(hivecote.estimator_names_,hivecote.weights_):print(f{name}:{weight:.4f})SpeedML开源GitHub211 Star31 ForkPython库整合pandas、numpy、sklearn、xgboost等常用库提供一套简洁统一的API旨在高效完成从数据探索到模型评估的全流程。实战安装pip install speedml示例fromspeedmlimportSpeedml# 初始化项目以Titanic数据集为例smlSpeedml(train.csv,test.csv,targetSurvived,uidPassengerId)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-learnAPI更简洁、编码量减少70%。不足灵活性不如原生库复杂定制场景受限。建议在竞赛快速原型、教学演示或标准化流程中优先使用对于深度定制项目可将其作为辅助工具。