匹配两个列表之间的字符串

时间:2016-06-29 11:46:01

标签: r string

我有两个列表,一个是客户列表,另一个是客户编号列表。我想匹配客户名称并返回其客户编号。

在两个列表之间匹配Customer字符串的最佳方法是什么?

请注意,名称可能不完全匹配,因此'公司名称公司' /'公司注册' /'公司名称公司' /' COMPANYNAME Inc' ...

是否有任何能提供最佳匹配的命令?

由于 加文

2 个答案:

答案 0 :(得分:1)

为了匹配不完全相同的字符串,我将指向stringdist{}包。特别是,该包中的amatch函数应该会有所帮助。这是文档的链接:

https://cran.r-project.org/web/packages/stringdist/stringdist.pdf

某些能够重现数据帧小版本的代码会很有用,但我创建了这么短的代码。它首先根据您列出的几个名称创建两个字符串。然后我从中创建了两个数据帧。

install.packages("stringdist")
library(stringdist)

names_1 <- c("Apple Ltd", "PearLtd", "Banana Co Ltd")
names_2 <- c("Pear Limited", "Banana ltd", "Appl Ltd")
cust_num <- c(10001, 10002, 10003)
df_1 <- data.frame(names_1)
df_2 <- data.frame(names_2, cust_num)

best_match <- na.omit(amatch(df_2$names_2, df_1$names_1, maxDist = 4))

df_2$cust_num[best_match]

最后一行只输出两个列表中找到的公司名称的客户ID矢量。

文档将解释amatch的参数,但是您会遇到maxDist的问题 - 设置得太低,您的公司名称也不匹配。设置得太高,你会得到误报。您可以看到在此示例中发生的情况,其中只返回两个ID,因为“Pear Limited”距离“PearLtd”太远。

答案 1 :(得分:0)

这是一个非常深刻和复杂的主题。除了Matt Sandgren的回答之外,您可能还想查看内置于R的adist函数,并给出Levenshtein距离IIRC。如果你是字符串匹配的新手,你可能还想尝试一些其他的东西:

  • 小写你能做的一切
  • 删除标点符号
  • 删除您知道无效的字词(Inc,Incorporation,LLC,LTD等)
  • 尝试加权这些术语(例如,如果你有30%的企业在名称中加上'烧烤'这个词,它可能是一个不那么多汁的术语来匹配而不是'tequileria',发生在.01%),以及看看“余弦相似度”(这里可以找到一个非常彻底的处理:http://nlp.stanford.edu/IR-book/html/htmledition/dot-products-1.html

如果你只是想对一些比赛进行排名,这是一回事,但如果假阴性/肯定是一个问题那么这就是另一个问题!取决于问题...