数据分析入门(学术前沿趋势分析)Task4-论文种类分类

Task3链接——数据分析入门(学术前沿趋势分析)Task3-论文代码统计

目录

Ⅰ、主要内容纲要

Ⅱ、数据处理思路

Ⅲ、代码实现

Ⅳ、参考资料


Ⅰ、主要内容纲要

  1. 主题:利用数据建模,对新论文进行分类
  2. 内容: 借助论文标题、摘要完成论文分类
  3. 数据集:arXiv

Ⅱ、数据处理思路

原始arxiv论文中论文有对应的类别,由作者填写,因此我们可以借助论文的标题和摘要完成分类,主要步骤如下:

  1. 对论文标题和摘要进行处理;
  2. 对论文类别进行处理;
  3. 构建文本分类模型;

文本分类的思路有多种,这里简单介绍几类:

  • 思路1:TF-IDF+机器学习

使用TF-IDF对文本提取特征,然后使用机器学习分类算法(如决策树、SVM、logistics回归等分类器)进行分类。

  • 思路2:分词+深度学习

通过分词器将文本转换为向量(矩阵),然后构建深度学习分类网络模型进行分类(可使用TextCNN、TextRnn等)。

  • 思路3:FastText

利用Facebook提供的FastText(入门款的词向量)工具,可以快速构建分类器。

Ⅲ、代码实现

首先进行预处理,包括数据的读取以及对数据的一些处理操作。

import seaborn as sns #用于画图
from bs4 import BeautifulSoup #用于爬取arxiv的数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图工具

# 数据读取
data  = [] #初始化
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open(r"D:/xyc/competPractice/dataAnalysis2101/archive/arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for idx, line in enumerate(f): 
        d = json.loads(line)
        d = {'title': d['title'], 'categories': d['categories'], 'abstract': d['abstract']}
        data.append(d)
        
        # 选择部分数据
        if idx > 200000:
            break
        
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析

# 拼接标题和摘要,一起完成分类
data['text'] = data['title'] + data['abstract']

data['text'] = data['text'].apply(lambda x: x.replace('\n',' '))
data['text'] = data['text'].apply(lambda x: x.lower())
data = data.drop(['abstract', 'title'], axis=1)
data

预处理1结果

不少论文可能有不止一个类别,因此要对每条数据的类别也进行处理:

# 一篇论文可能含有多个分类,进行进一步处理
# 多个类别,包含子分类(小类)
data['categories'] = data['categories'].apply(lambda x : x.split(' '))

# 单个类别,不包含子分类(大类)
data['categories_big'] = data['categories'].apply(lambda x : [xx.split('.')[0] for xx in x])
data

 预处理2结果

同时还要给类别进行编码,方便数据的处理:

# 对类别进行编码
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
data_label = mlb.fit_transform(data['categories_big'].iloc[:])  # 获取所有数据的大类,并对大类进行编码
data_label

 预处理3结果

【注】类别编码也就是将标签(机器学习术语)向量化,例如,一个学科可以分为十三大门类:[哲学,经济学,法学,教育学,文学,历史学,理学,工学,农学,医学,军事学,管理学,艺术学],我们可以将其种类向量化为subject=[0,0,0,0,0,0,0,0,0,0,0,0,0],对于计算机科学与技术这个专业,可以属于理学或工学,因此它可以用向量表示为subject[‘CS’]=[0,0,0,0,0,0,1,1,0,0,0,0,0],即将对应位置的编号改为1,这样就可以将种类数字化,便于数据的分析处理。

到这里预处理就基本结束了。接下来是进行分类训练,可以选择前述的任何一个思路进行设计。

思路1:TF-IDF+机器学习分类器

# 使用TFIDF提取特征,限制最多4000个单词
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_features=4000)
data_tfidf = vectorizer.fit_transform(data['text'].iloc[:])

# 使用sklearn的多标签分类进行封装
# 划分训练集和验证集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data_tfidf, data_label,
                                                 test_size = 0.2,random_state = 1)

# 构建多标签分类模型(朴素贝叶斯分类器)
from sklearn.multioutput import MultiOutputClassifier
from sklearn.naive_bayes import MultinomialNB
clf = MultiOutputClassifier(MultinomialNB()).fit(x_train, y_train)

## 构建多标签分类模型(支持向量机)
# from sklearn.multioutput import MultiOutputClassifier
# from sklearn import svm
# clfSVM = svm.SVC(gamma='scale').fit(x_train, y_train)

# 验证模型的精度
from sklearn.metrics import classification_report
print(classification_report(y_test, clf.predict(x_test)))

多重朴素贝叶斯分类器的精度检验结果如下(SVM、LR等同理):

precision    recall  f1-score   support

           0       0.95      0.85      0.90      7872
           1       0.85      0.78      0.81      7329
           2       0.77      0.72      0.74      2970
           3       0.00      0.00      0.00         2
           4       0.72      0.47      0.57      2149
           5       0.51      0.67      0.58       993
           6       0.89      0.35      0.50       538
           7       0.71      0.68      0.70      3657
           8       0.75      0.62      0.68      3382
           9       0.85      0.88      0.86     10809
          10       0.41      0.11      0.18      1796
          11       0.80      0.04      0.07       737
          12       0.44      0.33      0.38       540
          13       0.52      0.34      0.41      1070
          14       0.70      0.15      0.25      3435
          15       0.83      0.19      0.31       687
          16       0.88      0.18      0.30       249
          17       0.89      0.43      0.58      2565
          18       0.79      0.36      0.49       689

   micro avg       0.81      0.65      0.72     51469
   macro avg       0.70      0.43      0.49     51469
weighted avg       0.80      0.65      0.69     51469
 samples avg       0.72      0.72      0.70     51469

思路2:分词+深度学习

使用深度学习模型,单词进行词嵌入然后训练。

# 按照文本划分数据集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data['text'].iloc[:], data_label,
                                                 test_size = 0.2,random_state = 1)
#x_train.shape, x_test.shape, y_train.shape, y_test.shape # 查看数据集形状

# 对数据集处理进行编码并截断
# 参数设定
max_features= 500
max_len= 150
embed_size=100
batch_size = 128
epochs = 5

# 分词
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing import sequence

tokens = Tokenizer(num_words = max_features)
tokens.fit_on_texts(list(x_train)+list(x_test))

x_sub_train = tokens.texts_to_sequences(x_train)
x_sub_test = tokens.texts_to_sequences(x_test)

x_sub_train=sequence.pad_sequences(x_sub_train, maxlen=max_len)
x_sub_test=sequence.pad_sequences(x_sub_test, maxlen=max_len)
#x_sub_train.shape, x_sub_test.shape

 x_train, x_test, y_train, y_test的形状分别为:

(160001,) (40001,) (160001, 19) (40001, 19)

使用深度学习算法涉及到Keras库,参考资料链接: tensorflow官方文档_Module: tf.keras

搭建模型(LSTM网络)并训练:

# 定义模型并完成训练
# LSTM model
# Keras Layers:
from tensorflow.keras.layers import Dense,Input,LSTM,Bidirectional,Activation,Conv1D,GRU
from tensorflow.keras.layers import Dropout,Embedding,GlobalMaxPooling1D, MaxPooling1D, Add, Flatten
from tensorflow.keras.layers import GlobalAveragePooling1D, GlobalMaxPooling1D, concatenate, SpatialDropout1D# Keras Callback Functions:
from tensorflow.keras.callbacks import Callback
from tensorflow.keras.callbacks import EarlyStopping,ModelCheckpoint
from tensorflow.keras import initializers, regularizers, constraints, optimizers, layers, callbacks
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam

sequence_input = Input(shape=(max_len, ))
x = Embedding(max_features, embed_size,trainable = False)(sequence_input)
x = SpatialDropout1D(0.2)(x)
x = Bidirectional(GRU(128, return_sequences=True,dropout=0.1,recurrent_dropout=0.1))(x)
x = Conv1D(64, kernel_size = 3, padding = "valid", kernel_initializer = "glorot_uniform")(x)
avg_pool = GlobalAveragePooling1D()(x)
max_pool = GlobalMaxPooling1D()(x)
x = concatenate([avg_pool, max_pool]) 
preds = Dense(19, activation="sigmoid")(x)

model = Model(sequence_input, preds)
model.compile(loss='binary_crossentropy',optimizer=Adam(lr=1e-3),metrics=['accuracy'])
model.fit(x_sub_train, y_train, batch_size=batch_size, epochs=epochs)

模型训练结果

# 评估模型性能
model.evaluate(x_sub_test, y_test, batch_size=batch_size)

模型评估结果

LSTM(long short-trem memory,长短期记忆)网络是实际应用中最有效的序列模型——门控RNN(gated RNN)之一。可参考花书相关内容,相关网络资料链接:

如何简单的理解LSTM——其实没有那么复杂

Coursera:Deep Learning——Sequence Model

Task5链接——数据分析入门(学术前沿趋势分析)Task5-作者信息关联

Ⅳ、参考资料

Datawhale数据分析训练营学习手册(学术前沿趋势分析)——Task4:论文种类分类

sklearn 中文文档

scikit-learn Machine Learning in Python

使用 scikit-learn 实现多类别及多标签分类算法

TF-IDF(term frequency–inverse document frequency)_百度百科

sklearn-TfidfVectorizer彻底说清楚

tensorflow官方文档_Module: tf.keras

如何简单的理解LSTM——其实没有那么复杂

Coursera:Deep Learning——Sequence Model

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值