前面的文章介绍了整洁文本和标记化,并且统计了词频和词频之间的相关性。但是,仅仅知道某些词汇出现的频率是不够的。正如我们自己在阅读一篇文章或者一本书的时候,能体会到作者的喜怒哀乐,我们也想知道如何利用R语言检测文本表达的含义和对事物的看法,挖掘文本中的观点。这就是情感分析。
通常,如果一篇文章中充满了赞美(或者批判)的词汇,那么我们就知道这篇文章赞美(或者批判)的观点。这是一种简单的情感分析的方法。但这并非唯一的方法,我们还有其它的方法。接下来,我们就来介绍如何用R语言实现情感分析。
现在有很多方法可以用来分析文本的观点或者情感。在tidytext程序包中,有一些情感词典,常用的是以下三个:
AFINN:对单词打分,介于-5和+5之间。分数越高,词汇越正面。
bing:这个是Bing Liu等人开发的。他有一本书,叫做Sentiment Analysis: mining sentiments, opinions, and emotions。有兴趣的朋友可以读一下。
nrc:nrc情感词典包括英语中8种感情(生气、恐惧、希望、信任、惊奇、悲伤、高兴和反感)。
这三个词典都建立在单词之上。它们根据正面感情和负面感情对英语词汇分类。下面,我们来看一下如何使用这三个词典。
首先,我们需要下载textdata程序包,并且引用它和tidytext程序包。
install.packages("textdata")library(textdata)library(tidytext)
接下来,我们就可以用get_sentiments()函数调用这三个词典。
get_sentiments("afinn")# A tibble: 2,477 x 2 word value 1 abandon -2 2 abandoned -2 3 abandons -2 4 abducted -2 5 abduction -2 6 abductions -2 7 abhor -3 8 abhorred -3 9 abhorrent -310 abhors -3# ... with 2,467 more rows
我们可以看出affin是如何对每一个单词打分的。看起来a开头的这些单词得分都不高。
再来看bing,我们同样可以用get_sentiments()函数调用。同affin类似,以a开头的单词都在表达负面信息。
get_sentiments("bing")# A tibble: 6,786 x 2 word sentiment 1 2-faces negative 2 abnormal negative 3 abolish negative 4 abominable negative 5 abominably negative 6 abominate negative 7 abomination negative 8 abort negative 9 aborted negative10 aborts negative# ... with 6,776 more rows
相比之下,nrc对单词的分类显得更加有意思。例如,算盘(Abacus)表示信任,看来信心建立在算清楚的基础上。另外,abandon这个单词可以表达多种情感。
get_sentiments("nrc")# A tibble: 13,901 x 2 word sentiment 1 abacus trust 2 abandon fear 3 abandon negative 4 abandon sadness 5 abandoned anger 6 abandoned fear 7 abandoned negative 8 abandoned sadness 9 abandonment anger 10 abandonment fear # ... with 13,891 more rows
总得来说,这些词典对词语的情感分析似乎也不是很到位。我们不能完全依赖于它们。而且,任何语言会随着时间,发展和变化。当我们用21世纪对词汇的理解,去解释一些过去的著作的时候,就会产生差异。
除了这三个词典,还有一些特定领域(domain-specific)的词典,它们可以用来解释一些专业词汇。例如,金融和医学中就有很多专业词汇。