作者 | George Seif
译者 | 孙薇,责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
以下为译文:
现代公司要处理大量的数据。这些数据以不同形式出现,包括文档、电子表格、录音、电子邮件、JSON以及更多形式。这类数据最常用的记录方式之一就是通过文本,这类文本通常与我们日常所使用的自然语言十分相似。
自然语言处理(NLP)是针对计算机编程的研究,探索处理和分析大量自然文本数据的方式。自然语言处理的知识对于数据科学家来说至关重要,因为文本是数据存储中极为易用和常用的介质。
面对针对文本数据执行分析和构建模型的任务时,我们必须清楚要如何执行基础的数据科学任务,包括清理、格式化、解析、分析、执行可视化和对文本数据建模。当数据还处于原始数字的构成形态时,除了这些任务的常规方法,还会需要一些额外的步骤。
本篇指南将对在数据科学中使用自然语言处理做基础性的介绍,包括处理文本数据时最常用的7种技术,如NLTK及Scikit Learn等。
(1) 标记化(Tokenization)
标记化指的是将文本切分为句子或单词,在此过程中,我们也会丢弃标点符号及多余的符号。
这个步骤并非看起来那么简单。举个例子:在上图的实例中,“纽约(New York)”一词被拆成了两个标记,但纽约是个代名词,在我们的分析中可能会很重要,因此最好只保留一个标记。在这个步骤中要注意这一点。
标记化的好处在于,会将文本转化为更易于转成原始数字的格式,更合适实际处理。这也是文本数据分析显而易见的第一步。
代码语言:javascript复制import nltk
sentence = "My name is George and I love NLP"
tokens = nltk.word_tokenize(sentence)
print(tokens)
# Prints out ['My', 'name', 'is', 'George', 'and', 'I', 'love', 'NLP']
(2) 删除停止词(Stop Words Removal)
在标记化之后,下一步自然是删除停止词。这一步的目标与上一步类似,也是将文本数据转化为更容易处理的格式。这一步会删除英语中常见的介词,如“and”、“the”、“a”等。之后在分析数据时,我们就能消除干扰,专注于具有实际意义的单词了。
通过比对预定义列表中的单词来执行停止词的删除非常轻松。要注意的重要问题是:并没有普天皆适的停止词列表。因此这个列表一般是从零开始创建,并针对所要处理的应用执行了定制。
代码语言:javascript复制import nltk
from nltk.corpus import stopwords
sentence = "This is a sentence for removing stop words"
tokens = nltk.word_tokenize(sentence)
stop_words = stopwords.words('english')
filtered_tokens = [w for w in tokens if w not in stop_words]
print(filtered_tokens)
# Prints out ['This', 'sentence', 'removing', 'stop', 'words']
(3) 提取主干(Stemming)
清理文本数据的另一个技术就是提取主干。这种方法是将单词还原为词根形式,目的是将因上下文拼写略有不同,但含义相同的单词缩减为相同的标记来统一处理。例如:考虑在句子中使用单词“cook”的情况——写cook这个词是有很多方式的,具体要取决于上下文:
上图中cook的所有形式含义都基本相同,因此理论上,在分析时我们可以将其映射到同一个标记上。在本例中,我们将cook、cooks、cooked和cooking全部标记为“cook”,这将大大简化我们对文本数据的进一步分析。
代码语言:javascript复制import nltk
snowball_stemmer = nltk.stem.SnowballStemmer('english')
s_1 = snowball_stemmer.stem("cook")
s_2 = snowball_stemmer.stem("cooks")
s_3 = snowball_stemmer.stem("cooked")
s_4 = snowball_stemmer.stem("cooking")
# s_1, s_2, s_3, s_4 all have the same result
(4) 单词嵌入(Word Embeddings)
从上面三个步骤中,我们已经将数据清理完毕,现在可以将其转化为可用于实际处理的格式。
单词嵌入是一种将单词以数字表达的方式,这样一来,具有相似含义的单词表达也会相似。如今的单词嵌入是将单个单词表示为预定义向量空间中的实值向量。
所有单词的向量长度相同,只是值有差异。两个单词的向量之间的距离代表着其语义的接近程度。举个例子:单词“cook”(烹饪)和“bake”(烘焙)的向量就非常接近,但单词“football”(足球)和“bake”(烘焙)的向量则完全不同。
有一种创建单词嵌入的常见方法被称为GloVe,它代表着“全局向量”。GloVe捕获文本语料库的全局统计信息和局部统计信息,以创建单词向量。
GloVe使用了所谓的共现矩阵(co-occurrence matrix)。共现矩阵表示每对单词在语料库里一起出现的频率。例如:假设我们要为以下三个句子创建一个共现矩阵:
- 我喜欢数据科学(I love Data Science)。
- 我喜欢编程(I love coding)。
- 我应该学习自然语言处理(I should learn NLP)。
该文本库的共现矩阵如下所示:
真实世界中的数据集,矩阵会大得多。好处在于:单词嵌入只需计一次数据,之后就可以保存到磁盘中了。
之后,我们要训练GloVe学习每个单词的固定长度向量,以便让任何两个单词的向量点积(dot product)与共现矩阵中对数单词的共现概率相等。在下面论文的目标函数中表达为:
在等式中,X代表着在共现矩阵中位置 (i,j)的值,而w则是要得出的单词向量。因此,借助该目标函数,GloVe能将两个单词向量的点积与共现的差异最小化,从而有效地保证要得出的向量与矩阵中的共现值相关。
过去几年中,由于GloVe在单词语义及其相似性方面的编码极其有效,已被证实是一种非常强大且用途广泛的单词嵌入技术。对于数据科学应用来说,这是一种经过验证的方法,可以将单词转为我们能够处理和分析的格式。
点击这里可以查看在Python中如何使用GloVe的完整教程:
https://medium.com/analytics-vidhya/basics-of-using-pre-trained-glove-vectors-in-python-d38905f356db
(5) 词频-逆文档频率(Term Frequency-Inverse Document Frequency, TF-IDF)
术语“词频-逆文档频率”(常被称为TF-IDF)是一种加权因子,经常在诸如信息检索及文本挖掘类的应用中使用。TF-IDF会使用统计数据来衡量某个单词对特定文档的重要程度。
- TF——词频:衡量某字符串在某个文档中出现的频率。计算方式:将文档中出现的总数除以文档总长度(以标准化)。
- IDF——逆文档频率:衡量某字符串在某个文档中的重要程度。例如:特定字符串如“is”、“of”和“a”会在许多文档中多次出现,但并无多少实际含义——它们不是形容词或者动词。因此IDF会根据重要程度对每个字符串加权,计算方式为:将数据集的总文档数目,除以包含该字符串的文档数目(需将分母 1,避免分母为0),再将得到的商取对数算出。
- TF-IDF:其最终的计算结果只是将TF与IDF简单相乘。
TF-IDF可以达到完美平衡,并考虑到目标单词的本地与全局统计水平。在文档中出现越频繁的单词,其权重也越高,不过前提是这个单词在整个文档中出现并不频繁。
由于其强大程度,TF-IDF技术通常被搜索引擎用在指定关键字输入时,评判某文档相关性的评分与排名上。在数据科学中,我们可以通过这种技术,了解文本数据中哪些单词和相关信息更为重要。
代码语言:javascript复制import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
def get_tf_idf(vectorizer):
feature_names = vectorizer.get_feature_names()
dense_vec = vectors.todense()
dense_list = dense_vec.tolist()
tfidf_data = pd.DataFrame(dense_list, columns=feature_names)
return tfidf_data
vectorizer = TfidfVectorizer()
doc_1 = "TF-IDF uses statistics to measure how important a word is to "
"a particular document"
doc_2 = "The TF-IDF is perfectly balanced, considering both local and global "
"levels of statistics for the target word."
doc_3 = "Words that occur more frequently in a document are weighted higher, "
"but only if they're more rare within the whole document."
documents_list = [doc_1, doc_2, doc_3]
vectors = vectorizer.fit_transform(documents_list)
tfidf_data = get_tf_idf(vectorizer)
print(tfidf_data)
# Prints the TF-IDF data for all words across all documents
(6) 主题建模(Topic Modeling)
在自然语言处理中,主题建模是从文本数据或文档的集合中提取主要话题的过程。本质来讲,由于我们将大量文本数据缩减为数量较少的主题,这是一种降维形式。主题建模在许多数据科学场景中都很有用。
下面举几个例子:
- 文本的数据分析——提取数据的潜在趋势和主要组成部分;
- 分类文本——与降维处理经典机器学习问题的方式类似,由于我们会将文本压缩为关键功能,因此主题建模在这里也很有用。
- 构建推荐系统——主题建模会自动提供为文本数据提供一些基础的分组,甚至可以提供构建和训练模型的附加功能。
主题建模通常通过隐含狄利克雷分布(LDA)来完成。借助LDA,我们将各个文本文档按照主题的多项分布,各个主题按照单词(通过标记化、停用词删除、提取主干等多个技术清理出的单个字符)的多项分布来建模。
LDA是假设文档由多个主题构成,这些主题之后会基于其概率分布来生成单词。
首先,我们会告知LDA各个文档应当有多少主题,每个主题应当由多少单词构成。针对指定文档的数据集,LDA会尝试确定哪些主题的组合和分布可以准确重建相应文档以及其中的所有文本。可以通过构建实际文档,确定哪个主题有效,并在指定主题的情况下,根据单词的概率分布对单词进行采样以完成构建。
一旦LDA找出可以在数据集中准确重建所有文档及其内容的主题分布,我们最终具有恰当分布的主题就确定了。
代码语言:javascript复制from sklearn.decomposition import LatentDirichletAllocation as LDA
NUM_TOPICS = 3
# Here we create and fit the LDA model
# The "document_word_matrix" is a 2D array where each row is a document
# and each column is a word. The cells contain the count of the word within
# each document
lda = LDA(n_components=NUM_TOPICS, n_jobs=-1)
lda.fit(document_word_matrix)
(7) 情感分析(Sentiment Analysis)
情感分析是一种自然语言分析技术,旨在识别与提取文本数据中的主观信息。与主题建模类似,情感分析可以将非结构化的文本转为嵌入在数据中的信息基本摘要。
大多情感分析技术都属于以下两个类别之一:基于规则和机器学习的方法。基于规则的方法需要根据简单的步骤来获得结果。在进行了一些类似标记化、停止词消除、主干提取等预处理步骤后,基于规则的方法可能会遵从以下步骤:
- 对于不同的情感,定义单词列表。例如,如果我们打算定义某个段落是消极的还是积极的,可能要为负面情感定义“坏的”和“可怕的”等单词,为正面情感定义“棒极了”和“惊人的”等单词;
- 浏览文本,分别计算正面与负面情感单词的数量。
- 如果标记为正面情感的单词数量比负面的多,则文本情绪是积极的,反之亦然。
基于规则的方法在情感分析用于获取大致含义时效果很好。但是,如今最先进的系统通常会使用深度学习,或者至少经典的机器学习技术让整个过程自动化。
通过深度学习技术,将情感分析按照分类问题来建模。将文本数据编码到一个嵌入空间中(与上述的单词嵌入类似),这是功能提取的一种形式。之后将这些功能传递到分类模型,对文本情绪进行分类。
这种基于学习的方法非常强大,因为我们可以将其自动化为优化问题。我们连续向模型发送数据,以获得持续改进,也是一个巨大的好处。更多的数据可以继续优化功能提取和情感分类。
关于如何通过机器学习模型使用情感分析有大量的优秀教程,下面是其中几个:
- With Logistic Regression :https://towardsdatascience.com/sentiment-analysis-with-python-part-1-5ce197074184
- With Random Forest:https://stackabuse.com/python-for-nlp-sentiment-analysis-with-scikit-learn/
- With Deep Learning LSTM:https://towardsdatascience.com/sentiment-analysis-for-text-with-deep-learning-2f0a0c6472b5
原文:https://towardsdatascience.com/an-introductory-guide-to-nlp-for-data-scientists-with-7-common-techniques-584d623c40f0
本文出品: CSDN(ID:CSDNnews)