星期二, 八月 30, 2011

基于支持向量机的文本挖掘

文本挖掘中很重要的一项任务就是对文本进行分类,基本步骤就是收集训练文本和已知对应的分类,通过分类器来学习训练集,然后利用建立的模型对未知的文本进行分类检验。

#指定原始文本存放目录,然后生成文本集。本例中的两类文本存放在crude和acq两个文件夹中,格式均为xml,若格式为纯文本,则需指定reader = readPlain

crude = Corpus(DirSource("d:/crude"), readerControl = list(reader = readReut21578XML))

acq = Corpus(DirSource("d:/acq"), readerControl = list(reader = readReut21578XML))

#合并两个文本集,并将其转为纯文本格式
ws = c(acq, crude)
ws = tm_map(ws, as.PlainTextDocument)


#对文本集进行转换操作
ws = tm_map(ws, removeNumbers)
ws = tm_map(ws, stripWhitespace)
ws = tm_map(ws, removePunctuation)
ws =tm_map(ws, removeWords, stopwords("english"))
ws = tm_map(ws, tolower)


#若要对文本集进行筛选,可以利用如下两个命令,生成只包含keyword的新文本集
tm_filter(ws, FUN = searchFullText, "keyword")
#生成一个逻辑向量
tm_index(ws, FUN = searchFullText, "keyword")

#用文本集生成词频矩阵,weightTfIdf参数控制是否使用Tf-idf算法
dtm = TermDocumentMatrix(ws,control = list(weighting = weightTfIdf))
#删除出现次数过少的词汇变量
dtm2 = removeSparseTerms(dtm, sparse=0.9)
inspect(dtm2[1:5,1:5])

#若未使用Tf-idf算法则可利用下面命令来统计词频和相关性
findFreqTerms(dtm, 1, Inf)
findAssocs(dtm, "crude", 0.85)

#将矩阵转为普通的数据框格式,并生成分类变量
data = as.data.frame(inspect(t(dtm2)))
data$typ e= factor(rep(1:2,times=c(50,20)))
levels(data$type )= c('acq','crude')

#加载kernlab软件包
library(kernlab)
#从数据中抽取一半做为训练集,另一半作为检验集
sub = sample(c(0,1),size=70,replace=T)
sdata=data[sub==1,]
tdata=data[sub==0,]

#建立分类模型并进行预测
ksvm = ksvm(type ~ ., data = sdata)
pre =predict(ksvm,tdata)
table(pre,tdata$type)

结果如下:
pre     acq crude
  acq    21     5
  crude   0     4

另个在R语言中还有RTextTools包和RcmdrPlugin.TextMining包可以辅助进行文本挖掘工作。

没有评论:

发表评论