Я не знаю, что делают из результата функции предвидеть - PullRequest
0 голосов
/ 31 марта 2019

Введение

В моей школе я должен принять участие в конкурсе, чтобы понять, понимаю ли я, как работает анализ текста в 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" 
...

1 Ответ

0 голосов
/ 01 апреля 2019

После нескольких исследований я узнаю, что функция предикатов должна принимать матрицу слова и только слова.

Итак, я только что добавил это в свой скрипт:

v = testmat[1, ][term20]
names(v) = term20
v[is.na(v)] = 0
mat = matrix(v,nrow=1)
pred = predict(model, mat)
tableau = table(pred)
names(tableau)[[which.max(tableau)]]

Что происходитпреобразовать мой вектор в матрицу и удалить файлы NA и вернуть значение, которое является классом моего файла, отправленного в модели SVM.

...