Hi Consuli,
tut mir Leid, hab vollkommen vergessen zu antworten.
Nachdem die Arbeit schon die längste Zeit benotet is sollte es kein Problem sein den Auszug aus dem Code hier zu veröffentlichen.
Das Schleichwerbung-Wörterbuch habe ich quasi mit Wörtern die häufig in Werbebeiträgen vorkommen und diese auch mehr oder weniger klar als Werbung ersichtlich machen erstellt - siehe wordList im Code. Könnte man vermutlich noch umfangreicher gestalten, für meine Zwecke hat es aber ausgereicht.
Hab nur mit SVM gearbeitet. Richtig interessant könnte es werden, wenn man das Klassifizierungsmodell weiter verbessert und mit noch mehr Daten trainiert. Beispielsweise mittels „Ensemble Learning“ weitere Algorithmen neben der SVM verwenden...
Code: Alles auswählen
#Liste mit Keywords zum filtern der Werbung
wordList = c('sponsored','advertisement','kooperation', 'werbung','\\bad\\b', 'advertising', 'commercial', 'anzeige', 'collaboration', 'collab', 'giveaway', 'gewinnspiel', 'verlosung', 'raffle')
# Hier werden mit Hilfe der erstellten wordList alle Beiträge die eines der
# definierten Keywords enthalten als Werbung gekennzeichnet
dataset <- df %>% mutate(
caption = tolower(caption),
is_ad = ifelse(grepl(paste(c(wordList), collapse="|"), caption), 1, 0)
)
# hier sieht man das Verhältnis von Werbung zu keiner Werbung
summary(dataset$is_ad == 1)
# Ich füge "künstliche" Schleichwerbung hinzu indem ich die gekennzeichnete Werbung
# dupliziere und die Keywords der wordList aus den Beiträgen lösche
camouflagedAds = dataset %>%
filter(is_ad == 1) %>%
mutate(caption = gsub(paste(wordList, collapse="|"), "", tolower(caption))) %>%
mutate(is_ad = 2)
# Zusammenführen der Daten
combinedData = dataset %>% rbind(camouflagedAds)
# Erstellen der neuen Datensätze für die
# unterschiedlichen Kategorien:
ads = combinedData %>% filter(is_ad == 1)
cmads = combinedData %>% filter(is_ad == 2)
nonAds = combinedData %>% filter(is_ad == 0)
adsCount = nrow(ads)
cmadsCount = nrow(cmads)
nonAdCount = nrow(nonAds)
# zufälligen Seed setzen damit man auf das selbe Ergebnis kommt
set.seed(1990)
# ziehen der zufälligen Stichprobe
# habe die Stichprobengröße 30.000 Beiträge gewählt,
# da größere Stichproben zu Problemen geführt haben
inTrain = c(sample(1:cmadsCount, 1000),sample(cmadsCount+(1:nonAdCount),29000))
# Zusammenführen der Datensätze cmads + nonAds
# und umwandeln der Variable „is_ad“ in einen Faktor:
alldata = rbind(cmads, nonAds) %>% mutate(is_ad = as.factor(is_ad))
# Trainingsdatensatz erstellen
trainData = alldata %>% slice(inTrain)
#Testdatensatz erstellen
testData = alldata %>% slice(-inTrain) %>% slice(1:30000)
#Document-Term Matrix für Training erstellen
dtMatrix = create_matrix(trainData$caption)
# Erstellen des Containers zum Trainieren der SVM
container = create_container(dtMatrix, trainData$is_ad, trainSize=1:nrow(trainData), virgin=FALSE)
# Trainieren des SVM Models
model = train_model(container, "SVM", kernel="linear", cost=1)
# Fehler im RTextTools Paket. Damit es funktioniert muss in Zeile 42
# das Wort "Acronym" durch "acronym" ersetzt werden. Ansonsten
# kommt eine Fehlermeldung.
trace("create_matrix", edit=T)
# Document-Term Matrix für Prognose erstellen
predMatrix = create_matrix(testData$caption, originalMatrix=dtMatrix)
# Den entsprechenden Container erstellen
predSize = length(testData$caption)
predictionContainer = create_container(predMatrix, labels=rep(0,predSize), testSize=1:predSize, virgin=FALSE)
# Prognose durchführen
results = classify_model(predictionContainer, model)
results
# Ergebnis der Prognose abrufen
table(results$SVM_LABEL)
# Confusion Matrix erstellen
Confusion_Matrix = confusionMatrix(results$SVM_LABEL, testData$is_ad)
Confusion_Matrix
stargazer(Confusion_Matrix, type="html", out="Conf_mtrx.html")
# Datensatz für weitere Analyse erstellen
# künstliche Schleichwerbung wird wieder Werbung, durch SVM erkannte Schleichwerbung bleibt
output = testData %>%
cbind(results) %>%
mutate(SVM_Klassifizierung = ifelse(is_ad =="2", "Werbung", ifelse(SVM_LABEL == "2","Schleichwerbung", "Keine Werbung")),
labels = as.factor(ifelse(SVM_Klassifizierung == "Werbung", 1, ifelse(SVM_Klassifizierung == "Keine Werbung",0,2))))
head(output)
str(output)
# eigene Datensätze für die jeweiligen Kategorien erstellen
SVM_ads = output %>% filter(SVM_Klassifizierung == "Werbung")
SVM_cmads = output %>% filter(SVM_Klassifizierung == "Schleichwerbung")
SVM_nonAds = output %>% filter(SVM_Klassifizierung == "Keine Werbung")
# Crossfold Validation SVM mit RTextTools
SVM_cv = cross_validate(container,4,"SVM")
SVM_cv
LG,
bnjmn_j