0
点赞
收藏
分享

微信扫一扫

基于Python的深度神经网络的中文期刊分类系统

gy2006_sw 2022-01-13 阅读 167

选题意义

  • 期刊论文本数量增长迅速,人工分类耗费精力

  • 某个实验表明,相同的人在不同时间段对同一批文献分类;不同的人对同一批文献分类,得到的结果发现相差较大,是因为人的主观性和知识结构的变迁会影响分类结果。机器分类不会存在此问题。

项目目标

  • 建立合理的 CNKI 数据集
    样本地址
  • 对中图法分类的 22 个大类,178 个二级类分类,实现正确区分

reference

对于中文期刊分类这一特定应用场景,往往采用以下方案。

  • 采用向量空间模型(VSM),用一个向量表示一个文本。《机器学习在中文期刊分类应用》,文章 D=(k1,k2,k3,k4,k5……kn),这是一个多维的向量,如果维数很多,将来计算起来很麻烦,则需要降维。VSM 是一种古老的方法,得到文本向量后送到 LR/SVM/NN 中即可。文章的数据集选的不是很科学,只选了 8×4000(8 个大类,每大类 4000 篇作为数据集)。
  • 采用 n-gram 向量代表文本向量,得到文本向量后用 kmeans 聚类。如《一种基于 N-Gram 技术的中文文献自动分类方法》,数据库采用台湾中文儿童读物。

模型

  • 在算法层面没有创新,因为简单的说,这是一个组合模型:把 word embedding 训练出的词向量按一定方式合成文本向量后扔给 SVM 等分类器就行了。当然写毕业论文时,在后期完全可以在应用逻辑层面加以改进。就这么简单。
  • 但是,Convolutional Neural Networks for Sentence Classification 这篇论文提出了一种新策略:卷积网络训练深层分类器。我想尝试一下,是将 word embedding 的 vectors 像图片一样堆砌成矩阵,用 patches 对这样的“像素”多层卷积。而且有作者 demo 在 theano 平台下运行。这是在 tensorflow 平台下训练的 Convolutional Neural Network for Text Classification in Tensorflow,这是 tensorflow cnn word 代码的作者笔记,正在试,不过训练比较慢
  • 目前的目标是实现几种分类器在同一数据集下的测评(期刊一级/二级分类正确率)。

整体方案及进展

CNKI 数据集

按照中国图书馆分类法文献可分为 5 个基本部类,22 个大类,176 个二级类,若干个三级类。本项目采集数据方法,拟使用对检索的“按图书分类”检索爬取二级类的数据(标题,关键词,摘要),如输入“A1”检索的到马克思主义相关文献。每个类的检索控制为 1000 篇。

这里存在几个问题,有待探讨。

  • 有的小类爬光了所有论文,总共不到 60 篇,如 A1,这种情况适当考虑合并 A 类所有论文,为一类,即把 A0/A1/A2/A3/A4/A5/A6/A7/A8 合并为单独一类 A 类进行分类。出于这样考虑的物理行为是,文献常年投稿少,没有必要让机器做深入分类。
  • 光是按照上述检索方法并不能得到很好的数据,因为中图法的分类系统里存在 TN/TP/TJ 等这样的类别。当输入 J7 检索时,爬虫难以识别所检索到的文章到底是 TJ7 还是 J7,于是出现了下图的情况。
  • 在这里,J7 是舞蹈类文献,可是 CNKI 检索系统却出现了导弹类文献(TJ7),这个问题导致之前爬出的数据几乎全部作废。解决办法是,原爬虫的 url 为 http://epub.cnki.net/kns/brief/default_result.aspx (正常检索)换为 http://epub.cnki.net/kns/brief/result.aspx (高级检索),由于 HTML 结构也变了,爬虫的相关参数也需要调整。使用高级检索可以避免上述灾难性问题。
  • 爬虫稳定性不够好,偶尔会丢失摘要,导致文本数据库不全,当然作为程序训练暂时无妨。正在修改代码,增强其稳定性。(今天发现,很多论文发表时并没有写摘要,甚至有的没有关键词。160309)
  • 搜索时只筛选期刊作为数据。因为会议论文一般过于专业,有专业人士分类,常常无需机器分类;而硕士博士论文的摘要动辄八百一千字,果断抛弃。
  • 最终我们得到的是:22 个大类的文件夹,每个大类里存放相应小类的 CSV 文件,每个 CSV 文件里保存 1000 行文本数据。

raw data -> practicable data

  • 对与每一篇文献的标题/关键词/摘要,需要剔除无用的信息,如标点符号,数字,英文,非 utf-8 字符等,需要使用正则表达式进行基本数据清洗。
  • 虽然只提取了标题/关键词/摘要,文本量仍然很大,且不适合向量表示。需要进行关键词提取,这里采用最常用的 tf-idf 算法。tf-idf 算法是一种统计方法,一个词在文本的重要程度由两个参数决定,tf(term frequency)和 idf(inverse document frequency),前者代表一个词在文本中出现的次数多少,后者表示这个词普适度如何(如“我”,“你”,“可以”,这样的词出现再多也没用,赋给它很高的 idf 值)。最后用 tf/idf 表示最终的重要程度。对于每一篇论文来说,取排前 10 的关键词即可理解全文大意,总而言之,用 10 个词的词向量代表一篇论文。
  • 经过上述两个步骤,即可为每篇文章得到 10 个关键词,就用他们来训练最终的分类器。

训练词向量

  • 现在面临的一个关键问题是如何用向量合理表示一个词(word embedding),@南大周志华翻译为“词嵌入”。学术界常用的模型为 bengio 的 NNLM 模型,构造的三层神经网络的目的是训练一个预言模型,计算句子完整表达的概率,副作用是获得了单个词的词向量。

  • 最下方的 wtn+1,…,wt2,wt1 代表前 n1 个词。现在的目的是根据这已知的 n1 个词预测下一个词 wt。C(w) 表示词 w 所对应的词向量,我们使用一套唯一的词向量,放置于矩阵 C(一个 |V|×m 的矩阵)中。其中 |V| 表示词表中词的总数,m 表示词向量的维度。w 到 C(w) 的转化就是从矩阵中取出一行。网络第一层(输入层)是将 C(wtn+1),…,C(wt2),C(wt1) 这 n1 个向量首尾相接拼起来,形成一个 (n1)m 维的向量。网络第二层(隐藏层)就如同普通的神经网络,直接使用偏置加权重表达神经元输出。在此之后,使用 tanh 作为激活函数。网络第三层(输出层)一共有 |V| 个节点,每个节点 表示 下一个词为 i 的未归一化 log 概率。最后使用 softmax 激活函数将输出值 y 归一化成概率。训练采用普通的前反馈 + 梯度下降的方法就能成功。
    Bengio 在 APNews 数据集上做的对比实验也表明他的模型效果比精心设计平滑算法的普通 n-gram 算法要好 10% 到 20%。
    这样的训练方式是用完整句子来训练,所以可以说它是无监督的

    • 当然我们项目里要用的,是这个语言模型的的副作用——词向量。Google 的 word2vec 使用的 CBOW 模型对 NNLM 进行了很多优化(如用树的编码表示单词),作为工具完全可以 work 了。
    • 对中文文献分类来说,需要一个类别广,知识面宽的语料库来训练词向量,这很难找。比如用搜狗新闻就难以将一些化学名词囊括,而论文里常常会出现这种稀有专业名词,人名日报则更不合理。如果用下载好的中文期刊作为语料库也不合适,主要原因是丰富度不够。我这里暂且使用中文维基百科(1.1G)作为词向量训练语料库。
    • 使用开源项目 gensim 的 word2vec 模块可以很方便的训练出词向量模型和词向量表示(150MB),这里不做展示。

训练分类器

训练方法有很多种,大抵是 LR/SVM/NN 等,这个作为 word2vec 的输出层,例如在最后一层加上 softmax 试试(这几天试试)。由于在爬取数据过程中产生了上述的问题(不稳定,检索模糊),很多数据正在重新收集,所以暂时无法实际操作。

160323 数据集基本收集完成,爬虫还是不够 robust,要命的是找不到原因,csdn 并没有反爬虫,不过宿舍的网已经打不开 http://www.cnki.net 了,隔壁的还能打开,图书馆的也能打开,不知怎么回事。

好在经过近两星期的断断续续爬虫,终于把 19 个类收集齐了(一共是 22 个类,其中 Z 类非投稿内容不采集,VU 两类还未采集好)。

举报

相关推荐

0 条评论