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 = 1for doc in docs:if counter % 1000 == 0 and logging:print("Processed %d out of %d documents." % (counter, len(docs)))counter += 1doc = 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 = lemmastokens = [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   supportVLDB       0.75      0.77      0.76       159ISCAS       0.90      0.84      0.87       299SIGGRAPH       0.67      0.66      0.66       106INFOCOM       0.62      0.69      0.65       139WWW       0.62      0.62      0.62       125avg / total       0.75      0.75      0.75       828

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


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

spaCy文本分类教程相关推荐

  1. 基于Kaggle数据的词袋模型文本分类教程

     基于Kaggle数据的词袋模型文本分类教程 发表于23小时前| 454次阅读| 来源FastML| 0 条评论| 作者Zygmunt Z 词袋模型文本分类word2vecn-gram机器学习 w ...

  2. 自然语言处理(二)基于CNN的新闻文本分类

    自然语言处理(二) 1.Task1 数据集探索 1.1下载数据集 1.2数据集的描述 1.3 数据的预处理 1.4 CNN卷积神经网络 1.5 训练与验证 2.IMDB 2.1下载 IMDB 数据集 ...

  3. 【可解释性机器学习】解释基于Scikit-learn进行文本分类的pipeline及结果

    使用Scikit-learn进行文本分类pipeline 1. 基线模型 2. 基线模型,改进的数据 3. Pipeline改进 4. 基于字符的pipeline 5. 调试HashingVector ...

  4. 【NLP傻瓜式教程】手把手带你RCNN文本分类(附代码)

    继续之前的文本分类系列 [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) [NLP傻瓜式教程]手把手带你fastText文本分类(附代码) ...

  5. 【NLP傻瓜式教程】手把手带你HAN文本分类(附代码)

    继续之前的文本分类系列 [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) [NLP傻瓜式教程]手把手带你fastText文本分类(附代码) ...

  6. 【NLP傻瓜式教程】手把手带你fastText文本分类(附代码)

    写在前面 已经发布: [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) 继续NLP傻瓜式教程系列,今天的教程是基于FAIR的Bag of ...

  7. 【NLP傻瓜式教程】手把手带你RNN文本分类(附代码)

    文章来源于NewBeeNLP,作者kaiyuan 写在前面 这是NLP傻瓜式教程的第二篇----基于RNN的文本分类实现(Text RNN) 参考的的论文是来自2016年复旦大学IJCAI上的发表的关 ...

  8. 【NLP保姆级教程】手把手带你RNN文本分类(附代码)

    写在前面 这是NLP保姆级教程的第二篇----基于RNN的文本分类实现(Text RNN) 参考的的论文是来自2016年复旦大学IJCAI上的发表的关于循环神经网络在多任务文本分类上的应用:Recur ...

  9. NLP之文本分类实战入门超详细教程

    目录 前言 一.数据加载 1.加载包 2.读取数据 二.文本处理 1.去除无用字符 2.文本分词 3.去除停用词 4.去除低频词 5.划分训练集和测试集 三.把文本转换成向量的形式 1.把文本转换成t ...

最新文章

  1. 【论文速读】基于图像的伪激光雷达三维目标检测
  2. QEMU — VirtIO 的网络实现
  3. Create Digital Engagement on Multiple Channels
  4. SAP系统安装技术要求
  5. 实战 MDT 2012(六)---基于MAC地址的部署
  6. LeetCode 1721. 交换链表中的节点(快慢指针)
  7. android studio的 jar导入问题 ‘Android Studio Failed to Create MD5 hash for file’
  8. 3 设置网格数的大小_流体仿真中,六面体(Hex)网格的求解效率真的比四面体(Tet)高”很多”么?...
  9. ibatis调用mysql函数
  10. stringWithUTF8String return null (返回null)的解决办法
  11. python线性拟合numpypolyfit_python – 具有适配参数的numpy.polyfit
  12. 【问题记录】mysql设置任意ip访问
  13. NPS - 数字化营销 - 净推荐值
  14. c语言测试单句代码运行时间,c语言测试代码的运行时间
  15. win10如何查看服务器日志文件,win10日志文件在哪里?小编教你查看win10日志文件的方法...
  16. word论文页码排版
  17. Python 开发个人微信号在运维开发中的使用
  18. 如何将多个mp3文件合并成一个?
  19. NLP标签/关键词-提取工具-java开发
  20. 高中生参加的计算机奥赛是,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华

热门文章

  1. php实例-微信第三方登录
  2. 高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
  3. 201671010457 朱石景 实验四《英文文本词频统计分析》 结对项目报告
  4. guacamole开发者文档——数据库认证
  5. win10 添加打印机
  6. CAD三维图形转化成二维图形的过程具体的步骤
  7. 阿里云安全送您六道平安符,恭贺新春! 1
  8. Python中文社区征稿,最高1000元/篇!
  9. 鸿蒙 电视盒子,目前最强的电视盒子:性价比最高的5款电视盒子
  10. 数字电路实验(四)——寄存器、计数器及RAM