spaCy实战论文分类【NLP】

简介: spaCy是一个流行、易用的Python自然语言处理包。spaCy具有相当高的处理精度,而且处理速度极快。不过,由于spaCy还是一个相对比较新的NLP开发包,因此它还没有像NLTK那样被广泛采用,而且目前也没有太多的教程。

spaCy是一个流行、易用的Python自然语言处理包。spaCy具有相当高的处理精度,而且处理速度极快。不过,由于spaCy还是一个相对比较新的NLP开发包,因此它还没有像NLTK那样被广泛采用,而且目前也没有太多的教程。在本文中,我们将展示如何使用spaCy来实现文本分类,并在结尾提供完整的实现代码。

1、数据准备

对于年轻的研究者而言,寻找并筛选出合适的学术会议来投稿,是一件相当耗时耗力的事情。首先下载会议处理数据集,我们接下来将按照会议来分类论文。

2、浏览数据

先快速看一下数据:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import base64
import string
import re
from collections import Counter
from nltk.corpus import stopwords
stopwords = stopwords.words('english')df = pd.read_csv('research_paper.csv')
df.head()

结果如下:

在这里插入图片描述

可以用下面的代码确认数据集中没有丢失的值:

df.isnull().sum()

结果如下:

Title 0
Conference 0
dtype: int64

现在我们把数据拆分为训练集和测试集:

from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.33, random_state=42)print('Research title sample:', train['Title'].iloc[0])
print('Conference of this paper:', train['Conference'].iloc[0])
print('Training Data Shape:', train.shape)
print('Testing Data Shape:', test.shape)

运行结果如下:

Research title sample: Cooperating with Smartness: Using Heterogeneous Smart Antennas in Ad-Hoc Networks.
Conference of this paper: INFOCOM
Training Data Shape: (1679, 2)
Testing Data Shape: (828, 2)

数据集包含了2507个论文标题,已经按会议分为5类。下面的图表概述了论文在不同会议中的分布情况:

在这里插入图片描述

下面的代码是使用spaCy进行文本预处理的一种方法,之后我们将尝试找出在前两个类型会议(INFOCOM &ISCAS)的论文中用的最多的单词:

import spacynlp = spacy.load('en_core_web_sm')
punctuations = string.punctuationdef cleanup_text(docs, logging=False):
    texts = []
    counter = 1
    for doc in docs:
        if counter % 1000 == 0 and logging:
            print("Processed %d out of %d documents." % (counter, len(docs)))
        counter += 1
        doc = nlp(doc, disable=['parser', 'ner'])
        tokens = [tok.lemma_.lower().strip() for tok in doc if tok.lemma_ != '-PRON-']
        tokens = [tok for tok in tokens if tok not in stopwords and tok not in punctuations]
        tokens = ' '.join(tokens)
        texts.append(tokens)
    return pd.Series(texts)INFO_text = [text for text in train[train['Conference'] == 'INFOCOM']['Title']]IS_text = [text for text in train[train['Conference'] == 'ISCAS']['Title']]INFO_clean = cleanup_text(INFO_text)
    
INFO_clean = ' '.join(INFO_clean).split()IS_clean = cleanup_text(IS_text)
IS_clean = ' '.join(IS_clean).split()INFO_counts = Counter(INFO_clean)
IS_counts = Counter(IS_clean)INFO_common_words = [word[0] for word in INFO_counts.most_common(20)]
INFO_common_counts = [word[1] for word in INFO_counts.most_common(20)]fig = plt.figure(figsize=(18,6))
sns.barplot(x=INFO_common_words, y=INFO_common_counts)
plt.title('Most Common Words used in the research papers for conference INFOCOM')
plt.show()

INFORCOM的运行结果如下:

在这里插入图片描述

接下来计算ISCAS:

IS_common_words = [word[0] for word in IS_counts.most_common(20)]
IS_common_counts = [word[1] for word in IS_counts.most_common(20)]fig = plt.figure(figsize=(18,6))
sns.barplot(x=IS_common_words, y=IS_common_counts)
plt.title('Most Common Words used in the research papers for conference ISCAS')
plt.show()

运行结果如下:

在这里插入图片描述

在INFOCOM中的顶级词是“networks”和“network”,显然这是因为INFOCOM是网络领域的会议。
ISCAS的顶级词是“base”和“design”,这揭示出ISCAS是关于数据库、系统设计等课题的会议。

3、用spaCy进行机器学习

首先我们载入spacy模型并创建语言处理对象:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.base import TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS
from sklearn.metrics import accuracy_score
from nltk.corpus import stopwords
import string
import re
import spacy
spacy.load('en')
from spacy.lang.en import English
parser = English()

下面是另一种用spaCy清理文本的方法:

STOPLIST = set(stopwords.words('english') + list(ENGLISH_STOP_WORDS))
SYMBOLS = " ".join(string.punctuation).split(" ") + ["-", "...", "”", "”"]class CleanTextTransformer(TransformerMixin):   def transform(self, X, **transform_params):
        return [cleanText(text) for text in X]   def fit(self, X, y=None, **fit_params):
        return selfdef get_params(self, deep=True):
        return {}
    
def cleanText(text):
    text = text.strip().replace("\n", " ").replace("\r", " ")
    text = text.lower()
    return textdef tokenizeText(sample):
    tokens = parser(sample)
    lemmas = []
    for tok in tokens:
        lemmas.append(tok.lemma_.lower().strip() if tok.lemma_ != "-PRON-" else tok.lower_)
    tokens = lemmas
    tokens = [tok for tok in tokens if tok not in STOPLIST]
    tokens = [tok for tok in tokens if tok not in SYMBOLS]
    return tokens

下面我们定义一个函数来显示出最重要的特征,具有最高的相关系数的特征:

def printNMostInformative(vectorizer, clf, N):
    feature_names = vectorizer.get_feature_names()
    coefs_with_fns = sorted(zip(clf.coef_[0], feature_names))
    topClass1 = coefs_with_fns[:N]
    topClass2 = coefs_with_fns[:-(N + 1):-1]
    print("Class 1 best: ")
    for feat in topClass1:
        print(feat)
    print("Class 2 best: ")
    for feat in topClass2:
        print(feat)vectorizer = CountVectorizer(tokenizer=tokenizeText, ngram_range=(1,1))
clf = LinearSVC()

pipe = Pipeline([('cleanText', CleanTextTransformer()), ('vectorizer', vectorizer), ('clf', clf)])# data
train1 = train['Title'].tolist()
labelsTrain1 = train['Conference'].tolist()test1 = test['Title'].tolist()
labelsTest1 = test['Conference'].tolist()
# train
pipe.fit(train1, labelsTrain1)# test
preds = pipe.predict(test1)
print("accuracy:", accuracy_score(labelsTest1, preds))
print("Top 10 features used to predict: ")

printNMostInformative(vectorizer, clf, 10)
pipe = Pipeline([('cleanText', CleanTextTransformer()), ('vectorizer', vectorizer)])
transform = pipe.fit_transform(train1, labelsTrain1)vocab = vectorizer.get_feature_names()
for i in range(len(train1)):
    s = ""
    indexIntoVocab = transform.indices[transform.indptr[i]:transform.indptr[i+1]]
    numOccurences = transform.data[transform.indptr[i]:transform.indptr[i+1]]
    for idx, num in zip(indexIntoVocab, numOccurences):
        s += str((vocab[idx], num))

运行结果如下:

accuracy: 0.7463768115942029
Top 10 features used to predict:
Class 1 best:
(-0.9286024231429632, ‘database’)
(-0.8479561292796286, ‘chip’)
(-0.7675978546440636, ‘wimax’)
(-0.6933516302055982, ‘object’)
(-0.6728543084136545, ‘functional’)
(-0.6625144315722268, ‘multihop’)
(-0.6410217867606485, ‘amplifier’)
(-0.6396374843938725, ‘chaotic’)
(-0.6175855765947755, ‘receiver’)
(-0.6016682542232492, ‘web’)
Class 2 best:
(1.1835964521070819, ‘speccast’)
(1.0752051052570133, ‘manets’)
(0.9490176624004726, ‘gossip’)
(0.8468395015456092, ‘node’)
(0.8433107444740003, ‘packet’)
(0.8370516260734557, ‘schedule’)
(0.8344139814680707, ‘multicast’)
(0.8332232077559836, ‘queue’)
(0.8255429594734555, ‘qos’)
(0.8182435133796081, ‘location’)

接下来计算精度、召回、F1分值:

from sklearn import metrics
print(metrics.classification_report(labelsTest1, preds, target_names=df['Conference'].unique()))

运行结果如下;

                 precision    recall  f1-score   support
                                    

       VLDB       0.75      0.77      0.76       159
      ISCAS       0.90      0.84      0.87       299
   SIGGRAPH       0.67      0.66      0.66       106
    INFOCOM       0.62      0.69      0.65       139
        WWW       0.62      0.62      0.62       125

avg / total       0.75      0.75      0.75       828

好了,我们已经用spaCy完成了对论文的分类,完整源码下载: GITHUB


原文链接:Spacy实现文本分类 - 汇智网

目录
相关文章
|
9月前
|
机器学习/深度学习 人工智能 编解码
NLP领域再创佳绩!阿里云机器学习平台 PAI 多篇论文入选 ACL 2023
阿里云机器学习平台PAI主导的多篇论文在ACL 2023 Industry Track上入选。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
NLP还能做什么?北航、ETH、港科大、中科院等多机构联合发布百页论文,系统阐述后ChatGPT技术链(1)
NLP还能做什么?北航、ETH、港科大、中科院等多机构联合发布百页论文,系统阐述后ChatGPT技术链
101 0
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
NLP还能做什么?北航、ETH、港科大、中科院等多机构联合发布百页论文,系统阐述后ChatGPT技术链(2)
NLP还能做什么?北航、ETH、港科大、中科院等多机构联合发布百页论文,系统阐述后ChatGPT技术链
|
10月前
|
机器学习/深度学习 自然语言处理
【论文解读】Self-Explaining Structures Improve NLP Models
浙大联合北大出了篇比较有意思的文章,从模型解释的角度设计了一个称为Self-Explaining的网络模型,该网络模型可以直接加在任何预训练模型之上,来提高模型的性能和准确率。现在让我们来看看这篇文章吧。
154 0
|
10月前
|
自然语言处理 数据挖掘
【论文解读】Do Prompts Solve NLP Tasks Using Natural Language?
提示学习实现文本分类的各类方法对比的论文
72 0
|
11月前
|
机器学习/深度学习 自然语言处理 数据可视化
泛化神器 | 李沐老师新作进一步提升模型在多域多的泛化性,CV和NLP均有大幅度提升(文末获取论文)
泛化神器 | 李沐老师新作进一步提升模型在多域多的泛化性,CV和NLP均有大幅度提升(文末获取论文)
167 0
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
沈向洋带你读论文|NLP系列重磅更新
沈向洋带你读论文|NLP系列重磅更新
266 0
|
机器学习/深度学习 自然语言处理 Oracle
Paper之ACL&EMNLP:2009年~2019年ACL计算语言学协会年会&EMNLP自然语言处理的经验方法会议历年最佳论文简介及其解读
Paper之ACL&EMNLP:2009年~2019年ACL计算语言学协会年会&EMNLP自然语言处理的经验方法会议历年最佳论文简介及其解读
Paper之ACL&EMNLP:2009年~2019年ACL计算语言学协会年会&EMNLP自然语言处理的经验方法会议历年最佳论文简介及其解读
|
机器学习/深度学习 自然语言处理 测试技术
给Bert加速吧!NLP中的知识蒸馏论文 Distilled BiLSTM解读
给Bert加速吧!NLP中的知识蒸馏论文 Distilled BiLSTM解读
365 0
|
机器学习/深度学习 自然语言处理 知识图谱
ICLR2021对比学习(Contrastive Learning)NLP领域论文进展梳理(二)
ICLR2021对比学习(Contrastive Learning)NLP领域论文进展梳理(二)
300 0
ICLR2021对比学习(Contrastive Learning)NLP领域论文进展梳理(二)