我如何匹配部分字符串/有更好的方法吗?

时间:2013-09-18 20:11:18

标签: python string api dictionary

我通过Expedia API提取酒店名称,并与其他旅行服务提供商交叉引用结果。

我遇到的问题是Expedia API上的许多酒店名称与其他提供商的名称不同,我无法找到匹配它们的好方法。

我将两者的结果存储在单独的房间中。因此,例如,Expedia搜索立陶宛维尔纽斯的结果可能如下所示:

expediadict = {'Ramada Hotel & Suites Vilnius': 120, 'Hotel Rinno': 100,
'Vilnius Comfort Hotel': 110}

但是其他提供商的结果可能如下所示:

altproviderdict = {'Ramada Vilnius': 120, 'Rinno Hotel': 100, 
'Comfort Hotel LT': 110}

我唯一想到的就是剥离“酒店”,“维尔纽斯”,“LT”和“立陶宛”的所有实例,然后测试expediadict键的一部分是否与altprovderdict键的一部分匹配。这看起来很乱,而且不是很Pythonic,所以我想知道你们中是否有人有更清洁的想法?

2 个答案:

答案 0 :(得分:2)

>>> def simple_clean(word):
...     return word.lower().replace(" ","").replace("hotel","")
... 
>>> a = "Ramada Hotel & Suites Vilnius"
>>> b = "Hotel Ramada Suites Vilnous"
>>> a = simple_clean(a)
>>> b = simple_clean(b)
>>> a
'ramada&suitesvilnius'
>>> b
'ramadasuitesvilnous'
>>> import difflib
>>> difflib.SequenceMatcher(None,a,b).ratio()
0.9230769230769231
  1. 对单词进行清理和规范化:例如。删除酒店,度假村等词语 ,并转换为小写,没有空格等

  2. 然后使用像leveinstein这样的模糊字符串匹配算法,例如来自difflib模块。

  3. 这种方法非常原始,只是一个例子,您可以根据自己的需要对其进行增强,以获得最佳效果。

答案 1 :(得分:1)

如果您只想在单词以相同顺序出现时匹配名称,您可能需要使用一些最常见的子序列算法,就像在diff工具中使用的那样。但是用文字而不是字符或线条。

如果顺序不重要,则更简单:将名称的所有单词放入如下集合中:

set(name.split())

并且为了匹配两个名称,请测试这两个集合中intersection的大小。或者测试symmetric_difference是否只包含不重要的单词。