Введение
В моей школе я должен принять участие в конкурсе, чтобы понять, понимаю ли я, как работает анализ текста в R.
Для этого у нас есть 1050 файлов различного типа (покупки, дома, счета и т. Д.).
Целью этого упражнения является разработка скрипта для поиска типа HTML-страницы с классификатором, время и точность очень важны.
Мы с моей командой используем классификатор kppv для начала, но с этим у нас 40% ошибок. Поэтому мы должны решить использовать классификатор SVM!
Исследования
С несколькими документами и с большим терпением мы должны создать скрипт для создания модели SVM со всем документом.
И когда мы хотим узнать, распознан ли файл, помещенный в модель, это работает.
Но когда мы хотим поместить HTML-страницу, выходные данные меняются, и мы не знаем, что с этим делать.
код
main.r
library("e1071")
library("tm")
splash=function(x){
res=NULL
for (i in x) res=paste(res, i)
res
}
#Suppression des script s(<script .... </script>)
removeScript=function(t){
sp=strsplit(t, "<script")
vec=sapply(sp[[1]], gsub, pattern=".*</script>", replace=" ")
PlainTextDocument(splash(vec))
}
#Suppression de toutes les balises
removeBalises=function(x){
t1=gsub("<[^>]*>", " ", x)
PlainTextDocument(gsub("[ \t]+"," ",t1))
}
clean_corpus = function(corp)
{
corp<-tm_map(corp,content_transformer(tolower))
corp<-tm_map(corp,content_transformer(splash))
corp<-tm_map(corp,content_transformer(removeScript))
corp<-tm_map(corp,content_transformer(removeBalises))
corp<-tm_map(corp,removeNumbers)
corp<-tm_map(corp,removeWords,words=stopwords('en'))
corp<-tm_map(corp,stemDocument)
corp<-tm_map(corp,removePunctuation)
corp
}
training_set = readRDS(file = "training_set.rds")
term20 = readRDS(file = "term20.rds")
classes = c(rep(1,150), rep(2,150), rep(3,150), rep(4,150), rep(5,150), rep(6,150), rep(7,150))
model <-svm(x=training_set[,ncol(training_set)],y=classes,type='C',kernel='linear', cost=1, gamma=1)
summary(model)
pred = predict(model, classes)
pred
testingFile = function()
{
src = DirSource("testing")
corp = VCorpus(src)
clean_corpus(corp);
}
testCorpus = testingFile()
testCorpus
testdtm = DocumentTermMatrix(testCorpus, control=list(weighting=weightTf))
testmat = as.matrix(testdtm)
testpreds = sapply(1, function(i)
{
v = testmat[i, ][term20]
#v[is.na(v)] = 0
predict(model, v)
})
testpreds
скрипт для повторного ввода текста
library("tm")
library("magrittr")
library("SnowballC")
library("nnet")
acc<-VCorpus(DirSource("training2016/", recursive=TRUE))
#acc<-VCorpus(DirSource("trainingLight/", recursive=TRUE))
[...]
dtm = DocumentTermMatrix(clean_corpus(acc))
dtm
term20 = findFreqTerms(dtm, lowfreq = 20)
freqs = sapply(1:50, function(i) length(findFreqTerms(dtm, lowfreq = i)))
plot(freqs)
dtm20 = dtm[, term20]
dim(dtm20)
m = as.matrix(dtm20)
classes = c(rep(1,150), rep(2,150), rep(3,150), rep(4,150), rep(5,150), rep(6,150), rep(7,150))
#classes = c(rep(1,150), rep(2,150), rep(3,150))
training_set = cbind(m, classes)
saveRDS(training_set, file = "training_set.rds")
saveRDS(term20, file = "term20.rds")
Результат
Когда мы хотим, положить только один файл, он выводит список слов со значением (который является классом).
Этот вывод может быть полезен, но мы не знаем как.
Мы хотим знать, как использовать этот вывод.
Выход
accessori "5"
account "1"
ahead "1"
airport "4"
also "1"
amp "1"
anyon "1"
appl "7"
around "1"
audio "1"
australia "1"
avail "1"
...