2016-04-07 10 views
2

Makalelerin kendi makalelerinin benzerliğine dayalı olarak çok büyük bir gazete makalesi veritabanında girdileri birleştirmeye çalışıyorum. dplyr kullanarak Ben tam tekrarlar da başarılı oldu burada bir süre baktıktan sonraBir data.frame ile benzerlikle grup dizeleri

ID Source File Newspaper Date  Length Article 
1 aaa  The Guardian 07.30.2002 561  US scientist questions 
2 aaa  The Guardian 07.30.2002 426  Cash fine to clear elderly... 
3 aaa  The Guardian 07.30.2002 206  Token victory for HIV mother 
4 aab  Financial Times 07.29.2002 964  A tough question at the heart.. 
5 aab  The Guardian 07.29.2002 500  Media: 'We want van Hoogstr… 
6 aab  The Mirror  07.29.2002 43  IN BRIEF… 
7 aab  The Sun   07.29.2002 196  US scientist questions 
8 aab  The Sun   07.29.2002 140  ADDED VALUE 
9 aab  The Times  07.29.2002 794  US-scientist questions 
10 …  …    …   …  … 

:

Benim veri böyle bir şekilde görünüyor

Dup_info <- meta_articles.m %>% 
    group_by(Articles) %>% 
    summarise(IDs = toString(ID)) 

Bu doğru tanımlayan 1. ve kopya olarak 7. ve yinelenen girişleri kaldırdıktan sonra bilgileri tutabiliyorum. Tek bir karakter farklı olduğu için maalesef # 9 yakalamıyor ve% 99 veya% 95 oranında benzerlik eşiğinin nasıl uygulanacağını anlamak için yeterince iyi bilmiyorum. Bunun mümkün olup olmadığını bilen var mı?

dput(meta_articles.m) 
structure(list(ID = 1:9, Source.File = structure(c(1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("aaa", "aab"), class = "factor"), 
    Newspaper = structure(c(2L, 2L, 2L, 1L, 2L, 3L, 4L, 4L, 5L 
    ), .Label = c("Financial Times", "The Guardian", "The Mirror", 
    "The Sun", "The Times"), class = "factor"), Date = structure(c(2L, 
    2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("07.29.2002", 
    "07.30.2002"), class = "factor"), Length = c(561L, 426L, 
    206L, 964L, 500L, 43L, 196L, 140L, 794L), Article = structure(c(8L, 
    3L, 6L, 1L, 5L, 4L, 8L, 2L, 7L), .Label = c("A tough question at the heart..", 
    "ADDED VALUE", "Cash fine to clear elderly...", "IN BRIEF…", 
    "Media: 'We want van Hoogstr…", "Token victory for HIV mother", 
    "US-scientist questions", "US scientist questions"), class = "factor")), .Names = c("ID", 
"Source.File", "Newspaper", "Date", "Length", "Article"), class = "data.frame", row.names = c(NA, 
-9L)) 
+0

Eğer 'dput (meta_articles.m) sağlarsanız' Eğer Sen "için arama olabilir –

+0

daha detaylı yardım alabileceği örnek Bulanık eşleştirme "veya" kümeleme "- ancak bunun gibi hiçbir şey dplyr için yerleşik değildir. Karmaşık bir şey yapmak istemiyorsanız, tüm özel karakterleri kaldırabilir ve her şeyi küçük harfe dönüştürebilirsiniz. – akrun

+0

kısmi sonuçların bulunması için' grep' veya 'pmatch' veya' stringdist' kullanabilirsiniz – Gregor

cevap

1

Levenshtein mesafe metriğini veya buna benzer bir şey kullanmayı öneririm. Bu temelde 2 dizge arasındaki düzenleme mesafesidir. Mükemmel olmayacak, ama başlaman gerekecek.

burada hakkında daha fazla bilgi: https://stat.ethz.ch/R-manual/R-devel/library/utils/html/adist.html

Daha gelişmiş işlevler etkin bir şekilde gruplandırılması benzer sondaj kelimeleri izin soundex yöntemi de dahil stringdist paketinde bulunabilir. Ayrıca bakmaya değer de RecordLinkage paketidir.

Büyük bir örnek (dput) olmadan Uygulanabilir bir örnek sağlayamıyorum.

Düzenleme: adist(meta_articles.m$Article) bir benzerlik matrisi oluşturacaktır. diyagonal yok sayılması, size devam etmek isteyen olursa olsun benzerlik eşiği de değerlerini bulmak için matris ayrıştırabilir

d <- adist(meta_articles.m$Article) 
d2 <- d 
d2[d2 > 2] <- NA #set the limit at distance = 1 
d2 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA 0 NA 1 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] 0 NA NA NA NA NA 0 NA 1 
[8,] NA NA NA NA NA NA NA 0 NA 
[9,] 1 NA NA NA NA NA 1 NA 0 

Yani satır [1], kendisine özdeş aynıdır [7] ve 1 bir düzenleme mesafeden az

01: 2 veya daha az bir düzenleme mesafe ile birlikte tüm değerleri gruplama, nihayet

d <- adist(meta_articles.m$Article) 
rownames(d) <- meta_articles.m$Article 
hc <- hclust(as.dist(d)) 
plot(hc) 

dendogram

ve: [9], vb daha sonra, yani mesafeye göre kümeleme geçebiliriz

df <- data.frame(meta_articles.m$Article,cutree(hc,h=2)) 
df 

    meta_articles.m.Article cutree.hc..h...2. 
1   US scientist questions     1 
2 Cash fine to clear elderly...     2 
3 Token victory for HIV mother     3 
4 A tough question at the heart..     4 
5 Media: 'We want van Hoogstr…     5 
6      IN BRIEF…     6 
7   US scientist questions     1 
8      ADDED VALUE     7 
9   US-scientist questions     1 
+0

Çok teşekkürler! Henüz bütün problemimi çözmüyor ama gerçekten Levenshtein mesafesini gösteriyor.Önerdiğin paketlere bakacağım, umut verici görünüyorlar! – JonGrub

+0

@JonGrub, devam etmenizi kolaylaştırmak için birkaç düzenleme yaptı ... –

+0

Bizim için tanımlanmamış değişkenleri kullanıyorsunuz. 'Değerler 've' str' nedir? –