【发布时间】:2012-12-05 18:03:03
【问题描述】:
基于非文字比较的快速搜索方法
我正在对相当大的数据集(基本上所有字符串)进行小型搜索。表字段之间的关系很简单,尽管比较不能是字面的。即它应该能够关联“filippo”、“philippo”、“filipo”等等。
我找到了一些可以做到的方法,经常在 Levinstein 距离上绊倒(this、here 和 here),但我不确定它在我的具体情况下是否实用。
简而言之,我有两个表,一个带有“搜索键”的小表和一个更大的表,应该在其中执行搜索。两个表具有相同的字段,并且它们都具有相同的“含义”。例如
KEYS_TABLE
# | NAME | MIDNAME | SURNAME | ADDRESS | PHONE
1 | John | Fake | Doe | Sesame St. | 333-12-32
2 | Ralph | Stue | Michel | Bart. Ghost St. | 778-13000
...
和
SEARCH_TABLE
# | NAME | MIDNAME | SURNAME | ADDRESS | PHONE
...
532 | Jhon | F. | Doe | Sesame Street | 3331232
...
999 | Richard | Dalas | Doe | Sesame St. | 333-12-32
我想要做的就是获取某种度量,或者为KEYS_TABLE 上的每个给定记录排名,报告来自SEARCH_TABLE 的所有记录高于某个相关性(由度量定义或只是一些“KNN”类似方法)。
我说莱文斯坦距离可能不实用,因为它需要计算KEYS_TABLE x SEARCH_TABLE 中每一行中的每个字段。考虑到SEARCH_TABLE 有大约 4 亿条记录,KEYS_TABLE 从 100k 到 100 万条记录不等,结果数字太大了。
我希望有一些方法可以让我之前丰富这两个表,或者一些更简单(更便宜)的方法来执行搜索。
值得一提的是,我可以随意转换数据。例如将St. 标准化为st,将Street 标准化为st,删除特殊字符等等。
我的选择是什么?
【问题讨论】:
标签: algorithm search-engine string-comparison levenshtein-distance text-analysis