Чтобы сделать pos-тегирование с помощью udpipe, вы можете сделать следующее (основываясь на данных вашего примера A & B).
library(udpipe)
library(magrittr)
library(data.table)
txt <- rbindlist(list(A = A, B = B), idcol = "dataset")
txt$id <- sprintf("dataset%s_id%s", txt$dataset, seq_len(nrow(txt)))
# Tag using udpipe version 0.6 on CRAN which allows to show annotation progress
udmodel <- udpipe_download_model("english")
udmodel <- udpipe_load_model(udmodel$file_model)
txt_anno <- udpipe_annotate(udmodel, x = txt$name, doc_id = txt$id, trace = 5)
txt_anno <- as.data.table(txt_anno)
Если вы хотите вычислить сходства на основе матрицы терминов документа леммы, выполните следующие действия (использует sim2
из text2vec
R пакета)
# construct DTM with only nouns based on lemmas
dtm1 <- subset(txt_anno, upos %in% c("NOUN"), select = c("doc_id", "lemma")) %>%
document_term_frequencies %>%
document_term_matrix
library(text2vec)
sim2(dtm1, dtm1, method = "cosine")
Если вы также хотите добавить в игру nграмм существительных, сделайте следующее. Извлеките существительные, следующие друг за другом, создайте документ / термин / матрицу этого нового составного термина и объедините его с существующей матрицей терминов документа, чтобы легко выполнить сходство документов.
# Add ngrams of nouns in the game (2 nouns following one another with an optional punctuation in between)
keyw <- txt_anno[, keywords_phrases(x = upos, term = lemma, pattern = "NOUN(PUNCT)*NOUN", is_regex = TRUE), by = "doc_id"]
keyw <- keyw[, list(freq = .N), by = c("keyword", "ngram")]
# add a new column of this n-gram and create DTM
txt_anno <- txt_anno[, term := txt_recode_ngram(x = lemma, compound = keyw$keyword, ngram = keyw$ngram), by = "doc_id"]
dtm2 <- subset(txt_anno, term %in% keyw$keyword, select = c("doc_id", "term")) %>%
document_term_frequencies %>%
document_term_matrix
dtmcombined <- dtm_cbind(dtm1, dtm2)
colnames(dtmcombined)
sim2(dtmcombined, dtmcombined, method = "cosine")