使用fastText构建学科分类工具

项目地址:https://github.com/AMinerOpen/prediction_api本文介绍了一个基于fastText框架的开源学科分类工具的原理和使用方法。fastText介绍fastText是Facebook Research开源的文本分类和词训练工具[1],具有快速、轻量的特点。在模型结构上,fastText使用 cbow[^2]架构,由输入层,隐藏层,输出层三层构成,结构如图所示。

为了提供词的顺序特征信息,fastText在统计语言模型上使用了n-gram模型^3,基于马尔科夫假设认为每个词的出现只与前面的$n$个词有关,即: $$ p(S) = \prod p(wi|w{i-1} \cdots w_{i-n+1}) $$ fastText使用了分层分类器,将不同的分类器整合到一个树形结构中,使用基于Huffman编码的层次softmax[^4]技巧,大幅减少了模型预测目标的数量,提高了计算速度。模型的训练fastText是一个轻量级框架,训练速度快,易于使用,这里只需要短短的几行代码即可构建模型。class FTModel:pat = re.compile(r'[\u4e00-\u9fff]+')def __init__(self, corpora_path = None, model_path = None):self.corpora_path = corpora_pathself.model_path = model_pathdef train(self):self.model = train_supervised(self.corpora_path, epoch=25)该工具基于国家自然科学基金申请代码进行学科分类,因此使用的训练数据均为中文论文标题和对应的学科标签。为此在使用模型的时候,我们需要使用中文分词工具来进行分词,这里我们选用jieba分词def predict(self, text, topn=1):words = []for cli in FTModel.pat.findall(text):words += jieba.lcut(cli)return self.model.predict(' '.join(words), k=topn)这样我们就可以训练并使用模型了经过测试,模型的准确率如下表所示:leveltop1top510.50790.833120.36290.666830.33420.6317工具的使用该项目包含两个分类工具,一个是基于NSFC的三级学科分类器 classifier.py,另一个是专门针对AI学科的分类器 aiclassifier.py,下面介绍一下工具的使用环境的配置创建虚拟环境由于自行安装编译fastText比较麻烦,所以推荐使用 anaconda完成运行环境的配置,首先创建一个虚拟环境conda create -n your_env_name对于windows用户,使用如下命令激活虚拟环境activate your_env_namelinux用户:source activate your_env_name安装依赖包该项目目前有如下依赖fasttextscikit-learnjiebarequests对于windows用户,使用以下命令安装依赖包:conda install -c mbednarski fasttextconda install -c anaconda scikit-learnconda install -c conda-forge jiebaconda install -c conda-forge requests但注意 mbednarski是私人打包的为windows和linux用户提供的anaconda源,对于osx用户,可以使用官方源:conda install -c conda-forge fasttextconda install -c anaconda scikit-learnconda install -c conda-forge jiebaconda install -c conda-forge requests至此完成了依赖包的安装三级学科分类Classifier类包含 classify方法,接受一个包含论文标题的列表,返回一个字典,包含三级学科分类(字段level1~3)的代码、中文学科名以及对应的概率以标题Annotating gene sets by mining large literature collections with protein networks为例说明如何使用这个工具。nsfc = Classifier() # 声明一个分类器对象pub_titles = ['Annotating gene sets by mining large literature collections with protein networks.'] # 论文标题列表,中英文均可subject = nsfc.classify(pub_titles) # 分类得到了如下输出{'level1': [{'code': 'F03', 'name': '自动化', 'p': 0.5681461691856384},{'code': 'B06', 'name': '化学工程及工业化学', 'p': 0.06985147297382355},{'code': 'E04', 'name': '冶金与矿业', 'p': 0.05790099501609802},{'code': 'F02', 'name': '计算机科学', 'p': 0.04791523516178131},{'code': 'C13', 'name': '农学基础与作物学', 'p': 0.04653266444802284}],'level2': [{'code': 'A0114', 'name': '应用数学方法', 'p': 0.5198239684104919},{'code': 'C1301', 'name': '农学基础', 'p': 0.2457106113433838},{'code': 'C0505', 'name': '系统生物学', 'p': 0.03674702346324921},{'code': 'F0302', 'name': '系统科学与系统工程', 'p': 0.034390855580568314},{'code': 'C1004', 'name': '生物电子学', 'p': 0.0336870439350605}],'level3': [{'code': 'A011403', 'name': '生物数学', 'p': 0.9948329925537109},{'code': 'A011405', 'name': '分形论及应用', 'p': 0.005175579339265823},{'code': 'F030204', 'name': '系统生物学中的复杂性分析与建模', 'p':1.471634732e-05},{'code': 'F030114', 'name': '自适应与学习控制', 'p': 1.187794805446174e-05},{'code': 'A011004', 'name': '极限理论', 'p': 1.175022862298647e-05}]}AI学科分类AIClassifier类的使用与 Classifier类相近,不过该类的 classify方法返回的字典还提供了一个学科树,以 children属性表示子树,下面是例子:ai_nsfc = AIClassifier()words = ['search engine']subject = ai_nsfc.classify(words)print(subject)得到了如下输出:{'level1': [{'p': 1.0, 'name': 'Artificial Intelligence', 'name_zh': '人工智能'}],'level2': [{'p': 0.6236383458601308, 'name': 'Natural Language Processing', 'name_zh': '自然语言处理'},{'p': 0.3763616541398693, 'name': 'Knowledge Representation And Processing', 'name_zh': '知识表示与处理'}],'level3': [{'p': 0.6106190412551927, 'name': 'Text Retrieval, Mining And Information Extraction', 'name_zh': '文本检索、挖掘与信息抽取'},{'p': 0.3893809587448072, 'name': 'Knowledge Discovery And Data Mining', 'name_zh': '知识发现与数据挖掘'}],'tree': [{'name': '人工智能', 'value': 1.0, 'children': [{'name': '自然语言处理', 'value': 0.6236383458601308, 'children': [{'name': '文本检索、挖掘与信息抽取', 'value': 0.6106190412551927}]},{'name': '知识表示与处理', 'value': 0.3763616541398693, 'children': [{'name': '知识发现与数据挖掘', 'value': 0.3893809587448072}]}]}]}以上便是这个学科分类工具的技术以及使用的介绍,大家快来试一试吧。Reference[^1]: https://github.com/facebookresearch/fastText/[^2]: Efficient Estimation of Word Representations in Vector Space, Tomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean https://arxiv.org/pdf/1301.3781.pdf[^3]: http://web.stanford.edu/~jurafsky/slp3/3.pdf[^4]: Frederic Morin and Yoshua Bengio. Hierarchical probabilistic neural network language model. In Proceedings of the international workshop on artificial intelligence and statistics, pages 246–252, 2005.AI Time:论道AI安全与伦理时间:5月31日15:00-17:00地点:清华科技园1911主题餐厅欢迎各位前来参加!出席嘉宾:清华大学人工智能研究院院长张钹中国人民大学高瓴人工智能学院院长文继荣搜狐网产品技术总监 杨田主持人:清华大学副教授刘知远搜狐集团招聘负责人付卓艳赶快戳下方小程序进入报名通道!合作媒体:学术头条 搜狐学术头条已建立微信交流群,想进群的同学请加学术君微信:AMiner308,记得备注:名字+单位/学校噢!

(0)

相关推荐