文本是极其丰富的信息源。人们每分钟都会发送数亿封新电子邮件和短信。确实有大量的文本数据等待挖掘见解。但是,想要从所有文本数据中收集含义的数据科学家面临着一个挑战:由于它以非结构化形式存在,因此难以分析和处理。

  在大数据分析Python中spaCy文本分类使用教程中,我们将研究如何使用有用的Python包spaCy(文档)将所有这些非结构化文本数据转换为对分析和自然语言处理更有用的内容。

  完成此操作后,我们将能够从文本数据中得出有意义的模式和主题。这在多种数据科学应用程序中很有用:垃圾邮件过滤,支持通知单,社交媒体分析,上下文广告,查看客户反馈等。

  具体来说,我们将对自然语言处理(NLP)进行更高层次的研究。然后,我们将完成一些重要的基本操作,以使用清理和分析文本数据spaCy。然后,我们将使用一些实际数据(亚马逊的Alexa智能家居扬声器的文本评论)深入研究文本分类,特别是Logistic回归分类。

  什么是自然语言处理?

  自然语言处理(NLP)是机器学习的一个分支,致力于处理,分析和有时生成人类语音(“自然语言”)。

  毫无疑问,在确定文本字符串的含义方面,人类仍然比机器好得多。但是在数据科学中,我们经常会遇到太大的数据集,以至于人们无法在合理的时间内对其进行分析。我们还可能遇到没有人可以分析和响应一段文本输入的情况。在这种情况下,我们可以使用自然语言处理技术来帮助机器对文本的含义有所了解(并在必要时做出相应的响应)。

  例如,自然语言处理在情感分析中被广泛使用,因为分析人员经常试图从大量文本数据中确定整体情感,这对于人类进行梳理是很费时的。它也用于广告匹配中-确定文本主体并自动分配相关广告。它用于聊天机器人,语音助手和其他需要机器理解并快速响应自然人类语言形式的输入的应用程序。

  分析和处理文本 spaCy

  spaCy是Python的开源自然语言处理库。它是专门为生产用途而设计的,它可以帮助我们构建可有效处理大量文本的应用程序。首先,让我们看一下spaCy可以处理的一些基本分析任务。

  正在安装 spaCy

  spaCy在继续进行操作之前,我们需要先安装它及其英语模型。我们可以使用以下命令行命令执行此操作:

  pip install spacy

  python -m spacy download en

  我们也可以spaCy在Juypter Notebook中使用。不过,它不是Jupyter默认包含的预安装库之一,因此我们需要从笔记本计算机运行这些命令以将其spaCy安装在正确的Anaconda目录中。请注意,我们!在每个命令前面都使用来让Jupyter笔记本知道应将其作为命令行命令读取。

  !pip install spacy

  !python -m spacy download en

  标记文本

  标记化是将文本分成多个部分的过程,称为标记,并忽略标点符号(,。'')和空格之类的字符。spaCy的令牌生成器以Unicode文本形式接受输入,并输出一系列令牌对象。

  让我们看一个简单的例子。假设我们有以下文本,并且我们希望对其进行标记化:

  我们可以采用几种不同的方法来解决这个问题。第一种称为单词标记化,即将文本分解成单个单词。对于许多语言处理应用程序而言,这是至关重要的一步,因为它们通常需要以单个单词而不是更长的字符串形式输入。

  在下面的代码中,我们将导入spaCy及其英语模型,并告诉我们将使用该模型进行自然语言处理。然后,我们将文本字符串分配给text。使用nlp(text),我们将处理该文本spaCy并将结果分配给名为的变量my_doc。

  至此,我们的文本已经被标记化了,但是spaCy将标记化的文本存储为文档,我们希望以列表形式查看它,因此我们将创建一个for循环遍历文档的循环,并为其添加每个单词标记在文本字符串中找到一个名为的列表,token_list以便我们可以更好地了解单词的标记方式。

  

python 文本分析归类 用python处理文本数据分类_字符串

 

  

python 文本分析归类 用python处理文本数据分类_自然语言处理_02

 

  如我们所见,spaCy生成一个包含每个标记作为单独项目的列表。请注意,它已经认识到诸如之类的收缩实际上不应代表两个不同的词,因此已将它们分解为两个不同的标记。

  首先,我们需要加载语言词典,在上面的示例中,我们使用English()类加载英语词典并创建nlp nlp对象。“ nlp”对象用于创建具有语言注释和各种nlp属性的文档。创建文档后,我们将创建令牌列表。

  如果需要,我们还可以将文本分为句子而不是单词。这称为句子标记化。在执行句子标记化时,标记化程序会查找介于句子之间的特定字符,例如句点,惊叹号和换行符。对于句子标记化,我们将使用预处理管道,因为使用的句子预处理spaCy包括标记器,标记器,解析器和实体识别器,我们需要访问它们才能正确识别什么是句子,什么不是。

  在下面的代码中,spaCy标记文本并创建一个Doc对象。这个Doc对象使用我们预处理管道的组件标记器,解析器和实体识别器将文本分解为组件。从该管道中,我们可以提取任何组件,但是在这里,我们将使用该sentencizer组件访问句子标记。

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_03

 

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_04

 

  同样,spaCy已将文本正确解析为所需的格式,这一次输出了在源文本中找到的句子列表。

  清理文本数据:删除停用词

  我们使用的大多数文本数据将包含许多实际上对我们没有用的单词。这些称为停用词的词在人类语音中很有用,但对数据分析没有多大帮助。删除停用词可以帮助我们消除文本数据中的杂音和干扰,还可以加快分析时间(因为要处理的词更少)。

  让我们看看spaCy默认情况下包含的停用词。我们将spaCy其英语模型中的停用词导入并分配给名为的变量,spacy_stopwords以便我们进行查看。

  

python 文本分析归类 用python处理文本数据分类_数据_05

 

  如我们所见,spaCy的默认停用词列表包括312个条目,每个条目都是一个单词。我们还可以看到为什么其中许多单词对数据分析没有用处。例如,尽管如此,过渡词对于理解句子的基本含义并不是必需的。而诸如“ 某人”之类的词太含糊,以至于无法用于NLP任务。

  如果需要,我们还可以创建自己的自定义停用词列表。但是出于我们在大数据分析Python中spaCy文本分类使用教程中的目的,spaCy提供的默认列表会很好。

  从我们的数据中删除停用词

  现在我们有了停用词列表,让我们使用它从上一部分中正在研究的文本字符串中删除停用词。我们的文本已经存储在变量中text,因此我们不需要再次定义它。

  相反,我们将创建一个名为的空列表filtered_sent,然后遍历doc变量以查看源文本中每个标记化的单词。spaCy包括一堆有用的标记属性,我们将使用其中的一个is_stop来识别不在停用词列表中的单词,然后将它们附加到filtered_sent列表中。

  

python 文本分析归类 用python处理文本数据分类_数据_06

 

  不难理解为什么停用词会有所帮助。删除它们将我们的原始文本简化为仅几个单词,这使我们对句子正在讨论的内容有了一个很好的了解:学习数据科学,并在此过程中避免挑战和挫折。

  词汇规范化

  词典标准化是文本数据清除过程中的又一步。总体而言,归一化将高维特征转换为适合任何机器学习模型的低维特征。出于这里的目的,我们只考虑lemmatization,即一种处理单词以使其根源减少的方法。

  合法化

  合法化是一种处理以下事实的方法:尽管connect,connection,connecting,connected等词并不完全相同,但它们都具有相同的基本含义:connect。拼写上的差异在口语中具有语法功能,但是对于机器处理,这些差异可能会造成混淆,因此我们需要一种方法来将所有单词形式的单词connect变成单词connect self。

  一种执行此操作的方法称为“ 阻止”。词干涉及简单地去除容易识别的前缀和后缀,以产生通常是单词最简单的版本。例如,连接将删除-ion后缀,并正确地减小以连接。这种简单的词干通常是需要的,但是词义化(实际上是查看字典中描述的词及其词根(称为lemma))(只要词存在于字典中)更为精确。

  由于spaCy包含了将单词分解为引理的内置方法,因此我们可以简单地将其用于引理。在以下非常简单的示例中,我们将使用它.lemma_为要分析的每个单词产生引理。

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_07

 

  词性(POS)标记

  单词的词性定义了它在句子中的功能。例如,名词标识一个对象。形容词描述一个对象。动词描述动作。在句子的上下文中识别和标记每个单词的语音部分称为词性标记或POS标记。

  让我们尝试使用POS标记spaCy!我们需要导入其en_core_web_sm模型,因为其中包含进行此分析所需的字典和语法信息。然后,我们需要做的就是将这个模型加载.load()并遍历我们的新docs变量,使用确定每个单词的词性.pos_。

  (注意û中u"All is well that ends well."表示该字符串是Unicode字符串。)

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_08

 

  spaCy已正确识别出该句子中每个单词的词性。能够识别词性在各种与NLP相关的上下文中很有用,因为它有助于更准确地理解输入句子并更准确地构建输出响应。

  实体检测

  实体检测,也称为实体识别,是语言处理的一种更高级形式,它可以识别文本输入字符串中的重要元素,例如位置,人物,组织和语言。这对于快速从文本中提取信息非常有帮助,因为您可以快速挑选出重要的主题或确定文本的关键部分。

  我们将为.label文本中检测到的每个实体获取一个标签,然后使用spaCy的displaCy显示工具以更直观的格式查看这些实体。

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_09

 

  使用这种技术,我们可以识别文本中的各种实体。该spaCy文档提供了受支持的实体类型的完整列表,从上面的简短示例中我们可以看出,它能够识别各种不同的实体类型,包括特定位置(GPE),与日期相关的单词(DATE),重要数字(CARDINAL),特定个人(PERSON)等。

  使用displaCy我们还可以可视化我们的输入文本,每个标识的实体都用颜色突出显示并标记。我们将style = "ent"用来告诉displaCy我们要在此处可视化实体。

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_10

 

  依赖解析

  独立性分析是一种语言处理技术,它使我们可以通过分析句子的构造来确定各个单词之间的相互关系,从而更好地确定句子的含义。

  例如,考虑句子“比尔掷球”。我们有两个名词(比尔和球)和一个动词(掷)。但是我们不能只单独看这些话,否则我们可能最终以为球在扔比尔!为了正确理解句子,我们需要查看单词顺序和句子结构,而不仅仅是单词及其词性。

  这样做非常复杂,但值得庆幸的是,spaCy它将为我们完成工作!在下面,让我们spaCy从新闻头条中再加上一句话。然后,我们将使用另一个spaCy名为的noun_chunks,它将输入分解为名词和描述它们的单词,并遍历源文本中的每个块,从而识别单词,其词根,其依赖项标识以及它属于哪个块。

  

python 文本分析归类 用python处理文本数据分类_自然语言处理_11

 

  该输出可能有点难以理解,但是由于我们已经导入了displaCy可视化工具,因此我们可以使用它来查看依赖关系图,其中使用style = "dep"起来更容易理解:

  

python 文本分析归类 用python处理文本数据分类_数据_12

 

  

python 文本分析归类 用python处理文本数据分类_字符串_13

 

  当然,我们还可以查看有关依赖关系解析spaCy的文档,以更好地了解根据解释每个句子的方式可能应用于文本的不同标签。

  词向量表示

  当我们单看单词时,机器很难理解人类会立即理解的联系。例如,引擎和汽车似乎有一个明显的连接(汽车使用引擎运行),但是这种链接对计算机而言并不那么明显。

  值得庆幸的是,有一种方法可以表示可以捕获更多此类连接的单词。甲字矢量是commuicates其换句话说关系的词的数字表示。

  每个单词都被解释为唯一且冗长的数字数组。您可以将这些数字视为GPS坐标之类的东西。GPS坐标由两个数字(纬度和经度)组成,如果我们看到两组GPS坐标在数字上彼此接近(如43--70和44--70),我们会知道这两个位置相对紧靠在一起。词矢量与此类似,虽然有很多分配给每个单词超过两个坐标,所以他们对人类眼球更难。

  使用spaCy的en_core_web_sm模型,让我们看一个单词的向量长度,以及使用.vector和看起来的向量.shape。

  

python 文本分析归类 用python处理文本数据分类_字符串_14

 

  人们无法观察到该数组并将其识别为“芒果”的含义,但是以这种方式表示该单词对机器而言效果很好,因为它使我们能够代表该单词的含义及其与其他相似单词的“接近度”使用数组中的坐标。

  文字分类

  现在,我们已经看了一些spaCy一般可以完成的很酷的事情,让我们看一下这些自然语言处理技术中的一些更大的实际应用:文本分类。通常,我们可能会发现自己想要根据一些参数(例如,每个片段的主题)进行分类的一组文本数据,而文本分类将帮助我们做到这一点。

  下图显示了在对文本进行分类时我们想要做什么的全景视图。首先,我们从源文本(及其附带的任何标签或元数据)中提取所需的功能,然后将清理后的数据馈送到为我们进行分类的机器学习算法中。

  

python 文本分析归类 用python处理文本数据分类_数据_15

 

  导入库

  我们将从导入此任务所需的库开始。我们已经导入了spaCy,但是我们也想要pandas并scikit-learn帮助进行分析。

  

python 文本分析归类 用python处理文本数据分类_数据_16

 

  加载数据中

  上面,我们看了一些使用进行文本分析的简单示例spaCy,但是现在我们将使用进行一些Logistic回归分类scikit-learn。为了使这一点更加现实,我们将使用真实的数据集-这组Amazon Alexa产品评论。

  该数据集以制表符分隔的文件(.tsv)的形式出现。它已经有五列:rating,date,variation,verified_reviews,feedback。

  rating表示每个用户给Alexa的评分(满分5分)。date指示审查日期,并variation描述用户审查的型号。verified_reviews包含每个评论的文本,并feedback包含一个情感标签,其中1表示正面情绪(用户喜欢),0表示负面情绪(用户不喜欢)。

  该数据集包含消费者对亚马逊Echos,Echo Dots,Alexa Firesticks等Alexa产品的评论。我们要做的是开发一个分类模型,该模型查看评论文本并预测评论是正面还是负面。由于此数据集已在该feedback列中包含评论是肯定的还是否定的,因此我们可以使用这些答案来训练和测试我们的模型。我们的目标是生成一个准确的模型,然后将其用于处理新的用户评论,并快速确定它们是正面还是负面。

  首先,将数据读取到数据pandas框中,然后使用pandas的内置函数来帮助我们仔细查看数据。

  

python 文本分析归类 用python处理文本数据分类_自然语言处理_17

 

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_18

 

  使用标记数据 spaCy

  现在我们知道我们正在使用什么,让我们使用创建一个自定义标记器函数spaCy。我们将使用此功能自动从每个评论中剥离不需要的信息,例如停用词和标点符号。

  我们将从导入所需的英语模型spaCy以及Python的string模块开始,该模块包含一个有用的清单,其中列出了我们可以在中使用的所有标点符号string.punctuation。我们将创建包含要删除的标点符号和停用词的变量,以及一个通过spaCy英文模块运行输入的解析器。

  然后,我们将创建一个spacy_tokenizer()函数,该函数接受一个句子作为输入,并将该句子处理为标记,执行词形化,小写并删除停用词。这类似于我们在大数据分析Python中spaCy文本分类使用教程前面的示例中所做的操作,但是现在我们将所有内容放到一个函数中,以预处理要分析的每个用户评论。

  

python 文本分析归类 用python处理文本数据分类_自然语言处理_19

 

  定义自定义变压器

  为了进一步清除文本数据,我们还需要创建一个自定义转换器,以删除开头和结尾的空格并将文本转换为小写形式。在这里,我们将创建一个predictors继承TransformerMixin类的自定义类。该类重写transform,fit和get_parrams方法。我们还将创建一个clean_text()删除空格并将文本转换为小写字母的函数。

  

python 文本分析归类 用python处理文本数据分类_字符串_20

 

  矢量化特征工程(TF-IDF)

  在对文本进行分类时,最终得到的是与相应标签匹配的文本片段。但是我们不能在我们的机器学习模型中简单地使用文本字符串。我们需要一种将文本转换为可以用数字表示的内容的方法,就像标签(正数为1,负数为0)一样。在正面和负面标签中对文本进行分类称为情感分析。因此,我们需要一种数字表示文本的方法。

  我们可以用来执行此操作的一种工具称为Word of Words。BoW将文本转换为给定文档中单词出现的矩阵。它着眼于给定单词在文档中是否出现,并生成一个矩阵,我们可以将其称为BoW矩阵或文档术语矩阵。

  我们可以通过为我们的文本数据弓矩阵scikit-learn的CountVectorizer。在下面的代码中,我们告诉CountVectorizer使用spacy_tokenizer构建的自定义函数作为其标记生成器,并定义所需的ngram范围。

  N-gram是给定文本中相邻单词的组合,其中n是插入标记中的单词数。例如,句子“谁将在2022年赢得世界杯足球赛?” 字母组合是一个单词序列,例如“ who”,“ will”,“ win”等。二元组将是两个连续单词的序列,例如“谁将”,“将获胜”,等等。因此,ngram_range我们将在下面的代码中使用的参数设置ngram的上下限(我们将使用unigram)。然后,我们将ngram分配给bow_vector。

  

python 文本分析归类 用python处理文本数据分类_字符串_21

 

  我们还希望查看术语的TF-IDF(术语频率-反文档频率)。这听起来很复杂,但这只是通过查看每个单词的频率与文档频率的比较来规范我们的单词袋(BoW)的一种方式。换句话说,这是一种表示特定术语在给定文档中的重要性的方法,它基于该术语出现了多少次以及该术语出现在其他文档中的数量。TF-IDF越高,这个词对那个文件更重要。

  我们可以用以下数学方程式表示:

  

python 文本分析归类 用python处理文本数据分类_python 文本分析归类_22

 

  当然,我们不必手工计算!我们可以使用scikit-learn的TfidfVectorizer 自动生成TF-IDF 。再次,我们将告诉它使用与我们一起构建的自定义标记生成器,spaCy然后将结果分配给变量tfidf_vector。

  

python 文本分析归类 用python处理文本数据分类_自然语言处理_23

 

  将数据分为训练集和测试集

  我们正在尝试建立分类模型,但是我们需要一种方法来了解其实际表现。将数据集分为训练集和测试集的方法是经过实践检验的。我们将一半的数据集用作训练集,其中将包含正确的答案。然后,我们将使用数据集的另一半测试模型,而无需给出答案,以查看其执行的准确性。

  便利,scikit-learn为我们提供了一个内置的这样做的功能:train_test_split()。我们只需要告诉它要分割的功能集(X),要对其进行测试的标签(ylabels)以及要用于测试集的大小(以十进制形式的百分比表示)。

  

python 文本分析归类 用python处理文本数据分类_自然语言处理_24

 

  创建管道并生成模型

  现在我们已经完成了所有的设置,现在是时候实际构建模型了!我们将从导入LogisticRegression模块并创建LogisticRegression分类器对象开始。

  然后,我们将创建一个包含三个组件的管道:清理器,向量器和分类器。清洁器使用我们的predictors类对象来清洁和预处理文本。向量器使用countvector对象为文本创建词袋矩阵。分类器是执行逻辑回归以对情感进行分类的对象。

  建立此管道后,我们将使用来装配管道组件fit()。

  

python 文本分析归类 用python处理文本数据分类_数据_25

 

  评估模型

  让我们看一下我们的模型实际表现如何!我们可以使用中的metrics模块执行此操作scikit-learn。现在我们已经训练了模型,我们将把测试数据通过管道进行预测。然后,我们将使用metrics模块的各种功能来查看模型的准确性,准确性和召回率。

  1)准确性是指我们的模型做出的完全正确的预测总数中的百分比。

  2)精度描述了我们预测中真实阳性与真实阳性加假阳性的比率。

  3)回忆描述了我们的预测中真实阳性与真实阳性加假阴性的比率。

  上面的文档链接提供了每个术语的更多详细信息和更精确的定义,但最重要的是,所有三个指标的测量范围均为0到1,其中1完全正确地预测了所有指标。因此,模型的得分越接近1,就越好。

  

python 文本分析归类 用python处理文本数据分类_数据_26

 

  换句话说,总体而言,我们的模型在94.1%的时间内正确地识别了评论的情绪。当它预测评论是正面的时,该评论实际上在95%的时间内是正面的。当进行正面评价时,我们的模型将其确定为正面评价的时间为98.6%

  资源和后续步骤

  在大数据分析Python中spaCy文本分类使用教程的整个过程中,我们已经从执行一些非常简单的文本分析操作spaCy到使用来构建自己的机器学习模型scikit-learn。当然,这仅仅是个开始,两者还有很多spaCy,scikit-learn必须提供给Python数据科学家。