如何根据R中字符串中匹配的字数匹配字符串

如何根据R中字符串中匹配的字数匹配字符串,r,string,pattern-matching,string-matching,R,String,Pattern Matching,String Matching,我对R非常陌生,我正在尝试根据包含产品名称的字符串匹配R中的两个数据帧。品牌名称与产品名称位于不同的数组中。 对于不同的产品,变体通常位于字符串的末端,对于产品变体(即颜色),变体位于字符串的末端/中间 不幸的是,我收到了很多误报或不匹配的产品 使用levenshtein距离,这两个产品匹配为假阳性 品牌名称=[阿迪达斯正品],产品名称=[香蕉印刷罐] 顶部] 品牌名称=[阿迪达斯正品],产品名称=[香蕉印刷品] 短裤] 我目前使用的方法在得分方面没有区别 不同产品之间的差异 同一行(如上所示

我对R非常陌生,我正在尝试根据包含产品名称的字符串匹配R中的两个数据帧。品牌名称与产品名称位于不同的数组中。 对于不同的产品,变体通常位于字符串的末端,对于产品变体(即颜色),变体位于字符串的末端/中间

不幸的是,我收到了很多误报或不匹配的产品

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

    品牌名称=[阿迪达斯正品],产品名称=[香蕉印刷罐] 顶部]

    品牌名称=[阿迪达斯正品],产品名称=[香蕉印刷品] 短裤]

  • 我目前使用的方法在得分方面没有区别 不同产品之间的差异 同一行(如上所示),要么漏掉了很多产品,要么导致虚假回复

    品牌名称=[阿迪达斯正品],产品名称=[超级明星80年代黑色金属鞋头训练鞋]

    品牌名称=[阿迪达斯正品],产品名称=[超级明星超级彩色日光浴运动鞋]

我想知道是否有一种方法允许我根据匹配的子字符串(即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的帮助下)编辑:


source1.devices欢迎使用SO!我认为,如果您添加一些正确的匹配项/预期输出,将会有所帮助。发布数据的一种方法是复制
dput(head(source1.devices,10))
dput(head(source2.devices,10))
的输出,谢谢你的欢迎:)你的意思是,添加正确的匹配将“训练”我的评分算法并提高准确性吗?不,我相信他的意思是,将更多来自
store1.csv
store2.csv
的示例输入数据添加到您的帖子以及解决方案的理想输出中会有所帮助。这里的大多数读者快速扫描输入数据帧和请求输出数据帧,而不是阅读文本和冗长的代码示例。:)我们的目的是不知道你想要什么。您应该提供一个包含您想要获得的输出的小型数据集。请参阅以获得一些指导。感谢您让我知道(再次向SO表示歉意,我是新来的)。我已经在原始问题中添加了示例文件,并记录了编辑。谢谢欢迎来到SO!我认为,如果您添加一些正确的匹配项/预期输出,将会有所帮助。发布数据的一种方法是复制
dput(head(source1.devices,10))
dput(head(source2.devices,10))
的输出,谢谢你的欢迎:)你的意思是,添加正确的匹配将“训练”我的评分算法并提高准确性吗?不,我相信他的意思是,将更多来自
store1.csv
store2.csv
的示例输入数据添加到您的帖子以及解决方案的理想输出中会有所帮助。这里的大多数读者快速扫描输入数据帧和请求输出数据帧,而不是阅读文本和冗长的代码示例。:)我们的目的是不知道你想要什么。您应该提供一个包含您想要获得的输出的小型数据集。请参阅以获得一些指导。感谢您让我知道(再次向SO表示歉意,我是新来的)。我已经在原始问题中添加了示例文件,并记录了编辑。谢谢
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)