首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除高度相似的文档复制文档

删除高度相似的文档复制文档
EN

Stack Overflow用户
提问于 2018-11-14 14:09:11
回答 3查看 375关注 0票数 1

在下载lexisnexis的报纸文章时,语料库中经常有很多重复的文章。我想删除它们,我正在考虑通过使用余弦相似性统计来实现,但我不知道如何实现自动化。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-18 11:41:13

你已经收到了一些很好的答案。但是,如果您喜欢针对特定用例的更加自动化的方法,则可以使用包LexisNexisTools (我编写的包)。它附带了一个名为lnt_similarity()的函数,它可以完成您所需要的功能。我编写了一个关于模拟数据这里的快速教程。

这里的解决方案与lnt_similarity()中的解决方案的主要区别在于,我还考虑了语序,这在一些罕见的情况(请看这篇博文)中会产生很大的不同。

我还建议您仔细考虑阈值,否则可能会错误地删除一些文章。我添加了一个函数来可视化两篇文章之间的差异,这样您就可以更好地掌握要删除的数据,称为lnt_diff()

票数 1
EN

Stack Overflow用户

发布于 2018-11-14 15:49:44

你的问题在细节上相当薄弱--比如一个可复制示例 --但这是一个有趣的问题和挑战。就这么办了。

假设我们有一个由两组相似文档组成的语料库,{ (a1,a2,a3),(b1,b2) },其中字母表示相似。当其他文档是“重复的”时,我们只保留一个文档,定义为超过阈值的相似性,比如0.80。

我们可以使用textstat_simil()生成一个相似矩阵,然后直接从返回的dist对象生成成对集,然后只保留其中的一个相似集。

代码语言:javascript
复制
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()中的逻辑条件。

代码语言:javascript
复制
# 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

解决这一类似文档问题的其他解决方案是将它们形成聚类,或者按照潜在语义分析的思路,使用主成分分析减少文档矩阵。

票数 2
EN

Stack Overflow用户

发布于 2018-11-17 12:41:34

如果您有数千个文档,那么需要在内存中占用大量的空间来保存所有相似的分数,但是您可以在textstat_proxy() ( textstat_simil()的底层函数)中设置一个最小阈值。

在本例中,小于0.9的余弦相似度分数都被忽略。

代码语言:javascript
复制
library("quanteda")
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_proxy(mydfm, method = "cosine", min_proxy = 0.9))
# 5 x 5 sparse Matrix of class "dsTMatrix"
#    a1        b1        a2        b2        a3    
# a1  1 .         .         .         .        
# b1  . 1.0000000 .         0.9113423 .        
# a2  . .         1.0000000 .         0.9415838
# b2  . 0.9113423 .         1.0000000 .        
# a3  . .         0.9415838 .         1.0000000

matrix2list <- function(x) {
    names(x@x) <- rownames(x)[x@i + 1]
    split(x@x, factor(x@j + 1, levels = seq(ncol(x)), labels = colnames(x)))
}

matrix2list(sim)
# $a1
# a1 
#  1 
# 
# $b1
# b1 
#  1 
# 
# $a2
# a2 
#  1 
# 
# $b2
#        b1        b2 
# 0.9113423 1.0000000 
# 
# $a3
#        a2        a3 
# 0.9415838 1.0000000 

有关性能差异,请参见https://koheiw.net/?p=839

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53302151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档