基于非文字比较的快速搜索方式

时间:2012-12-05 18:03:03

标签: algorithm search-engine string-comparison levenshtein-distance text-analysis

基于非文字比较的快速搜索方式

我正在开发一个针对相当大的数据集的小搜索,基本上所有字符串。表字段之间的关系很简单,但比较不能是文字。即它应该能够关联“filippo”,“philippo”,“filipo”等等。

我找到了一些可以做到的方法,经常在Levinstein距离上遇到绊脚(thisherehere),虽然我不确定它是否可行具体案例。

简而言之,我有两个表,一个带有“搜索键”的小表和一个应该执行搜索的更大表。两个表都具有相同的字段,它们都具有相同的“含义”。 E.g。

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”之类的方法)。

我说Levinstein距离可能不实用,因为它需要计算KEYS_TABLE x SEARCH_TABLE中每一行的每个字段。考虑到SEARCH_TABLE有大约4亿条记录且KEYS_TABLE从10万到1密耳不等,结果数字太大了。

我希望以前可以通过某种方式丰富两种表格,或者使用更简单(更便宜)的方式来执行搜索。

值得一提的是,我可以随意转换数据。例如将St.标准化为st,将Street标准化为st,删除特殊字符,依此类推。

我的选择是什么?

2 个答案:

答案 0 :(得分:0)

我能想到的一种方法(启发式!)是:

除了表格中的原始字段外,每个字段还存储由某些stemming算法获得的规范化格式。如果您使用的是java,那么lucene的EnglishAnalyzer可能会帮助您完成此步骤。

使用标准方法进行精确比较,为table1候选人列表中的每个条目查找。 e2中的条目table2将成为e1table1条目的候选条件,如果它们具有标准格式与常规格式匹配的公共字段。这可以通过一些允许快速字符串搜索的数据结构有效地完成 - 有很多这些。

对于e1中的每个条目 - 使用您选择的精确指标(例如建议的leneshtein距离)在列表中找到它的“最佳”候选者

您可能希望进行一些后期处理,以确保table1中没有两个元素映射到table2中的同一元素,如果这是一个问题。

答案 1 :(得分:0)

根据可能出现的拼写错误,您可以使用Soundex或Metaphone进行搜索。