学术前沿趋势分析4:论文种类分类

1. 任务说明

学习主题:论文分类(数据建模任务),利用已有数据建模,对新论文进行类别分类;

学习内容:使用论文标题完成类别分类

学习成果:学会文本分类的基本方法、TF-IDF等

2. 分析思路

第一步:处理数据
arxiv论文中对应类别是由作者填写的。因此,论文种类与论文题目和摘要有着直接关系,可利用题目和摘要对论文进行分类。

第二步:分类
思路1. 直接使用TF-IDF对文本提取特征,使用分类器进行分类,分类器的选择上可以使用SVM、LR、XGboost等。

思路2. 利用Facebook提供的FastText(入门词向量),快速构建分类器。

思路3. 使用WordVec(进阶词向量),通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRnn或者BiLSTM。

思路4. Bert词向量,Bert是高配款的词向量,具有强大的建模学习能力。

3. 代码部分

data  = [] #初始化
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open(r"F:\dataset\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>2000:
            break
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析

data.head()

学术前沿趋势分析4:论文种类分类_第1张图片

data['text']=data['title']+data['abstract']
data['text'][0]

data['text']=data['text'].apply(lambda x:x.replace('\n',''))#replace的基本结构是:df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
data['text'][0]

data['text']=data['text'].apply(lambda x:x.lower())
# 描述:将字符串中的所有大写字母转换为小写字母。
# 语法:str.lower()  -> str  返回字符串
data['text'][0]

data=data.drop(['abstract','title'],axis=1)

data.head()

学术前沿趋势分析4:论文种类分类_第2张图片

# 多个类别,包含子分类
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

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_features=4000)
data_tfidf = vectorizer.fit_transform(data['text'].iloc[:])

# 划分训练集和验证集
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.metrics import classification_report
print(classification_report(y_test, clf.predict(x_test)))

学术前沿趋势分析4:论文种类分类_第3张图片

你可能感兴趣的:(Datawhale,python,机器学习)