1

我正在通过 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}

我能想到的唯一一件事就是去掉“Hotel”、“Vilnius”、“LT”和“Lithuania”的所有实例,然后测试 expediadict 键的一部分是否与 altprovderdict 键的一部分匹配。这看起来很乱,而且不是很 Pythonic,所以我想知道你们中是否有人有更清晰的想法?

4

2 回答 2

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. 对单词进行清理和规范化:例如。删除 Hotel,The,Resort 等单词,并转换为不带空格的小写字母等

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

此方法非常原始,只是一个示例,您可以对其进行增强以满足您对最佳结果的需求。

于 2013-09-18T20:15:54.383 回答
1

如果您只想在单词以相同顺序出现时匹配名称,您可能需要使用一些最长的公共子序列算法,就像在 diff 工具中使用的那样。但用词代替字符或行。

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

set(name.split())

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

于 2013-09-18T20:29:07.873 回答