我有一个多维的模糊字符串匹配问题:
“假设公司名”和“公司名”中包含变量。简化的子集可能如下所示:
pd.DataFrame(columns = ["Company name", "Ticker", "Country"],
data = [["Vestas Wind Systems", "VWS.CO", "Denmark"],
["Vestas", "VWS", "Denmark"],
["Vestas Wind", "VWS", np.nan],
["Amazon.com Inc", np.nan, "United States of America"],
["AMAZONIA", "BAZA3 BZ", "Brazil"],
["AMAZON.COM", "AMZN US", "United States"]])
整个数据帧将包含几十万行。在
我想要的是确定数据帧中的公司,它们是相同的。 在这种情况下,这意味着确定第0、1、2行都是“Vestas Wind Systems”公司的不同表述,第3、5行都代表亚马逊网站Inc”和第4行代表“Amazonia”。在
为了增加正确匹配的机会,我假设最好使用这三列的信息。在
然而,这三个栏目都需要通过模糊逻辑进行比较:公司、股票市场和国家都可能以不同的方式书写。E、 g.“维斯塔斯风电系统”对“维斯塔斯”或“美利坚合众国”对“美国”。在
另一个复杂性是Ticker和Country列都可能包含NaN值(公司名称从不为null)。在
问题1:解决这个问题的理想方法是什么?
我目前的计划:
我想通过利用这三个专栏的信息来匹配公司。列之间的实体越相似,匹配的概率就越高。此外,每一列应该有不同的权重:仅仅因为两家公司都在美国,并不意味着它们是同一家公司。例如,Country列的权重应该很低。在
目前我尝试在每个列上使用相似的模糊表示法。这将产生如下结果,其中分数表示字符串的相似性:
^{pr2}$pd.DataFrame(columns = ["Ticker 1", "Ticker 2", "Score"],
data = [["vws.co", "vws", 0.8],
["baza3 bz", "amzn us", 0.6],
["vws", "amzn us", 0.4],
["vws.co", "amzn us", 0.35],
["baza3 bz", "vws.co", 0.3],
["baza3 bz", "vws", 0.28]])
pd.DataFrame(columns = ["Country 1", "Country 2", "Score"],
data = [["united states", "united states of america", 0.8],
["brazil", "denmark", 0.3],
["brazil", "united states", 0.28],
["brazil", "united states of america", 0.26],
["denmark", "united states", 0.25],
["denmark", "united states of america", 0.23]])
NB:我意识到我应该在模糊匹配之前通过正则表达式进行一些简单的字符串清理,但是为了简单起见,让我们假设我已经完成了这项工作。同样,在上面的结果中,我已经将所有字符串转换为小写。在
所以现在我有了不同栏目的相似度得分。然后,我想使用这些相似性来识别初始数据帧的哪些行表示相同的公司。如前所述,我希望对列相似性应用不同的权重:假设我要使用以下权重:
weights = {"Company name" : 0.45, "Ticker" : 0.45, "Country" : 0.1}
也就是说,当比较数据帧中的任何两行时,它们的相似度得分为
similarity_score = 0.45 * Company Name similarity score + 0.45 * Ticker Name similarity score + 0.1 * Country similarity score
例如第0行和第1行的相似度得分为:
similarity_score_0_1 = 0.45 * 0.75 + 0.45 * 0.8 + 0.1 * 1.0 = 0.7975
当某些行的tickers和/或countries的值为空时,这当然会成为一个问题。在
最后,当我在数据帧中有几十万行时,计算所有行之间的相似性分数变得非常耗时。在
问题2:如何以最有效的方式实现这一目标?
目前没有回答
相关问题 更多 >
编程相关推荐