/OpenTextClassification

OpenTextClassification is all you need for text classification! Open text classification for everyone, enjoy your NLP journey! 这可能是目前为止最全面的开源文本分类项目,支持中英双语、多种模型、多种任务。

Primary LanguagePython

中文 | English

OpenTextClassification

Logo

Open text classification for you, Start your NLP journey

GitHub Contributors Issues Issues GitHub pull requests GitHub stars
开源实现 / 简单 / 全面 / 实践
文章解读 · 视频解读

功能免费,代码开源,大家放心使用,欢迎贡献!

最新讯息

  • 2023/03/23:OpenTextClassification V0.0.1版正式开源,版本特性:
    • 支持中英双语的文本分类
    • 支持多种文本分类模型:传统机器学习浅层模型、深度学习模型和transformers类模型
    • 支持多标签文本分类
    • 支持多种embedding方式:inner/outer/random

OpenNLP计划

我们是谁?

我们是羡鱼智能【xianyu.ai】,主要成员是一群来自老和山下、西湖边上的咸鱼们,塘主叫作羡鱼,想在LLMs时代做点有意义的事!我们的口号是:做OpenNLP和OpenX!希望在CloseAI卷死我们之前退出江湖!

也许有一天,等到GPT-X发布的时候,有人会说NLP不存在了,但是我们想证明有人曾经来过、热爱过!在以ChatGPT/GPT4为代表的LLMs时代,在被CloseAI卷死之前,我们发起了OpenNLP计划,宗旨是OpenNLP for everyone!

  • 【P0】OpenTextClassification:打造一流的文本分类项目,已开源
    • 综述:done
    • 开源项目:done
    • papers解读:doing
    • 炼丹术:doing
  • 【P0】OpenSE:句嵌入,自然语言处理的核心问题之一,doing
  • 【P0】OpenChat:筹备中,贫穷使人绝望,无卡使人悲伤
  • 【P1】OpenLLMs:大语言模型,doing
  • 【P2】OpenTextTagger:文本标注,分词、NER、词性标注等
  • OpenX:任重而道远

OpenTextClassification项目

OpenTextClassification项目为OpenNLP计划的第一个正式的开源项目,旨在Open NLP for everyone!在以ChatGPT/GPT4为代表的LLMs时代,在被OpenAI卷死之前,做一点有意义的事情!未来有一天,等到GPT-X发布的时候,或许有人会说NLP不存在了,但是我们想证明有人曾来过!

开发计划

本项目的开发宗旨,打造全网最全面和最实用的文本分类项目和教程。如果有机会,未来希望可以做成开箱即用的文本分类工具,文本分类任务非常特殊,大部分情况下被认为是简单且基础的,然而却很难找到比较通用的文本分类工具,往往都是针对具体任务进行训练和部署。在NLP逐渐趋于大一统的今天,这一点非常不优雅,而且浪费资源。:*Open text classification for you, Start your NLP journey!*

简要的开发计划

  1. 【P3】支持中英双语的文本分类:100%,也欢迎支持其他语种
  2. 【P0】支持多种文本分类模型:基本完成,欢迎补充
    1. 浅层文本分类模型:done
    2. 【P1】DNN类模型:已支持常见模型
    3. 【P0】transformer类模型:Bert/ERNIE等
    4. 【P0】prompt learning for Text Classification:TODO
    5. 【P0】ChatGPT for Text Classification:TODO
  3. 【P1】支持多标签文本分类:
    1. 多种多标签分类loss:done,如有遗漏,欢迎补充
    2. 复杂的多标签分类:比如层次化等,TODO
  4. 【P0】支持不同的文本分类数据集/任务:文本分类任务又多又散,这是好事儿也是坏事儿。欢迎基于本项目报告各种数据集上的效果
  5. 【P4】支持简明易用的文本分类API:终极目标为实现一个足够通用和强大的文本分类模型,并实现自然语言交互的文本分类接口text_cls(text, candidate_labels)->label,给定文本和候选类别(有默认值),输出文本所属的类别;同时支持可无成本或尽可能小的成本向特定领域泛化

加入我们

OpenNLP计划的其他内容尚在筹备中,暂时只开源了本项目。欢迎大家积极参与OpenTextClassification的建设和讨论,一起变得更强!

加入方式:

  • 项目建设:可以在前面列出的开发计划中选择自己感兴趣的部分进行开发,建议优先选择高优先级的任务,比如添加更多的模型和数据结果。
  • 微信交流群:知识在讨论中发展,待定
  • 技术分享和讨论:输出倒逼输入,欢迎投稿,稿件会同步到本项目的docs目录和知乎专栏OpenNLP. 同时也欢迎大家积极的参与本项目的讨论https://github.com/catqaq/OpenTextClassification/discussions。

使用步骤

1.克隆本项目

git clone https://github.com/catqaq/OpenTextClassification.git

2.数据集下载和预处理

请自行下载数据集,将其放到data目录下,数据统一处理成text+label格式,以\t或逗号分隔。有空我再来补一个自动化脚本,暂时请自行处理或者参考preprocessing.py。

最好将数据统一放到data目录下,比如data/dbpedia,然后分3个子目录,input存放原始数据集(你下载的数据集),data存放预处理后的格式化的数据集(text-label格式),saved_dict存放训练结果(模型和日志等)。

3.运行示例

经过测试的开发环境如下,仅供参考,差不多的环境应该都可以运行。

  • python:3.6/3.7
  • torch:1.6.0
  • transformers:4.18.0
  • torchtext:0.7.0
  • scikit-learn: 0.24.2
  • tensorboardX:2.6
  • nltk:3.6.7
  • numpy:1.18.5
  • pandas:1.1.5

根据自己的需要选择模块运行,详见下一节。

python run.py

运行示例

1.运行DNN/transformers类模型做文本分类

python run.py

2.运行传统浅层机器学习模型做文本分类

python run_shallow.py

3.运行DNN/transformers类模型做多标签文本分类

python run_multi_label.py

下表是直接运行demo的参考结果:

运行环境:python3.6 + T4

demo 数据集 示例模型 Acc 耗时 备注
run.py THUCNews/cn TextCNN 89.94% ~2mins
run_multi_label.py rcv1/en bert 61.04% ~40mins 其他指标见运行结果
run_shallow.py THUCNews/cn NB 89.44% 105.34 ms

结果展示:持续更新中

笔者提供了从浅到深再到多标签的详细实验结果,可供大家参考。但受限于时间和算力,很多实验可能未达到最优,望知悉!因此,非常欢迎大家积极贡献,补充相关实验、代码和新的模型等等,一起建设OpenTextClassification。

暂时只提供部分汇总的结果,详细的实验结果及参数等我有空再补,比较多,需要一些时间整理。

1.传统浅层文本分类模型

Data Model tokenizer 最小词长 Min_df ngram binary Use_idf Test acc 备注
THUCNews/cn LR lcut 1 2 (1,1) False True 90.61% C=1.0, max_iter=1000 词表61549; train score: 94.22% valid score: 89.84% test score: 90.61% training time: 175070.97 ms
MultinomialNB(alpha=0.3) lcut 1 2 (1,1) False True 89.86% 词表61549; training time: 94.18ms
ComplementNB(alpha=0.8) lcut 1 2 (1,1) False True 89.88% 词表61549; training time: 98.31ms
SVC(C=1.0) lcut 1 2 (1,1) False True 81.49% 词表61549; 维度200 training time: 7351155.59 ms train score: 85.95% valid score: 80.07% test score: 81.49%
DT lcut 1 2 (1,1) False True 71.19% max_depth=None training time: 149216.53 ms train score: 99.97% valid score: 70.57% test score: 71.19%
xgboost lcut 1 2 (1,1) False True 90.08% XGBClassifier(n_estimators=2000,eta=0.3,gamma=0.1,max_depth=6,subsample=1,colsample_bytree=0.8, nthread=10) training time: 1551260.28 ms train score: 99.00% valid score: 89.34% test score: 90.08%
KNN lcut 1 2 (1,1) False True 85.17% k=10 training time: 21.24 ms train score: 89.05% valid score: 84.53% test score: 85.17%
dbpedia/en LR None 2 2 (1,1) False True 98.26% C=1.0, max_iter=100 词表237777 training time: 220177.59 ms train score: 98.85% valid score: 98.19% test score: 98.26%
MultinomialNB(alpha=1.0) None 2 2 (1,1) False True 95.35% training time: 786.24 ms train score: 96.36% valid score: 95.34% test score: 95.35%
ComplementNB(alpha=1.0) None 2 2 (1,1) False True 93.73% training time: 805.69 ms train score: 95.30% valid score: 93.79% test score: 93.73%
SVC(C=1.0) None 2 2 (1,1) False True 94.67% 维度200; max_iter=100 training time: 144163.81 ms train score: 94.75% valid score: 94.59% test score: 94.67% 注意:SVM的计算和存储成本正比于样本数的平方;
DT None 2 2 (1,1) False True 92.41% max_depth=100, min_samples_leaf=5 training time: 639744.56 ms train score: 95.79% valid score: 92.43% test score: 92.41%
xgboost None 2 2 (1,1) False True 97.99% XGBClassifier(n_estimators=200,eta=0.3,gamma=0.1,max_depth=6,subsample=1,colsample_bytree=0.8, nthread=10,reg_alpha=0,reg_lambda=1) training time: 1838434.42 ms train score: 99.35% valid score: 97.96% test score: 97.99%
KNN None 2 2 (1,1) False True 80.05% k=10 training time: 137.72 ms train score: 84.66% valid score: 80.20% test score: 80.05%

2.深度学习文本分类模型

Data Model Embed Bz Lr epochs acc 备注
THUCNews/cn TextCNN outer 128 1e-3 3/20 90.45%
TextRNN - - 1e-3 5/10 90.38%
TextRNN_Att 1e-3 2/10 90.55%
TextRCNN 1e-3 3/10 91.01%
DPCNN 1e-3 3/20 90.12%
FastText 1e-3 5/20 90.48%
bert inner 5e-5 2/3 94.10% bert-base-chinese
ERNIE inner 5e-5 3/3 94.58% ernie-3.0-base-zh
bert_CNN - 3/3 94.14%
bert_RNN - 3/3 93.92%
bert_RNN - 3/3 94.45%
bert_RCNN - 3/3 94.32%
bert_DPCNN - 3/3 94.17%
dbpedia/en TextCNN outer 128 5e-5 9/20 98.35% glove
TextRNN - - - 6/10 97.97%
TextRNN_Att - 4/10 97.80%
TextRCNN - 3/10 97.71%
DPCNN - 3/20 97.86%
FastText - 10/20 97.84%
bert inner 5e-5 2/3 97.78% bert-base-uncased
ERNIE 2/10 97.75% ernie-2.0-base-en
bert_CNN - 2/3 97.91%
bert_RNN - 2/3 97.87%
bert_RCNN - 2/3 98.04%
bert_DPCNN - 2/3 97.95%
gpt 3/3 97.03
gpt2 3/3 97.00
T5 3/3 96.57

3.多标签文本分类

Data Model 分层 样本数 Embed loss Bz Lr epochs Test acc (绝对匹配率) Micro-F1 Macro-F1 备注
Rcv1/en TextCNN - all outer multi_label_circle_loss 128 1e-3 9/20 51.02% 0.7904 0.4515 eval_activate = None cls_threshold = 0
TextRNN - - - 13/20 54.00% 0.7950 0.4358
TextRNN_Att - 11/20 53.97% 0.8011 0.4538
TextRCNN - 10/20 53.62% 0.8111 0.4900
DPCNN - 10/20 51.66% 0.7890 0.4111
FastText - 12/20 51.31% 0.7936 0.4728
bert all inner - 128 2e-5 20/20 61.04% 0.8454 0.5729 bert-base-cased
ERNIE all inner - 128 2e-5 20/20 61.67% 0.8486 0.5861 ernie-2.0-base-en
Bert_CNN all inner - 128 2e-5 12/20 58.31% 0.8364 0.5736 同bert配置
Bert_RNN all inner - 128 2e-5 17/20 60.48% 0.8371 0.5640
Bert_RCNN all inner - 128 2e-5 15/20 60.54% 0.8457 0.5969
Bert_DPCNN all inner - 128 2e-5 13/20 56.52% 0.8082 0.4273

常见报错

参考资料&致谢

A Survey on Text Classification: From Shallow to Deep Learning:https://arxiv.org/pdf/2008.00364.pdf?utm_source=summari

Deep Learning--based Text Classification: A Comprehensive Review:https://arxiv.org/pdf/2004.03705.pdf

https://github.com/649453932/Chinese-Text-Classification-Pytorch

https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch

https://github.com/facebookresearch/fastText

https://github.com/brightmart/text_classification

https://github.com/kk7nc/Text_Classification

https://github.com/Tencent/NeuralNLP-NeuralClassifier

https://github.com/vandit15/Class-balanced-loss-pytorch

https://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics

赞助我们

我们是谁?

我们是羡鱼智能【xianyu.ai】,主要成员是一群来自老和山下、西湖边上的咸鱼们,塘主叫作羡鱼,想在LLMs做点有意义的事!我们的口号是:做OpenNLP和OpenX!希望在OpenAI卷死我们之前退出江湖!

OpenTextClassification项目为羡鱼智能【xianyu.ai】发起的OpenNLP计划的第一个正式的开源项目,旨在Open NLP for everyone!在以ChatGPT/GPT4为代表的LLMs时代,在被OpenAI卷死之前,做一点有意义的事情!未来有一天,等到GPT-X发布的时候,或许有人会说NLP不存在了,但是我们想证明有人曾来过!

本项目第一版由本羡鱼利用业务时间(熬夜)独立完成,受限于精力和算力,拖延至今,好在顺利完成了。如果大家觉得本项目对你的NLP学习/研究/工作有所帮助的话,求一个免费的star! 富哥富姐们可以考虑赞助一下!尤其是算力,租卡的费用已经让本不富裕的鱼塘快要无鱼可摸了

image-20230324010955205

Starchart

Star History Chart

Contributors