MIT:The Analytics Edge 笔记05-文本分析

MIT课程 15.071x The Analytics Edge 第五单元的学习记录。


Text Analytics

第五单元的主题是文本分析。

1.理论

Bag of Words

一段文本,可以看作是多个单词的集合。
统计这些单词的特征,可以归纳文本的倾向。

首先,我们需要对文本进行下面这几步预处理:

  1. clean up irregularities(统一大小写)
  2. remove punctuations(去掉标点或者特殊符号)
  3. remove stop words(去掉the/who/is/do这些单词)
  4. stemming(获取词干,也就是去除动词变形,比如agrued,agrues,agruing,都变成agru)

然后,我们统计文本中剩下这些单词的出现次数,生成一个矩阵,类似这样的格式:

text num word1 word2 word3
text1 2 5 0
text2 0 3 4

在实际中,生成的矩阵是个稀疏矩阵(有很多0),我们只选取出现次数比较多的,忽略那些不常见的单词。
比如选取至少出现过20次的单词,其他的忽略。
这样的矩阵,每列的列名就是自变量,矩阵的值就用做自变量的取值。

最后,手动添加一列,作为因变量,这样就可以根据这些单词的出现次数,预测因变量的取值了。
所以,这一列因变量的数值如何定义,它的实际意义是什么,其实是比较复杂的。

在课程的例子中,它定义了”好感度”,并且只有下面五种取值,{-2,-1,0,1,2},最终要建立模型预测哪些文本暗示发推的人对苹果公司很没有好感(好感度是-2)。最终发现,文本中含有”hate”,”wtf”的情况,推主对苹果公司很没有好感。😄

IBM Watson

Watson的工作步骤是这样的:

  1. Find LAT
    首先得搞明白问题是什么,也就是要找到问题的LAT(Lexial Answer Type)。
    问题”Mozart’s last and perhaps most powerful symphony shares its name with this planet.”的LAT是”this planet”,因为把答案”Jupiter”替换进原来的句子,
    “Mozart’s last and perhaps most powerful symphony shares its name with Jupiter”
    仍然是说得通的。
  2. Generate Hypothesis
    在数据库中搜索上百个候选答案,替换掉LAT,生成很多假说。
  3. Score Hypothesis
    对每个假说,进行文本搜索,可以将搜索的到的结果数目作为评分。
  4. Rank Hypothesis
    对评分进行排序,选取评分最高的那个作为答案。

2.建模和评估

预处理

# Read in the data
# 不要把文本转化为因子
tweets = read.csv("tweets.csv", stringsAsFactors=FALSE)

# Create dependent variable
tweets$Negative = as.factor(tweets$Avg <= -1)

# Install new packages
install.packages("tm")
library(tm)
install.packages("SnowballC")
library(SnowballC)

# Create corpus
corpus = Corpus(VectorSource(tweets$Tweet))

# Convert to lower-case
corpus = tm_map(corpus, tolower)
corpus = tm_map(corpus, PlainTextDocument)

# Remove punctuation
corpus = tm_map(corpus, removePunctuation)

# Remove stopwords and apple
corpus = tm_map(corpus, removeWords, c("apple", stopwords("english")))

# Stem document 
corpus = tm_map(corpus, stemDocument)

统计,生成单词出现次数的矩阵

# Create matrix
frequencies = DocumentTermMatrix(corpus)

# Look at matrix 
inspect(frequencies[1000:1005,505:515])

# Check for sparsity
# 找出出现次数至少有20次的单词
findFreqTerms(frequencies, lowfreq=20)

# 忽略99.5%的稀疏数据,只选取0.5%作为有效数据
# Remove sparse terms 
sparse = removeSparseTerms(frequencies, 0.995)

# Convert to a data frame
tweetsSparse = as.data.frame(as.matrix(sparse))
# Make all variable names R-friendly
colnames(tweetsSparse) = make.names(colnames(tweetsSparse))

# Add dependent variable
tweetsSparse$Negative = tweets$Negative

建模和评估

# Split the data
library(caTools)
set.seed(123)
split = sample.split(tweetsSparse$Negative, SplitRatio = 0.7)
trainSparse = subset(tweetsSparse, split==TRUE)
testSparse = subset(tweetsSparse, split==FALSE)

# Build a CART model
library(rpart)
library(rpart.plot)
tweetCART = rpart(Negative ~ ., data=trainSparse, method="class")
# Evaluate the performance of the model
predictCART = predict(tweetCART, newdata=testSparse, type="class")
table(testSparse$Negative, predictCART)


# Random forest model
library(randomForest)
set.seed(123)
tweetRF = randomForest(Negative ~ ., data=trainSparse)
# Make predictions:
predictRF = predict(tweetRF, newdata=testSparse)
table(testSparse$Negative, predictRF)