数据小白之路-task4

数据来源于天池赛题:零基础入门数据分析-学术前沿趋势分析

目录

一、原理介绍
二、代码实现

  • 2.1数据预处理
  • 2.2使用TF-IDF提取特征
  • 2.3建立分类模型

三、结果解释

一、原理介绍

TF-IDF方法常用来评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。在一个特定文件中,当某类词语出现的频率较高,同时该类词语在整个语料库中出现频率较低时,该类词语的TF-IDF就会比较高。

TF-IDF在中文中指词频-逆向文件频率,由TF(词频)和IDF(逆向文件频率)两个部分组成。

其中,TF(词频)指的是某一个给定的词语在该文件中出现的次数,TF的计算公式为:

T F w = 在 某 一 类 中 词 条 w 出 现 的 次 数 该 类 中 所 有 的 词 条 数 目 T F w = 在 某 一 类 中 词 条 w 出 现 的 次 数 该 类 中 所 有 的 词 条 数 目 TFw = 在 某 一 类 中 词 条 w 出 现 的 次 数 该 类 中 所 有 的 词 条 数 目 TF_{w}=\frac{在某一类中词条w出现的次数}{该类中所有的词条数目} TFw=wTFw=w

IDF(逆向文件频率)的主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。TDF的计算公式为:

I D F = l o g ( 语 料 库 的 文 档 总 数 包 含 词 条 w 的 文 档 数 + 1 ) IDF=log\left ( \frac{语料库的文档总数}{包含词条w的文档数+1}\right ) IDF=log(w+1)

公式中分母之所以要加1,是为了避免分母为0

这里通过对计算机领域论文的标题和摘要进行文本特征提取,并根据这些文本特征来训练多分类模型,以此来识别不同类型的论文。

二、代码实现

# 导入所需的package
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 #画图工具
import warnings
warnings.filterwarnings("ignore") #过滤掉警告的意思
from pyforest import *
#定义读取文本数据的函数
#定义读取文本数据的函数
def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi',
       'report-no', 'categories', 'license', 'abstract', 'versions',
       'update_date', 'authors_parsed'], count=None):
    '''
    定义读取文件的函数
        path: 文件路径
        columns: 需要选择的列
        count: 读取行数
    '''
    
    data  = []
    with open(path, 'r') as f: 
        for idx, line in enumerate(f): 
            if idx == count:
                break
                
            d = json.loads(line)
            d = {col : d[col] for col in columns}
            data.append(d)

    data = pd.DataFrame(data)
    return data

data = readArxivFile(r'C:\Users\sunny\Documents\Tencent Files\243285484\FileRecv\arxiv-metadata-oai-snapshot\arxiv-metadata-oai-snapshot.json', 
                     ['id', 'title', 'categories', 'abstract'],
                    200000)
#查看数据前五行
data.head()

在这里插入图片描述

2.1 数据预处理

#将数据中的'title'列与'abstract'列进行合并,便于后续分类模型的训练
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['categories'] = data['categories'].apply(lambda x : x.split(' '))

# 单个类别,不包含子分类
data['categories_big'] = data['categories'].apply(lambda x : [xx.split('.')[0] for xx in x])
#对数据进行类别编码
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
data_label = mlb.fit_transform(data['categories_big'].iloc[:])
data_label

在这里插入图片描述

【注】类别编码也就是将标签(机器学习术语)向量化,例如,一个学科可以分为十三大门类:[哲学,经济学,法学,教育学,文学,历史学,理学,工学,农学,医学,军事学,管理学,艺术学],我们可以将其种类向量化为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,这样就可以将种类数字化,便于数据的分析处理。
data_label.shape

在这里插入图片描述

2.2 使用TF-IDF提取特征

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_features=4000) #提取特征,限定特征提取数量不超过4000个
vectorizer

在这里插入图片描述

data_tfidf = vectorizer.fit_transform(data['text'].iloc[:])

2.3 建立分类模型

# 划分训练集和验证集
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)
clf

在这里插入图片描述

#评估模型拟合效果,输出分类模型报告
from sklearn.metrics import classification_report
print(classification_report(y_test, clf.predict(x_test)))

在这里插入图片描述

三、结果解释

在上面文本分类模型的评估结果中,precision表示查准率,recall表示查全率,f1-score表示F1值,support表示准确分类的论文数量。从评估结果可以看出,在模型训练的33个类别中,不同类别上的准确率差异很大。平均而言,准确率有百分之七十多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值