Ваш вопрос довольно тонок в деталях - например, воспроизводимый пример - но это интересный вопрос и проблема.Итак, пошли.
Допустим, у нас есть корпус, состоящий из двух наборов одинаковых документов: {(a1, a2, a3), (b1, b2)}, где буквы указывают на сходство.Мы хотим сохранить только один документ, когда остальные являются «дубликатами», определяемыми как сходство, превышающее порог, скажем, 0,80.
Мы можем использовать textstat_simil()
, чтобы сгенерировать матрицу подобия, а затем сформировать попарные множества непосредственно из возвращенного объекта dist
, а затем сохранить только один из подобных наборов.
library("quanteda")
# Loading required package: quanteda
# Package version: 1.3.14
mydocs <- c(a1 = "a a a a a b b c d w g j t",
b1 = "l y y h x x x x x y y y y",
a2 = "a a a a a b c s k w i r f",
b2 = "p q w e d x x x x y y y y",
a3 = "a a a a a b b x k w i r f")
mydfm <- dfm(mydocs)
(sim <- textstat_simil(mydfm))
# a1 b1 a2 b2
# b1 -0.22203788
# a2 0.80492203 -0.23090513
# b2 -0.23427416 0.90082239 -0.28140219
# a3 0.81167608 -0.09065452 0.92242890 -0.12530944
# create a data.frame of the unique pairs and their similarities
sim_pair_names <- t(combn(docnames(mydfm), 2))
sim_pairs <- data.frame(sim_pair_names,
sim = as.numeric(sim),
stringsAsFactors = FALSE)
sim_pairs
# X1 X2 sim
# 1 a1 b1 -0.22203788
# 2 a1 a2 0.80492203
# 3 a1 b2 -0.23427416
# 4 a1 a3 0.81167608
# 5 b1 a2 -0.23090513
# 6 b1 b2 0.90082239
# 7 b1 a3 -0.09065452
# 8 a2 b2 -0.28140219
# 9 a2 a3 0.92242890
# 10 b2 a3 -0.12530944
Подставляя это в наше пороговое условие, мы можем извлечь имена неудачных документов, которые должны быть отброшены, и передать это в логическое условие в dfm_subset()
.
# set the threshold for similarity
threshold <- 0.80
# discard one of the pair if similarity > threshold
todrop <- subset(sim_pairs, select = X1, subset = sim > threshold, drop = TRUE)
todrop
# [1] "a1" "a1" "b1" "a2"
# then subset the dfm, keeping only the "keepers"
dfm_subset(mydfm, !docnames(mydfm) %in% todrop)
# Document-feature matrix of: 2 documents, 20 features (62.5% sparse).
# 2 x 20 sparse Matrix of class "dfm"
# features
# docs a b c d w g j t l y h x s k i r f p q e
# b2 0 0 0 1 1 0 0 0 0 4 0 4 0 0 0 0 0 1 1 1
# a3 5 2 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
Другие решения этой проблемы подобных документовбудет состоять в том, чтобы сформировать их в кластеры или уменьшить матрицу документа с использованием анализа основных компонентов в соответствии со скрытым семантическим анализом.