情感分析教程

做者|Zijing Zhu
编译|VK
来源|Towards Datas Sciencepython

据估计,世界上80%的数据是非结构化的。所以,从非结构化数据中提取信息是数据分析的重要组成部分。web

文本挖掘是从非结构化文本数据中获取有价值的信息的过程,情感分析是文本挖掘的应用之一。它使用天然语言处理和机器学习技术从文本数据中理解和分类情绪。在商业环境中,情绪分析普遍应用于了解客户评论、从电子邮件中检测垃圾邮件等。正则表达式

本文是本教程的第一部分,介绍了使用Python进行情绪分析的具体技术。为了更好地说明程序,我将以个人一个项目为例,对WTI原油期货价格进行新闻情绪分析。我将介绍重要的步骤以及相应的Python代码。flask

一些背景资料

原油期货价格短时间内有较大波动。任何产品的长期均衡都是由供求情况决定的,而价格的短时间波动则反映了市场对该产品的信心和预期。在本项目中,我利用与原油相关的新闻文章来捕捉不断更新的市场信心和预期,并经过对新闻文章进行情绪分析来预测将来原油价格的变化。如下是完成此分析的步骤:网络

一、收集资料:网络抓取新闻文章app

二、文本数据预处理(本文)dom

三、文本矢量化:TFIDF机器学习

四、用logistic回归进行情绪分析函数

五、使用python flask web app在Heroku部署模型工具

我将讨论第二部分,即本文中文本数据的预处理。若是你对其余部分感兴趣,请继续阅读。

文本数据预处理

我使用NLTK、Spacy和一些正则表达式中的工具来预处理新闻文章。要导入库并使用Spacy中的预构建模型,可使用如下代码:

import spacy
import nltk

# 初始化spacy'en'模型

nlp = spacy.load(‘en’, disable=[‘parser’, ‘ner’])

以后,我用Pandas读入数据:

“Subject”和“Body”是我将应用文本预处理过程的列。我按照标准的文本挖掘过程对新闻文章进行预处理,以重新闻内容中提取有用的特征,包括标识化、删除停用词和词形还原。

标识化

文本数据预处理的第一步是将每一个句子分解成单独的单词,这称为标识化。使用单个单词而不是句子会破坏单词之间的联系。然而,这倒是一种经常使用的方法。计算机经过检查文章中出现的单词和这些单词出现的次数来分析文本数据是比较高效和方便的,而且足以得出有价值的结果。

以个人数据集中的第一篇新闻文章为例:

可使用NLTK tokenizer:

或者可使用Spacy,记住nlp是上面定义的Spacy引擎:

标识化以后,每一篇新闻文章都将转换成一个单词、符号、数字和标点符号的列表。你能够指定是否也要将每一个单词都转换为小写。下一步是删除无用信息。例如,符号、数字、标点符号。我将使用spacy和regex组合来删除它们。

import re

#标识化和删除标点
words = [str(token) for token in nlp(text) if not token.is_punct] 

#删除数字和其余符号,但“@”除外--用于删除电子邮件
words = [re.sub(r"[^A-Za-z@]", "", word) for word in words]

#删除网站和电子邮件地址
words = [re.sub(r”\S+com”, “”, word) for word in words]
words = [re.sub(r”\S+@\S+”, “”, word) for word in words]

#删除空白
words = [word for word in words if word!=’ ‘]

应用上述转换后,原始新闻文章以下所示:

停用词

通过一番改造,新闻文章干净多了,但咱们仍是看到了一些咱们不但愿看到的词,好比“and”、“we”等,下一步就是去掉无用的词,即停用词。

停用词是在许多文章中常常出现但没有意义的词。stopword的例子有“I”、“the”、“a”、“of”。这些字眼若是删除,将不会影响对文章的理解。要删除stopwords,咱们能够从NLTK库导入stopwords。

此外,我还列出了其余在经济分析中普遍使用的停用词列表,包括日期和时间,更通常的没有经济意义的单词,等等。如下是我如何构建停用词列表的方法:

#导入其余停用词列表
with open(‘StopWords_GenericLong.txt’, ‘r’) as f:
 x_gl = f.readlines()
with open(‘StopWords_Names.txt’, ‘r’) as f:
 x_n = f.readlines()
with open(‘StopWords_DatesandNumbers.txt’, ‘r’) as f:
 x_d = f.readlines()
 
#导入nltk停用词
stopwords = nltk.corpus.stopwords.words(‘english’)

#合并全部停用词
[stopwords.append(x.rstrip()) for x in x_gl][stopwords.append(x.rstrip()) for x in x_n][stopwords.append(x.rstrip()) for x in x_d]

#将全部停用词改成小写
stopwords_lower = [s.lower() for s in stopwords]

而后重新闻文章中排除停用词:

words = [word.lower() for word in words if word.lower() not in stopwords_lower]

应用于上一个示例,其外观以下:

词形还原

除去中止字,以及符号、数字和标点符号后,咱们要把每一篇新闻文章的单词进行词形还原。咱们必须去掉语法时态并将每一个单词转换成其原始形式。

例如,若是咱们想计算一篇新闻文章中出现“open”一词的次数,咱们须要计算“open”、“opens”、“opened”的出现次数。所以,词形还原是文本转换的一个重要步骤。另外一种将单词转换成原始形式的方法叫作词干提取。它们之间的区别是:

词形还原是把一个词引入它原来的词形中,词干提取是把一个词的词根提取出来(可能直接去掉前缀后缀)。我选择词形还原而不是词干提取,由于词干提取后,有些词变得很难理解。从解释的角度来讲,词形还原比词干提取好。

上面的引理很容易实现。在词形还原以后,每一篇新闻文章都将转换成一个词的列表,这些词都是原来的形式。新闻文章如今改为这样:

总结

让咱们总结一下函数中的步骤,并在全部文章中应用该函数:

def text_preprocessing(str_input): 
     #标识化,删除标点,词形还原
     words=[token.lemma_ for token in nlp(str_input) if not         token.is_punct]
 
     #删除符号、网站、电子邮件地址
     words = [re.sub(r”[^A-Za-z@]”, “”, word) for word in words] 
     words = [re.sub(r”\S+com”, “”, word) for word in words]
     words = [re.sub(r”\S+@\S+”, “”, word) for word in words] 
     words = [word for word in words if word!=’ ‘]
     words = [word for word in words if len(word)!=0] 
 
     #删除停用字 
     words=[word.lower() for word in words if word.lower() not in     stopwords_lower]
     
     #将列表合并为一个字符串 
     string = " ".join(words)
     
     return string

在这里,文本预处理与前面的全部预处理步骤相结合:

在将其推广到全部新闻文章以前,重要的是将其应用于随机新闻文章,并查看其工做原理,遵循如下代码:

import random

index = random.randint(0, df.shape[0])
text_preprocessing(df.iloc[index][‘Body’])

若是你想为此特定项目排除一些额外的单词,或者你想删除一些多余的信息,你能够在应用于全部新闻文章以前修改函数。这是一篇随机选取的新闻文章,在标识化先后,去掉了停用词和词形还原。

预处理前的新闻文章:

预处理后的新闻文章

若是能够,你能够将全部文章都应用于如下函数:

df[‘news_cleaned’]=df[‘Body’].apply(text_preprocessing)
df[‘subject_cleaned’]=df[‘Subject’].apply(text_preprocessing)

结论

文本预处理是文本挖掘和情感分析的重要组成部分。有不少方法能够对非结构化数据进行预处理,使其可读,便于计算机未来分析。下一步,我将讨论用于将文本数据转换为稀疏矩阵,以便它们能够用做定量分析的输入。

若是你的分析很简单,而且不须要在预处理文本数据时进行大量定制,那么vectorizers一般具备内嵌函数来执行基本步骤,好比标识化、删除stopwords。或者你能够编写本身的函数,并在向量化器中指定自定义函数,这样就能够同时对数据进行预处理和向量化。

若是你但愿这样作,那么你的函数须要返回一个通过标记化的单词列表,而不是一个长字符串。可是,就我的而言,我更喜欢在向量化以前先对文本数据进行预处理。经过这种方式,我一直在监视函数的性能,并且它实际上会更快,特别是当你有一个大的数据集时。

原文连接:https://towardsdatascience.com/a-step-by-step-tutorial-for-conducting-sentiment-analysis-a7190a444366

欢迎关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官方文档:
http://sklearn123.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

相关文章
相关标签/搜索