Использование content_transformer с udpipe_annotate
Поэтому я только что узнал, что у udpipe есть отличный способ показать корреляции, поэтому я начал работать над этим. Код с этого сайта отлично работает, если я использую его в файле csv после его импорта и не вносю в него никаких изменений.
Но моя проблема возникает, как только я создаю корпус, и я изменяю / удаляю некоторые слова. Я не эксперт в R, но я так много гуглил и не могу понять.
Вот мой код:
txt <- read_delim(fileName, ";", escape_double = FALSE, trim_ws = TRUE)
# Maak Corpus
docs <- Corpus(VectorSource(txt))
docs <- tm_map(docs, tolower)
docs <- tm_map(docs, removePunctuation)
docs <- tm_map(docs, removeNumbers)
docs <- tm_map(docs, stripWhitespace)
docs <- tm_map(docs, removeWords, stopwords('nl'))
docs <- tm_map(docs, removeWords, myWords())
docs <- tm_map(docs, content_transformer(gsub), pattern = "afspraak|afspraken|afgesproken", replacement = "afspraak")
docs <- tm_map(docs, content_transformer(gsub), pattern = "communcatie|communiceren|communicatie|comminicatie|communiceer|comuniseren|comunuseren|communictatie|comminiceren|comminisarisacie|communcaite", replacement = "communicatie")
docs <- tm_map(docs, content_transformer(gsub), pattern = "contact|kontact|kontakt", replacement = "contact")
comments <- docs
library(lattice)
stats <- txt_freq(x$upos)
stats$key <- factor(stats$key, levels = rev(stats$key))
#barchart(key ~ freq, data = stats, col = "cadetblue", main = "UPOS (Universal Parts of Speech)\n frequency of occurrence", xlab = "Freq")
## NOUNS (zelfstandige naamwoorden)
stats <- subset(x, upos %in% c("NOUN"))
stats <- txt_freq(stats$token)
stats$key <- factor(stats$key, levels = rev(stats$key))
barchart(key ~ freq, data = head(stats, 20), col = "cadetblue", main = "Most occurring nouns", xlab = "Freq")
## ADJECTIVES (bijvoeglijke naamwoorden)
stats <- subset(x, upos %in% c("ADJ"))
stats <- txt_freq(stats$token)
stats$key <- factor(stats$key, levels = rev(stats$key))
barchart(key ~ freq, data = head(stats, 20), col = "cadetblue", main = "Most occurring adjectives", xlab = "Freq")
## Using RAKE (harkjes)
stats <- keywords_rake(x = x, term = "lemma", group = "doc_id", relevant = x$upos %in% c("NOUN", "ADJ"))
stats$key <- factor(stats$keyword, levels = rev(stats$keyword))
barchart(key ~ rake, data = head(subset(stats, freq > 3), 20), col = "cadetblue", main = "Keywords identified by RAKE", xlab = "Rake")
## Using Pointwise Mutual Information Collocations
x$word <- tolower(x$token)
stats <- keywords_collocation(x = x, term = "word", group = "doc_id")
stats$key <- factor(stats$keyword, levels = rev(stats$keyword))
barchart(key ~ pmi, data = head(subset(stats, freq > 3), 20), col = "cadetblue", main = "Keywords identified by PMI Collocation", xlab = "PMI (Pointwise Mutual Information)")
## Using a sequence of POS tags (noun phrases / verb phrases)
x$phrase_tag <- as_phrasemachine(x$upos, type = "upos")
stats <- keywords_phrases(x = x$phrase_tag, term = tolower(x$token), pattern = "(A|N)*N(P+D*(A|N)*N)*", is_regex = TRUE, detailed = FALSE)
stats <- subset(stats, ngram > 1 & freq > 3)
stats$key <- factor(stats$keyword, levels = rev(stats$keyword))
barchart(key ~ freq, data = head(stats, 20), col = "cadetblue", main = "Keywords - simple noun phrases", xlab = "Frequency")
cooc <- cooccurrence(x = subset(x, upos %in% c("NOUN", "ADJ")),
term = "lemma",
group = c("doc_id", "paragraph_id", "sentence_id"))
head(cooc)
library(igraph)
library(ggraph)
library(ggplot2)
wordnetwork <- head(cooc, 30)
wordnetwork <- graph_from_data_frame(wordnetwork)
ggraph(wordnetwork, layout = "fr") +
geom_edge_link(aes(width = cooc, edge_alpha = cooc), edge_colour = "pink") +
geom_node_text(aes(label = name), col = "darkgreen", size = 4) +
theme_graph(base_family = "Arial Narrow") +
theme(legend.position = "none") +
labs(title = "Cooccurrences within sentence", subtitle = "Nouns & Adjective")
Как только я конвертирую импортированный файл в корпус, происходит сбой. Кто-нибудь знает, как я все еще могу выполнить функции tm_map и затем запустить код udpipe?
Tnx заранее!
1 ответ
Есть несколько решений для того, что вы хотите. Но так как ваш корпус создан с использованием вектора, это всего лишь один длинный вектор входных данных. Это вы можете очень легко вернуться в вектор так udpipe
может взять на себя
В udpipe
в примере документов все определяется как x
так что я сделаю то же самое. После очистки корпуса просто выполните:
x <- as.character(docs[1])
[1] после документов важен, иначе вы получите дополнительные символы, которые вам не нужны. Как только это будет сделано, выполните команды udpipe, чтобы превратить вектор в нужный вам data.frame.
x <- udpipe_annotate(ud_model, x)
x <- as.data.frame(x)
Другой способ - сначала написать корпус (проверить ?writeCorpus
для получения дополнительной информации) на диск, а затем снова прочитайте очищенные файлы и вставьте их через udpipe. Это скорее обходной путь, но может привести к улучшению рабочего процесса.
Также udpipe обрабатывает пунктуацию, он вставляет в специальный класс upos, называемый PUNCT, с описанием xpos (на голландском, если вы используете голландскую модель) Punc|komma или unc|punt. Если существительное имеет заглавную букву, лемма будет строчной.
В вашем случае я бы просто использовал базовые параметры регулярных выражений для просмотра данных вместо использования tm. Голландские заглавные слова просто удаляют некоторые глаголы, такие как "zijn", "worden" en "kunnen" en, некоторые выражения как "te" и местоимения как "ik" и "мы". В любом случае вы фильтруете их в своем коде udpipe, поскольку смотрите только на существительные и прилагательные.