学习自然语言处理的基础知识并探索两个有用的Python包。自然语言处理(NLP)是一种机器学习,它解决口语或书面语言与这些语言的计算机辅助分析之间的相关性。我们在日常生活中经历了无数的NLP创新,从写作帮助和建议到实时语音翻译和口译。本文研究了NLP的一个特定领域:情感分析。重点在于确定输入语言的正面、负面或中性性质。本节介绍NLP和情感分析的背景,并探索两个开源Python包。第2部分将演示如何开始构建您自己的可扩展情绪分析服务。在学习情感分析时,对NLP有一个大概的了解是很有帮助的。本文不会深究数学的本质。相反,我们的目标是阐明NLP中的关键概念,这些概念对于将这些方法实际纳入您的解决方案至关重要。自然语言和文本数据的合理起点是从定义开始:“什么是自然语言?”这是我们人类相互交流的方式,主要是口头和书面形式。我们可以更进一步,只关注文本通信。毕竟,生活在Siri、Alexa等无处不在的时代,我们知道语音是一组与文本无关的计算。数据前景与挑战我们只考虑文本数据,我们可以用语言和文本做什么?首先是语言,尤其是英语,有许多例外情况,各种含义和上下文差异可能会使人类口译员感到困惑,更不用说计算机翻译员了。在小学,我们学习冠词和标点符号,通过说我们的母语,我们获得了找到能够直观传达独特含义的单词的能力。比如出现“a”、“the”、“or”等冠词,在NLP中称为停用词,因为传统上,当NLP算法在一个序列中找到这些词时,就意味着搜索停止。由于我们的目标是自动将文本分类为情感类别,因此我们需要一种方法来计算处理文本数据。因此,我们不得不考虑如何向机器表示文本数据。利用和解释语言的规则非常复杂,输入文本的大小和结构可能千差万别。我们需要将文本数据转换为数字数据,这是机器和数学的最佳方式。这种转换属于特征提取的范畴。在提取输入文本数据的数字表示后,一个改进可能是:给定一个文本输入量,为上面列出的文章确定一组向量统计,并根据这些数据对文档进行分类。例如,过多的副词可能会激怒撰稿人,或者过度使用停用词可能有助于识别带有内容填充的学期论文。不可否认,这可能与我们的情绪分析目标没有太大关系。词袋当你评估一个文本陈述是正面的还是负面的时,你使用什么上下文来评估它的极性?(例如,文本是否具有积极、消极或中性的情绪)一种方式是隐式形容词:称为“恶心”的东西被认为是消极的,但如果同一事物被称为“美丽”,你会认为它是积极的。根据定义,口语化给人一种熟悉感,通常是积极的,而咒骂可能是敌意的表现。文本数据还可以包括带有固定情绪的表情符号。了解单个单词的极性影响为文本的词袋(BoW)模型提供了基础。它分析一组单词或词汇,并提取有关这些单词在输入文本中是否存在的指标。词汇表是通过将已知极性的文本处理成称为标记的训练数据而形成的。从这组带标签的数据中提取特征,然后分析特征之间的关系,将标签与数据关联起来。“词袋”这个名字解释了它的用途:即独立的词,而不考虑空间位置或上下文。词汇表通常是从训练集中出现的所有单词构建的,并且经常在训练后进行修剪。如果在训练前没有清理停用词,停用词会因为它们的高频和低上下文而被删除。由于缺少为一般输入实例提供的信息,也可以删除很少使用的词。但是,请务必注意,您可以(并且应该)将单词进一步提取到训练数据的单个实例之外,这称为词频(TF)。您还应该考虑所有训练实例中输入数据的字数。通常,在所有文档中出现频率较低的词更重要。这称为逆文档频率(IDF)。这些指标肯定会在本主题系列的其他文章和包中提及,因此了解它们很有帮助。词袋在许多文档分类应用程序中很有用。然而,在情绪分析中,当利用缺乏情境意识时,事情就可以解决了。考虑以下句子:我们不喜欢这场战争。我讨厌下雨天,幸好今天是晴天。这不是生死攸关的问题。这些短语的情感对于人类口译员来说是困难的,并且通过严格关注单个单词的实例,机器翻译也很难。也可以在NLP中使用称为“n-grams”的词组。二元组考虑两个相邻单词的组,而不是(或除了)单个词袋。这应该可以缓解上面的“不喜欢”之类的事情,但由于缺乏上下文意义,它仍然是一个问题。此外,在上面的第二句话中,后半部分的情感语境可以理解为对前半部分的否定。因此,这种方法也丢失了上下文线索的空间局部性。从实际的角度来看,使问题复杂化的是从给定输入文本中提取的特征的稀疏性。对于一个完整的大词汇表,每个单词都有一个计数,可以看作是一个整数向量。大多数文档的向量中都有大量的零计数向量,这给操作增加了不必要的空间和时间复杂度。虽然已经提出了许多简单的方法来降低这种复杂性,但它仍然是一个问题。词嵌入词嵌入是一种分布式表示,它允许具有相似含义的词具有相似的表示。这是基于使用实值向量来关联它们。重点在于单词的使用方式,而不仅仅是单词的存在与否。此外,词嵌入的一个巨大的实际优势是它们专注于密集向量。通过使用相应数量的零值向量元素摆脱单词计数模型,单词嵌入在时间和存储方面提供了一种计算效率更高的范例。下面是两种优秀的词嵌入方法。Word2vec首先是Word2vec,由Google开发。随着您深入研究NLP和情感分析,您可能会看到这种嵌入方法。它使用连续词袋(CBOW)或连续skip-gram模型。在CBOW中,一个词的上下文是在训练期间根据它周围的词学习的。连续的skip-gram学习倾向于学习给定单词周围的单词。虽然这可能超出了您需要解决的范围,但如果您遇到过必须生成自己的词嵌入的情况,Word2vec的作者提倡使用CBOW方法来提高频繁词的速度和评估,而skip-gram方法更适合具有更重要的稀有词嵌入的嵌入。GloVe第二种是GlobalVectorsforWordRepresentation(GloVe),这是一种用于词表示的全局向量,由斯坦福大学开发。它是Word2vec方法的扩展,试图将经典的全局文本统计特征提取获得的信息与Word2vec确定的局部上下文信息相结合。事实上,GloVe在某些应用程序中优于Word2vec,而在其他应用程序中不如Word2vec。最终,词嵌入的目标数据集将决定采用哪种方法***。因此,最好了解它们的存在和高级机制,因为您很可能会遇到它们。创建和使用词嵌入***了解如何获取词嵌入很有用。在第2部分中,您将看到我们通过利用社区中其他人的实质性工作站在巨人的肩膀上。这是获得词嵌入的一种方法:即使用现有的经过训练和验证的模型。事实上,有无数适用于英语和其他语言的型号,一定有一款适合您的应用,让您开箱即用!如果不是,则开发工作的另一个极端是训练您自己的独立模型,而不管您的应用程序是什么。从本质上讲,您将获得大量带标签的训练数据,并有可能使用上述方法之一训练模型。即便如此,您仍然只能理解您输入的文本数据。然后,您需要为您的应用程序开发一个特定的模型(例如,分析软件版本控制消息中的情绪值),这又需要自己的时间和精力。您还可以在特定于您的应用程序的数据上训练词嵌入,虽然这可以减少时间和精力,但词嵌入将是特定于应用程序的,这将降低其可重用性。可用的工具选项鉴于所需的时间和计算能力,您可能想知道如何找到解决问题的方法。事实上,开发可靠模型的复杂性可能令人望而生畏。不过,有个好消息:已经有许多经过验证的模型、工具和软件库可以为我们提供大部分所需。我们将专注于Python,因为它为这些应用程序提供了许多方便的工具。SpaCySpaCy提供了多种语言模型用于解析输入文本数据和提取特征。它经过高度优化,被誉为同类库中最快的。最重要的是,它是开源的!SpaCy执行标记化、词性分类和依赖性注释。它包括用于执行此功能的词嵌入模型,以及超过46种语言的其他特征提取操作。在本系列的第二篇文章中,您将看到它如何用于文本分析和特征提取。vaderSentimentvaderSentiment包提供积极、消极和中性情绪的度量。正如原论文的标题(《VADER:一个基于规则的社交媒体文本情感分析模型》)所示,这些模型是专门针对社交媒体文本数据开发和调整的。VADER接受了一组完整的人工标记数据的训练,包括常见的表情符号、UTF-8编码的表情符号以及口语术语和缩写(例如meh、lol、sux)。对于给定的输入文本数据,vaderSentiment返回极性得分百分比的三元组。它还提供了一个单一的评分标准,称为vaderSentiment综合指标。这是[-1,1]范围内的一个真实值,其中分数大于0.05的情绪被认为是积极的,分数小于-0.05的情绪被认为是消极的,否则是中性的。
