如何根据R中字符串中匹配单词的数量来匹配字符串

时间:2016-05-15 19:37:07

标签: r string pattern-matching string-matching

我是R的新手,我正在尝试根据包含产品名称的字符串匹配R中的两个DataFrame。品牌名称与产品名称位于不同的数组中。 对于不同的产品和产品变化(即颜色)的结束/中间,通常变化位于字符串的末端。

不幸的是,我收到了许多不符合的误报或产品。

  • 使用levenshtein距离,这两种产品匹配为假阳性

    品牌名称= [ADIDAS ORIGINALS],产品名称= [香蕉印刷罐 顶部]

    品牌名称= [ADIDAS ORIGINALS],产品名称= [香蕉印花 短裤]

  • 我目前使用的方法在评分方面没有区别 在产品之间的变化和不同的产品 相同的一行(如上所示)要么错过很多产品,要么导致错误的积极性

    品牌名称= [ADIDAS ORIGINALS],产品名称= [Superstar 80s Black Metal Toe Cap Trainers]

    品牌名称= [ADIDAS ORIGINALS],产品名称= [Superstar Super Color Sun Glow Trainers]

我想知道是否有一种方法允许我根据匹配的子字符串(即4/5 匹配)对字符串进行评分,而不是传统的字符串匹配技术或分配不同的方法在字符串末尾加权变量以解决我的问题。

商店1

Brand store1      Prod.name store1
Adidas Originals  Bananas Print Tank Top
Adidas Originals  Bananas Print Shorts
Oasis             Geo Lace Drape Cardigan
Michael Kors      Hamilton Saffiano Leather Tote
Phase Eight       Analise Print Dress
Indulgence        Red maxi dress

商店2

Brand store2      Prod.name store2
Adidas Originals  Bananas Print Tank Top
Adidas Originals  Superstar Super Colour Sun Glow Trainers
Oasis             Geo Lace Drape Cardigan
Michael Kors      Hamilton Saffiano Leather Tote
Phase Eight       Analise Print Dress
Indulgence        Red maxi dress

我想如何匹配它们

Brand store1      Prod.name store1               Prod.name store2
Adidas Originals  Bananas Print Tank Top         Bananas Print Tank Top
Adidas Originals  Bananas Print Shorts           NULL
Oasis             Geo Lace Drape Cardigan        Geo Lace Drape Cardigan
Michael Kors      Hamilton Saffiano Leather Tote Hamilton Saffiano Leather Tote
Phase Eight       Analise Print Dress            Analise Print Dress
Indulgence        Red maxi dress                 Red maxi dress

以下是我正在使用的代码(在r-bloggers的帮助下) - 编辑: sample files

source1.devices<-read.csv('store1.csv')
source2.devices<-read.csv('store2.csv')

source1.devices$name<-as.character(store1.csv$prod.name)
source2.devices$name<-as.character(store2.csv$prod.name)

dist.name<-adist(store1.csv$prod.name,store2.csv$prod.name, partial = TRUE, ignore.case = TRUE)

min.name<-apply(dist.name, 1, min)

match.s1.s2<-NULL  
for(i in 1:nrow(dist.name))
{
    s2.i<-match(min.name[i],dist.name[i,])
    s1.i<-i
    match.s1.s2<-rbind(data.frame(s2.i=s2.i,s1.i=s1.i,s2name=store2.csv[s2.i,]$prod.name, s1name=store1.csv[s1.i,]$prod.name, adist=min.name[i]),match.s1.s2)
}

View(match.s1.s2)

0 个答案:

没有答案