上图中cook的所有形式含义都基本相同,因此理论上,在分析时我们可以将其映射到同一个标记上。在本例中,我们将cook、cooks、cooked和cooking全部标记为“cook”,这将大大简化我们对文本数据的进一步分析。
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技术通常被搜索引擎用在指定关键字输入时,评判某文档相关性的评分与排名上。在数据科学中,我们可以通过这种技术,了解文本数据中哪些单词和相关信息更为重要。
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找出可以在数据集中准确重建所有文档及其内容的主题分布,我们最终具有恰当分布的主题就确定了。
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 翻译,转载请注明来源出处。